From e58624d3e8f6165a516efbc7b3de6659d2736868 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sat, 17 Feb 2024 02:57:42 +0300 Subject: [PATCH] lua: added hud.open_permanent(layoutid) --- src/frontend/hud.cpp | 35 ++++++++++++++++++++++++++---- src/frontend/hud.h | 8 +++++++ src/logic/scripting/lua/libhud.cpp | 11 ++++++++++ src/logic/scripting/lua/libhud.h | 2 ++ 4 files changed, 52 insertions(+), 4 deletions(-) diff --git a/src/frontend/hud.cpp b/src/frontend/hud.cpp index afcc9eee..4750f808 100644 --- a/src/frontend/hud.cpp +++ b/src/frontend/hud.cpp @@ -319,6 +319,16 @@ void Hud::drawDebug(int fps){ fpsMax = max(fps, fpsMax); } +/** + * Remove all elements marked as removed + */ +void Hud::cleanup() { + auto it = std::remove_if(elements.begin(), elements.end(), [](const HudElement& e) { + return e.isRemoved(); + }); + elements.erase(it, elements.end()); +} + void Hud::update(bool visible) { auto level = frontend->getLevel(); auto player = level->player; @@ -383,10 +393,7 @@ void Hud::update(bool visible) { remove(element); } } - auto it = std::remove_if(elements.begin(), elements.end(), [](const HudElement& e) { - return e.isRemoved(); - }); - elements.erase(it, elements.end()); + cleanup(); } /** @@ -429,6 +436,15 @@ void Hud::openInventory(glm::ivec3 block, UiDocument* doc, std::shared_ptrgetRoot()); + add(HudElement(hud_element_mode::permanent, doc, doc->getRoot(), false)); +} + /** * Hide inventory and turn off inventory mode */ @@ -477,6 +493,17 @@ void Hud::remove(HudElement& element) { gui->remove(element.getNode()); } +// todo: refactor this garbage +void Hud::remove(std::shared_ptr node) { + for (auto& element : elements) { + if (element.getNode() == node) { + element.setRemoved(); + remove(element); + } + } + cleanup(); +} + void Hud::draw(const GfxContext& ctx){ auto level = frontend->getLevel(); auto player = level->player; diff --git a/src/frontend/hud.h b/src/frontend/hud.h index d15ccb4f..b591f4b6 100644 --- a/src/frontend/hud.h +++ b/src/frontend/hud.h @@ -55,6 +55,10 @@ public: UiDocument* getDocument() const; std::shared_ptr getNode() const; + void setRemoved() { + removed = true; + } + bool isRemoved() const { return removed; } @@ -90,6 +94,8 @@ class Hud { std::shared_ptr createDebugPanel(Engine* engine); std::shared_ptr createContentAccess(); std::shared_ptr createHotbar(); + + void cleanup(); public: Hud(Engine* engine, LevelFrontend* frontend); ~Hud(); @@ -105,9 +111,11 @@ public: void openInventory(); void openInventory(glm::ivec3 block, UiDocument* doc, std::shared_ptr blockInv); void closeInventory(); + void openPermanent(UiDocument* doc); void add(HudElement element); void remove(HudElement& element); + void remove(std::shared_ptr node); }; #endif /* SRC_HUD_H_ */ diff --git a/src/logic/scripting/lua/libhud.cpp b/src/logic/scripting/lua/libhud.cpp index fc3cae26..0a834fc2 100644 --- a/src/logic/scripting/lua/libhud.cpp +++ b/src/logic/scripting/lua/libhud.cpp @@ -63,3 +63,14 @@ int l_hud_open_block(lua_State* L) { lua_pushstring(L, def->uiLayout.c_str()); return 2; } + +int l_hud_open_permanent(lua_State* L) { + auto assets = scripting::engine->getAssets(); + auto name = lua_tostring(L, 1); + auto layout = assets->getLayout(name); + if (layout == nullptr) { + luaL_error(L, "layout '%s' is not found", name); + } + scripting::hud->openPermanent(layout); + return 0; +} diff --git a/src/logic/scripting/lua/libhud.h b/src/logic/scripting/lua/libhud.h index 17c24a2f..259f0653 100644 --- a/src/logic/scripting/lua/libhud.h +++ b/src/logic/scripting/lua/libhud.h @@ -6,11 +6,13 @@ extern int l_hud_open_inventory(lua_State* L); extern int l_hud_close_inventory(lua_State* L); extern int l_hud_open_block(lua_State* L); +extern int l_hud_open_permanent(lua_State* L); static const luaL_Reg hudlib [] = { {"open_inventory", l_hud_open_inventory}, {"close_inventory", l_hud_close_inventory}, {"open_block", l_hud_open_block}, + {"open_permanent", l_hud_open_permanent}, {NULL, NULL} };