diff --git a/res/scripts/stdlib.lua b/res/scripts/stdlib.lua index d8397f57..d00f34b5 100644 --- a/res/scripts/stdlib.lua +++ b/res/scripts/stdlib.lua @@ -180,6 +180,10 @@ function Document.new(docname) }) end +_GUI_ROOT = Document.new("core:root") +_MENU = _GUI_ROOT.menu +menu = _MENU + -- Deprecated functions block_index = block.index block_name = block.name diff --git a/src/engine.cpp b/src/engine.cpp index 9d1543ea..f1d0665e 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -1,5 +1,40 @@ #include "engine.h" +#define GLEW_STATIC + +#include "assets/Assets.h" +#include "assets/AssetsLoader.h" +#include "audio/audio.h" +#include "coders/GLSLExtension.h" +#include "coders/json.h" +#include "coders/png.h" +#include "content/Content.h" +#include "content/ContentLoader.h" +#include "content/ContentPack.h" +#include "core_defs.h" +#include "files/engine_paths.h" +#include "files/files.h" +#include "frontend/locale/langs.h" +#include "frontend/menu/menu.h" +#include "frontend/screens.h" +#include "frontend/UiDocument.h" +#include "graphics/core/Batch2D.h" +#include "graphics/core/GfxContext.h" +#include "graphics/core/ImageData.h" +#include "graphics/core/Shader.h" +#include "graphics/ui/GUI.h" +#include "graphics/ui/elements/UINode.h" +#include "graphics/ui/elements/containers.h" +#include "logic/scripting/scripting.h" +#include "util/platform.h" +#include "voxels/DefaultWorldGenerator.h" +#include "voxels/FlatWorldGenerator.h" +#include "window/Camera.h" +#include "window/Events.h" +#include "window/input.h" +#include "window/Window.h" +#include "world/WorldGenerators.h" + #include #include #include @@ -8,40 +43,6 @@ #include #include #include -#define GLEW_STATIC - -#include "audio/audio.h" -#include "assets/Assets.h" -#include "assets/AssetsLoader.h" -#include "world/WorldGenerators.h" -#include "voxels/DefaultWorldGenerator.h" -#include "voxels/FlatWorldGenerator.h" -#include "window/Window.h" -#include "window/Events.h" -#include "window/Camera.h" -#include "window/input.h" -#include "graphics/core/Batch2D.h" -#include "graphics/core/GfxContext.h" -#include "graphics/core/Shader.h" -#include "graphics/core/ImageData.h" -#include "graphics/ui/GUI.h" -#include "frontend/screens.h" -#include "frontend/menu/menu.h" -#include "util/platform.h" - -#include "coders/json.h" -#include "coders/png.h" -#include "coders/GLSLExtension.h" -#include "files/files.h" -#include "files/engine_paths.h" - -#include "content/Content.h" -#include "content/ContentPack.h" -#include "content/ContentLoader.h" -#include "frontend/locale/langs.h" -#include "logic/scripting/scripting.h" - -#include "core_defs.h" namespace fs = std::filesystem; @@ -63,8 +64,6 @@ Engine::Engine(EngineSettings& settings, EnginePaths* paths) audio::create_channel("ui"); auto resdir = paths->getResources(); - scripting::initialize(this); - std::cout << "-- loading assets" << std::endl; std::vector roots {resdir}; @@ -92,6 +91,18 @@ Engine::Engine(EngineSettings& settings, EnginePaths* paths) } setLanguage(settings.ui.language); addWorldGenerators(); + onAssetsLoaded(); + + scripting::initialize(this); +} + +void Engine::onAssetsLoaded() { + assets->store(new UiDocument( + "core:root", + uidocscript {}, + std::dynamic_pointer_cast(gui->getContainer()), + nullptr + ), "core:root"); } void Engine::updateTimers() { @@ -236,6 +247,7 @@ void Engine::loadContent() { } } assets->extend(*new_assets.get()); + onAssetsLoaded(); } void Engine::loadWorldContent(const fs::path& folder) { diff --git a/src/engine.h b/src/engine.h index b48bbe02..9545efdf 100644 --- a/src/engine.h +++ b/src/engine.h @@ -56,6 +56,8 @@ public: /// Automatically sets MenuScreen void mainloop(); + /// @brief Called after assets loading when all engine systems are initialized + void onAssetsLoaded(); /// @brief Set screen (scene). /// nullptr may be used to delete previous screen before creating new one, diff --git a/src/graphics/ui/GUI.cpp b/src/graphics/ui/GUI.cpp index 273f021c..ad2dfa53 100644 --- a/src/graphics/ui/GUI.cpp +++ b/src/graphics/ui/GUI.cpp @@ -22,6 +22,7 @@ GUI::GUI() { uicamera->flipped = true; menu = std::make_shared(); + menu->setId("menu"); container->add(menu); container->setScrollable(false); } diff --git a/src/graphics/ui/elements/containers.cpp b/src/graphics/ui/elements/containers.cpp index 33a83086..63a9d430 100644 --- a/src/graphics/ui/elements/containers.cpp +++ b/src/graphics/ui/elements/containers.cpp @@ -285,6 +285,10 @@ Page& PagesControl::getCurrent() { return current; } +const std::string& PagesControl::getCurrentName() const { + return curname; +} + void PagesControl::clearHistory() { pageStack = std::stack(); } diff --git a/src/graphics/ui/elements/containers.h b/src/graphics/ui/elements/containers.h index d947b57d..9ea0802c 100644 --- a/src/graphics/ui/elements/containers.h +++ b/src/graphics/ui/elements/containers.h @@ -107,6 +107,7 @@ namespace gui { void reset(); Page& getCurrent(); + const std::string& getCurrentName() const; }; } #endif // GRAPHICS_UI_ELEMENTS_CONTAINERS_H_ diff --git a/src/graphics/ui/gui_util.cpp b/src/graphics/ui/gui_util.cpp index 23c6c42c..5f10b8db 100644 --- a/src/graphics/ui/gui_util.cpp +++ b/src/graphics/ui/gui_util.cpp @@ -7,6 +7,7 @@ #include "../../logic/scripting/scripting.h" #include "../../frontend/locale/langs.h" +#include "../../util/stringutil.h" #include "../../delegates.h" using namespace gui; @@ -25,13 +26,11 @@ std::shared_ptr" + )); } std::shared_ptr guiutil::create(const std::string& source) { diff --git a/src/logic/scripting/lua/libgui.cpp b/src/logic/scripting/lua/libgui.cpp index 7f981c11..cfbc1013 100644 --- a/src/logic/scripting/lua/libgui.cpp +++ b/src/logic/scripting/lua/libgui.cpp @@ -104,6 +104,16 @@ static bool getattr(lua_State* L, gui::FullCheckBox* box, const std::string& att return false; } +static bool getattr(lua_State* L, gui::PagesControl* menu, const std::string& attr) { + if (menu == nullptr) + return false; + if (attr == "page") { + lua_pushstring(L, menu->getCurrentName().c_str()); + return true; + } + return false; +} + static bool getattr(lua_State* L, gui::TextBox* box, const std::string& attr) { if (box == nullptr) return false; @@ -162,6 +172,21 @@ static bool setattr(lua_State* L, gui::Label* label, const std::string& attr) { return false; } +static bool setattr(lua_State* L, gui::PagesControl* menu, const std::string& attr) { + if (menu == nullptr) + return false; + if (attr == "page") { + auto page = lua_tostring(L, 4); + if (menu->has(page)) { + menu->setPage(page); + } else { + menu->setPage("404"); + } + return true; + } + return false; +} + static int l_gui_getattr(lua_State* L) { auto docname = lua_tostring(L, 1); auto element = lua_tostring(L, 2); @@ -194,6 +219,8 @@ static int l_gui_getattr(lua_State* L) { return 1; if (getattr(L, dynamic_cast(node), attr)) return 1; + if (getattr(L, dynamic_cast(node), attr)) + return 1; return 0; } @@ -232,6 +259,8 @@ static int l_gui_setattr(lua_State* L) { return 0; if (setattr(L, dynamic_cast(node), attr)) return 0; + if (setattr(L, dynamic_cast(node), attr)) + return 0; } return 0; }