From 4c48afbb9023e17b508c8a333a1f5a13e8158d17 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Fri, 7 Mar 2025 18:19:56 +0300 Subject: [PATCH] refactor: add GUI instance reference to UI nodes --- src/assets/AssetsLoader.cpp | 15 +- src/assets/AssetsLoader.hpp | 15 +- src/assets/assetload_funcs.cpp | 1 + src/engine/Engine.cpp | 43 ++-- src/engine/Engine.hpp | 27 ++- src/frontend/UiDocument.cpp | 8 +- src/frontend/UiDocument.hpp | 4 +- src/frontend/debug_panel.cpp | 59 +++--- src/frontend/hud.cpp | 60 +++--- src/frontend/hud.hpp | 6 +- src/frontend/menu.cpp | 97 +++++---- src/frontend/menu.hpp | 2 +- src/frontend/screens/LevelScreen.cpp | 40 ++-- src/frontend/screens/LevelScreen.hpp | 7 + src/frontend/screens/MenuScreen.cpp | 5 +- src/graphics/ui/GUI.cpp | 104 ++++++---- src/graphics/ui/GUI.hpp | 11 +- src/graphics/ui/elements/BasePanel.hpp | 3 +- src/graphics/ui/elements/Button.cpp | 37 ++-- src/graphics/ui/elements/Button.hpp | 20 +- src/graphics/ui/elements/Canvas.cpp | 3 +- src/graphics/ui/elements/Canvas.hpp | 2 +- src/graphics/ui/elements/CheckBox.cpp | 21 +- src/graphics/ui/elements/CheckBox.hpp | 19 +- src/graphics/ui/elements/Container.cpp | 10 +- src/graphics/ui/elements/Container.hpp | 8 +- src/graphics/ui/elements/Image.cpp | 34 ++-- src/graphics/ui/elements/Image.hpp | 2 +- src/graphics/ui/elements/InputBindBox.cpp | 8 +- src/graphics/ui/elements/InputBindBox.hpp | 14 +- src/graphics/ui/elements/InventoryView.cpp | 23 +-- src/graphics/ui/elements/InventoryView.hpp | 11 +- src/graphics/ui/elements/Label.cpp | 8 +- src/graphics/ui/elements/Label.hpp | 4 +- src/graphics/ui/elements/Menu.cpp | 2 +- src/graphics/ui/elements/Menu.hpp | 2 +- src/graphics/ui/elements/Panel.cpp | 24 +-- src/graphics/ui/elements/Panel.hpp | 9 +- src/graphics/ui/elements/Plotter.hpp | 26 ++- src/graphics/ui/elements/SplitBox.cpp | 8 +- src/graphics/ui/elements/SplitBox.hpp | 6 +- src/graphics/ui/elements/TextBox.cpp | 156 ++++++++------- src/graphics/ui/elements/TextBox.hpp | 12 +- src/graphics/ui/elements/TrackBar.cpp | 9 +- src/graphics/ui/elements/TrackBar.hpp | 17 +- src/graphics/ui/elements/UINode.cpp | 8 +- src/graphics/ui/elements/UINode.hpp | 23 ++- src/graphics/ui/gui_util.cpp | 117 ++++++----- src/graphics/ui/gui_util.hpp | 38 ++-- src/graphics/ui/gui_xml.cpp | 184 ++++++++++-------- src/graphics/ui/gui_xml.hpp | 4 +- src/logic/EngineController.cpp | 4 +- src/logic/PlayerController.cpp | 118 ++++++----- src/logic/PlayerController.hpp | 13 +- src/logic/scripting/lua/libs/libconsole.cpp | 14 +- src/logic/scripting/lua/libs/libcore.cpp | 1 - src/logic/scripting/lua/libs/libgui.cpp | 12 +- src/logic/scripting/lua/libs/libinput.cpp | 65 +++---- src/logic/scripting/lua/libs/libnetwork.cpp | 116 ++++++----- src/logic/scripting/lua/libs/libpack.cpp | 2 +- src/logic/scripting/scripting.cpp | 10 +- src/logic/scripting/scripting_hud.cpp | 8 +- .../scripting/scripting_world_generation.cpp | 2 +- src/objects/Player.hpp | 23 ++- src/window/Camera.cpp | 1 - src/window/Events.cpp | 46 ++--- src/window/Events.hpp | 5 +- src/window/Window.cpp | 68 ++++++- src/window/Window.hpp | 4 +- src/window/input.hpp | 77 +++++++- 70 files changed, 1133 insertions(+), 832 deletions(-) diff --git a/src/assets/AssetsLoader.cpp b/src/assets/AssetsLoader.cpp index e068295b..42fe4a0b 100644 --- a/src/assets/AssetsLoader.cpp +++ b/src/assets/AssetsLoader.cpp @@ -19,13 +19,14 @@ #include "items/ItemDef.hpp" #include "Assets.hpp" #include "assetload_funcs.hpp" +#include "engine/Engine.hpp" namespace fs = std::filesystem; static debug::Logger logger("assets-loader"); -AssetsLoader::AssetsLoader(Assets* assets, const ResPaths* paths) - : assets(assets), paths(paths) { +AssetsLoader::AssetsLoader(Engine& engine, Assets& assets, const ResPaths* paths) + : engine(engine), assets(assets), paths(paths) { addLoader(AssetType::SHADER, assetload::shader); addLoader(AssetType::TEXTURE, assetload::texture); addLoader(AssetType::FONT, assetload::font); @@ -73,7 +74,7 @@ void AssetsLoader::loadNext() { aloader_func loader = getLoader(entry.tag); auto postfunc = loader(this, paths, entry.filename, entry.alias, entry.config); - postfunc(assets); + postfunc(&assets); entries.pop(); } catch (std::runtime_error& err) { logger.error() << err.what(); @@ -101,7 +102,7 @@ static void add_layouts( AssetType::LAYOUT, file.string(), name, - std::make_shared(env) + std::make_shared(&loader.getEngine().getGUI(), env) ); } } @@ -296,6 +297,10 @@ bool AssetsLoader::loadExternalTexture( return false; } +Engine& AssetsLoader::getEngine() { + return engine; +} + const ResPaths* AssetsLoader::getPaths() const { return paths; } @@ -324,7 +329,7 @@ std::shared_ptr AssetsLoader::startTask(runnable onDone) { std::make_shared>( "assets-loader-pool", [=]() { return std::make_shared(this); }, - [=](const assetload::postfunc& func) { func(assets); } + [this](const assetload::postfunc& func) { func(&assets); } ); pool->setOnComplete(std::move(onDone)); while (!entries.empty()) { diff --git a/src/assets/AssetsLoader.hpp b/src/assets/AssetsLoader.hpp index bf117a3d..20dc50a3 100644 --- a/src/assets/AssetsLoader.hpp +++ b/src/assets/AssetsLoader.hpp @@ -18,6 +18,11 @@ class ResPaths; class AssetsLoader; class Content; +class Engine; + +namespace gui { + class GUI; +} struct AssetCfg { virtual ~AssetCfg() { @@ -25,9 +30,10 @@ struct AssetCfg { }; struct LayoutCfg : AssetCfg { + gui::GUI* gui; scriptenv env; - LayoutCfg(scriptenv env) : env(std::move(env)) { + LayoutCfg(gui::GUI* gui, scriptenv env) : gui(gui), env(std::move(env)) { } }; @@ -61,7 +67,8 @@ struct aloader_entry { }; class AssetsLoader { - Assets* assets; + Engine& engine; + Assets& assets; std::map loaders; std::queue entries; std::set> enqueued; @@ -76,7 +83,7 @@ class AssetsLoader { void processPreloadConfig(const io::path& file); void processPreloadConfigs(const Content* content); public: - AssetsLoader(Assets* assets, const ResPaths* paths); + AssetsLoader(Engine& engine, Assets& assets, const ResPaths* paths); void addLoader(AssetType tag, aloader_func func); /// @brief Enqueue asset load @@ -111,4 +118,6 @@ public: const std::string& name, const std::vector& alternatives ); + + Engine& getEngine(); }; diff --git a/src/assets/assetload_funcs.cpp b/src/assets/assetload_funcs.cpp index bad2bbb5..f6582333 100644 --- a/src/assets/assetload_funcs.cpp +++ b/src/assets/assetload_funcs.cpp @@ -189,6 +189,7 @@ assetload::postfunc assetload::layout( auto prefix = name.substr(0, pos); assets->store( UiDocument::read( + *cfg->gui, cfg->env, name, file, diff --git a/src/engine/Engine.cpp b/src/engine/Engine.cpp index 5778ed98..b653794c 100644 --- a/src/engine/Engine.cpp +++ b/src/engine/Engine.cpp @@ -50,8 +50,6 @@ static debug::Logger logger("engine"); -namespace fs = std::filesystem; - static std::unique_ptr load_icon() { try { auto file = "res:textures/misc/icon.png"; @@ -65,20 +63,21 @@ static std::unique_ptr load_icon() { } Engine::Engine() = default; +Engine::~Engine() = default; -static std::unique_ptr engine; +static std::unique_ptr instance = nullptr; Engine& Engine::getInstance() { - if (!engine) { - engine = std::make_unique(); + if (!instance) { + instance = std::make_unique(); } - return *engine; + return *instance; } void Engine::initialize(CoreParameters coreParameters) { params = std::move(coreParameters); settingsHandler = std::make_unique(settings); - interpreter = std::make_unique(); + cmd = std::make_unique(); network = network::Network::create(settings.network); logger.info() << "engine version: " << ENGINE_VERSION_STRING; @@ -97,7 +96,7 @@ void Engine::initialize(CoreParameters coreParameters) { controller = std::make_unique(*this); if (!params.headless) { - if (Window::initialize(&settings.display)){ + if (!(input = Window::initialize(&settings.display))){ throw initialize_error("could not initialize window"); } time.set(Window::time()); @@ -107,9 +106,9 @@ void Engine::initialize(CoreParameters coreParameters) { } loadControls(); - gui = std::make_unique(); + gui = std::make_unique(*this); if (ENGINE_DEBUG_BUILD) { - menus::create_version_label(*this); + menus::create_version_label(*gui); } } audio::initialize(!params.headless, settings.audio); @@ -209,7 +208,7 @@ void Engine::nextFrame() { : settings.display.framerate.get() ); Window::swapBuffers(); - Events::pollEvents(); + input->pollEvents(); } void Engine::renderFrame() { @@ -229,7 +228,7 @@ void Engine::saveSettings() { } } -Engine::~Engine() { +void Engine::close() { saveSettings(); logger.info() << "shutting down"; if (screen) { @@ -238,7 +237,7 @@ Engine::~Engine() { } content.reset(); assets.reset(); - interpreter.reset(); + cmd.reset(); if (gui) { gui.reset(); logger.info() << "gui finished"; @@ -256,17 +255,14 @@ Engine::~Engine() { } void Engine::terminate() { - engine.reset(); + instance->close(); + instance.reset(); } EngineController* Engine::getController() { return controller.get(); } -cmd::CommandsInterpreter* Engine::getCommandsInterpreter() { - return interpreter.get(); -} - PacksManager Engine::createPacksManager(const io::path& worldFolder) { PacksManager manager; manager.setSources({ @@ -286,7 +282,7 @@ void Engine::loadAssets() { Shader::preprocessor->setPaths(resPaths.get()); auto new_assets = std::make_unique(); - AssetsLoader loader(new_assets.get(), resPaths.get()); + AssetsLoader loader(*this, *new_assets, resPaths.get()); AssetsLoader::addDefaults(loader, content.get()); // no need @@ -376,7 +372,6 @@ void Engine::loadContent() { load_configs(pack.folder); } content = contentBuilder.build(); - interpreter->reset(); scripting::on_content_load(content.get()); ContentLoader::loadScripts(*content); @@ -468,10 +463,6 @@ bool Engine::isQuitSignal() const { return quitSignal; } -gui::GUI* Engine::getGUI() { - return gui.get(); -} - EngineSettings& Engine::getSettings() { return settings; } @@ -518,10 +509,6 @@ SettingsHandler& Engine::getSettingsHandler() { return *settingsHandler; } -network::Network& Engine::getNetwork() { - return *network; -} - Time& Engine::getTime() { return time; } diff --git a/src/engine/Engine.hpp b/src/engine/Engine.hpp index ccfabeed..ca5bcb21 100644 --- a/src/engine/Engine.hpp +++ b/src/engine/Engine.hpp @@ -26,6 +26,7 @@ class ResPaths; class EngineController; class SettingsHandler; struct EngineSettings; +class Input; namespace gui { class GUI; @@ -66,8 +67,9 @@ class Engine : public util::ObjectsKeeper { std::unique_ptr content; std::unique_ptr resPaths; std::unique_ptr controller; - std::unique_ptr interpreter; + std::unique_ptr cmd; std::unique_ptr network; + std::unique_ptr input; std::vector basePacks; std::unique_ptr gui; PostRunnables postRunnables; @@ -87,6 +89,7 @@ public: static Engine& getInstance(); void initialize(CoreParameters coreParameters); + void close(); static void terminate(); @@ -128,9 +131,6 @@ public: /// @brief Get active assets storage instance Assets* getAssets(); - - /// @brief Get main UI controller - gui::GUI* getGUI(); /// @brief Get writeable engine settings structure instance EngineSettings& getSettings(); @@ -171,7 +171,6 @@ public: void saveScreenshot(); EngineController* getController(); - cmd::CommandsInterpreter* getCommandsInterpreter(); PacksManager createPacksManager(const io::path& worldFolder); @@ -179,11 +178,25 @@ public: SettingsHandler& getSettingsHandler(); - network::Network& getNetwork(); - Time& getTime(); const CoreParameters& getCoreParameters() const; bool isHeadless() const; + + gui::GUI& getGUI() { + return *gui; + } + + Input& getInput() { + return *input; + } + + network::Network& getNetwork() { + return *network; + } + + cmd::CommandsInterpreter& getCmd() { + return *cmd; + } }; diff --git a/src/frontend/UiDocument.cpp b/src/frontend/UiDocument.cpp index 1dfa18aa..0ca64542 100644 --- a/src/frontend/UiDocument.cpp +++ b/src/frontend/UiDocument.cpp @@ -54,6 +54,7 @@ scriptenv UiDocument::getEnvironment() const { } std::unique_ptr UiDocument::read( + gui::GUI& gui, const scriptenv& penv, const std::string& name, const io::path& file, @@ -66,7 +67,7 @@ std::unique_ptr UiDocument::read( ? scripting::create_doc_environment(scripting::get_root_environment(), name) : scripting::create_doc_environment(penv, name); - gui::UiXmlReader reader(env); + gui::UiXmlReader reader(gui, env); auto view = reader.readXML(file.string(), *xmldoc->getRoot()); view->setId("root"); uidocscript script {}; @@ -80,8 +81,7 @@ std::unique_ptr UiDocument::read( } std::shared_ptr UiDocument::readElement( - const io::path& file, const std::string& fileName + gui::GUI& gui, const io::path& file, const std::string& fileName ) { - auto document = read(nullptr, file.name(), file, fileName); - return document->getRoot(); + return read(gui, nullptr, file.name(), file, fileName)->getRoot(); } diff --git a/src/frontend/UiDocument.hpp b/src/frontend/UiDocument.hpp index 298e63bc..b280249a 100644 --- a/src/frontend/UiDocument.hpp +++ b/src/frontend/UiDocument.hpp @@ -9,6 +9,7 @@ #include "io/fwd.hpp" namespace gui { + class GUI; class UINode; } @@ -45,12 +46,13 @@ public: scriptenv getEnvironment() const; static std::unique_ptr read( + gui::GUI&, const scriptenv& parent_env, const std::string& name, const io::path& file, const std::string& fileName ); static std::shared_ptr readElement( - const io::path& file, const std::string& fileName + gui::GUI&, const io::path& file, const std::string& fileName ); }; diff --git a/src/frontend/debug_panel.cpp b/src/frontend/debug_panel.cpp index 779597e1..67b43f5a 100644 --- a/src/frontend/debug_panel.cpp +++ b/src/frontend/debug_panel.cpp @@ -35,8 +35,8 @@ using namespace gui; -static std::shared_ptr