diff --git a/src/coders/BasicParser.inl b/src/coders/BasicParser.inl index 7af27fe5..796205b2 100644 --- a/src/coders/BasicParser.inl +++ b/src/coders/BasicParser.inl @@ -139,8 +139,12 @@ void BasicParser::skipLine() { template void BasicParser::skipEmptyLines() { + if (!hasNext()) { + return; + } + size_t initpos = pos; skipWhitespace(); - pos = linestart; + pos = std::max(initpos, linestart); } template diff --git a/src/coders/yaml.cpp b/src/coders/yaml.cpp index b10d5ce2..f400f667 100644 --- a/src/coders/yaml.cpp +++ b/src/coders/yaml.cpp @@ -38,7 +38,7 @@ static dv::value perform_literal(std::string_view literal) { literal == "false" || literal == "False") { return literal[0] == 't'; } - if (literal == "null" || literal == "Null") { + if (literal == "null" || literal == "Null" || literal == "~") { return nullptr; } return std::string(literal); @@ -204,8 +204,9 @@ dv::value Parser::parseFullValue(int indent) { skipEmptyLines(); int init_pos = pos; int next_indent = countIndent(); - if (next_indent < indent) { - throw error("indentation error"); + if (next_indent <= indent) { + pos = init_pos; + return nullptr; } if (source[pos] == '-') { pos = init_pos; @@ -269,6 +270,10 @@ dv::value Parser::parseArray(int indent) { dv::value object = dv::object(); object[std::string(name)] = parseFullValue(next_indent); skipEmptyLines(); + if (!hasNext()) { + list.add(std::move(object)); + break; + } next_indent = countIndent(); if (next_indent > indent) { pos = linestart; diff --git a/src/graphics/ui/elements/TextBox.cpp b/src/graphics/ui/elements/TextBox.cpp index 81732348..c9afde7f 100644 --- a/src/graphics/ui/elements/TextBox.cpp +++ b/src/graphics/ui/elements/TextBox.cpp @@ -661,7 +661,7 @@ int TextBox::calcIndexAt(int x, int y) const { line = std::min(line, label->getLinesNumber() - 1); size_t lineLength = getLineLength(line); uint offset = 0; - while (lcoord.x + rawTextCache.metrics.calcWidth(labelText, offset) < x && + while (lcoord.x + rawTextCache.metrics.calcWidth(labelText, 0, offset) < x && offset < lineLength - 1) { offset++; } diff --git a/src/graphics/ui/gui_xml.cpp b/src/graphics/ui/gui_xml.cpp index 930aef34..18d0fa4b 100644 --- a/src/graphics/ui/gui_xml.cpp +++ b/src/graphics/ui/gui_xml.cpp @@ -8,19 +8,17 @@ #include "elements/Button.hpp" #include "elements/Canvas.hpp" #include "elements/CheckBox.hpp" -#include "elements/TextBox.hpp" -#include "elements/SplitBox.hpp" -#include "elements/TrackBar.hpp" -#include "elements/SelectBox.hpp" #include "elements/Image.hpp" #include "elements/InlineFrame.hpp" #include "elements/InputBindBox.hpp" #include "elements/InventoryView.hpp" #include "elements/Menu.hpp" +#include "elements/ModelViewer.hpp" #include "elements/Panel.hpp" +#include "elements/SelectBox.hpp" +#include "elements/SplitBox.hpp" #include "elements/TextBox.hpp" #include "elements/TrackBar.hpp" -#include "elements/ModelViewer.hpp" #include "engine/Engine.hpp" #include "frontend/locale.hpp" #include "frontend/menu.hpp" @@ -197,7 +195,10 @@ static void read_uinode( } static void read_container_impl( - UiXmlReader& reader, const xml::xmlelement& element, Container& container + UiXmlReader& reader, + const xml::xmlelement& element, + Container& container, + bool subnodes ) { read_uinode(reader, element, container); @@ -207,6 +208,9 @@ static void read_container_impl( if (element.has("scroll-step")) { container.setScrollStep(element.attr("scroll-step").asInt()); } + if (!subnodes) { + return; + } for (auto& sub : element.getElements()) { if (sub->isText()) continue; auto subnode = reader.readUINode(*sub); @@ -219,7 +223,7 @@ static void read_container_impl( void UiXmlReader::readUINode( UiXmlReader& reader, const xml::xmlelement& element, Container& container ) { - read_container_impl(reader, element, container); + read_container_impl(reader, element, container, true); } void UiXmlReader::readUINode( @@ -229,11 +233,9 @@ void UiXmlReader::readUINode( } static void read_base_panel_impl( - UiXmlReader& reader, - const xml::xmlelement& element, - BasePanel& panel + UiXmlReader& reader, const xml::xmlelement& element, BasePanel& panel ) { - read_uinode(reader, element, panel); + read_container_impl(reader, element, panel, false); if (element.has("padding")) { glm::vec4 padding = element.attr("padding").asVec4(); @@ -244,7 +246,7 @@ static void read_base_panel_impl( )); } if (element.has("orientation")) { - auto &oname = element.attr("orientation").getText(); + auto& oname = element.attr("orientation").getText(); if (oname == "horizontal") { panel.setOrientation(Orientation::horizontal); } @@ -348,7 +350,7 @@ static std::shared_ptr read_container( UiXmlReader& reader, const xml::xmlelement& element ) { auto container = std::make_shared(reader.getGUI(), glm::vec2()); - read_container_impl(reader, element, *container); + read_container_impl(reader, element, *container, true); return container; } @@ -365,8 +367,7 @@ static std::shared_ptr read_split_box( ); read_base_panel_impl(reader, element, *splitBox); for (auto& sub : element.getElements()) { - if (sub->isText()) - continue; + if (sub->isText()) continue; auto subnode = reader.readUINode(*sub); if (subnode) { splitBox->add(subnode); @@ -379,15 +380,15 @@ static std::shared_ptr read_model_viewer( UiXmlReader& reader, const xml::xmlelement& element ) { auto model = element.attr("src", "").getText(); - auto viewer = std::make_shared( - reader.getGUI(), glm::vec2(), model - ); - read_container_impl(reader, element, *viewer); + auto viewer = + std::make_shared(reader.getGUI(), glm::vec2(), model); + read_container_impl(reader, element, *viewer, true); if (element.has("center")) { viewer->setCenter(element.attr("center").asVec3()); } if (element.has("cam-rotation")) { - viewer->setRotation(glm::radians(element.attr("cam-rotation").asVec3())); + viewer->setRotation(glm::radians(element.attr("cam-rotation").asVec3()) + ); } return viewer; } @@ -450,7 +451,8 @@ static std::shared_ptr read_select( } auto value = elem->attr("value").getText(); auto text = parse_inner_text(*elem, reader.getContext()); - options.push_back(SelectBox::Option {std::move(value), std::move(text)}); + options.push_back(SelectBox::Option {std::move(value), std::move(text)} + ); } if (element.has("selected")) { @@ -485,10 +487,9 @@ static std::shared_ptr read_select( element.attr("onselect").getText(), reader.getFilename() ); - selectBox->listenChange( - [callback=std::move(callback)](GUI&, const std::string& value) { - callback(value); - }); + selectBox->listenChange([callback = std::move(callback)]( + GUI&, const std::string& value + ) { callback(value); }); } read_panel_impl(reader, element, *selectBox, false); return selectBox; @@ -539,7 +540,7 @@ static std::shared_ptr read_text_box( ); textbox->setHint(hint); - read_container_impl(reader, element, *textbox); + read_container_impl(reader, element, *textbox, true); if (element.has("padding")) { glm::vec4 padding = element.attr("padding").asVec4(); textbox->setPadding(padding); @@ -839,7 +840,7 @@ static std::shared_ptr read_page_box( auto& gui = reader.getGUI(); auto menu = std::make_shared(gui); menu->setPageLoader(gui.getMenu()->getPageLoader()); - read_container_impl(reader, element, *menu); + read_container_impl(reader, element, *menu, true); return menu; } @@ -849,14 +850,15 @@ static std::shared_ptr read_iframe( ) { auto& gui = reader.getGUI(); auto iframe = std::make_shared(gui); - read_container_impl(reader, element, *iframe); + read_container_impl(reader, element, *iframe, true); std::string src = element.attr("src", "").getText(); iframe->setSrc(src); return iframe; } -UiXmlReader::UiXmlReader(gui::GUI& gui, scriptenv&& env) : gui(gui), env(std::move(env)) { +UiXmlReader::UiXmlReader(gui::GUI& gui, scriptenv&& env) + : gui(gui), env(std::move(env)) { contextStack.emplace(""); add("image", read_image); add("canvas", read_canvas); diff --git a/src/logic/scripting/lua/libs/libbyteutil.cpp b/src/logic/scripting/lua/libs/libbyteutil.cpp index 448212e7..603bdc2d 100644 --- a/src/logic/scripting/lua/libs/libbyteutil.cpp +++ b/src/logic/scripting/lua/libs/libbyteutil.cpp @@ -137,7 +137,7 @@ static int l_unpack(lua::State* L) { for (size_t i = 0; format[i]; i++) { switch (format[i]) { case 'b': - lua::pushinteger(L, reader.get()); + lua::pushinteger(L, static_cast(reader.get())); break; case 'B': lua::pushinteger(L, reader.get() & 0xFF); diff --git a/src/logic/scripting/lua/libs/libgeneration.cpp b/src/logic/scripting/lua/libs/libgeneration.cpp index e215b4fb..5c060382 100644 --- a/src/logic/scripting/lua/libs/libgeneration.cpp +++ b/src/logic/scripting/lua/libs/libgeneration.cpp @@ -44,7 +44,7 @@ static int l_create_fragment(lua::State* L) { static int l_load_fragment(lua::State* L) { dv::value map; - if (!lua::isstring(L, 1)) { + if (lua::isstring(L, 1)) { io::path path = lua::require_string(L, 1); if (!io::exists(path)) { throw std::runtime_error("file "+path.string()+" does not exist"); diff --git a/src/logic/scripting/scripting.cpp b/src/logic/scripting/scripting.cpp index 997b5f82..4d3672f1 100644 --- a/src/logic/scripting/scripting.cpp +++ b/src/logic/scripting/scripting.cpp @@ -182,7 +182,6 @@ std::unique_ptr scripting::start_coroutine(const io::path& script) { lua::pushstring(L, pack.id); lua::setfield(L, "PACK_ID"); - lua::dump_stack(L); if(!lua::getglobal(L, "__vc__pack_envs")) { lua::createtable(L, 0, 0); lua::setglobal(L, "__vc__pack_envs");