lua: added hud.open_permanent(layoutid)

This commit is contained in:
MihailRis 2024-02-17 02:57:42 +03:00
parent 4e126e25cf
commit e58624d3e8
4 changed files with 52 additions and 4 deletions

View File

@ -319,6 +319,16 @@ void Hud::drawDebug(int fps){
fpsMax = max(fps, fpsMax); 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) { void Hud::update(bool visible) {
auto level = frontend->getLevel(); auto level = frontend->getLevel();
auto player = level->player; auto player = level->player;
@ -383,10 +393,7 @@ void Hud::update(bool visible) {
remove(element); remove(element);
} }
} }
auto it = std::remove_if(elements.begin(), elements.end(), [](const HudElement& e) { cleanup();
return e.isRemoved();
});
elements.erase(it, elements.end());
} }
/** /**
@ -429,6 +436,15 @@ void Hud::openInventory(glm::ivec3 block, UiDocument* doc, std::shared_ptr<Inven
add(HudElement(hud_element_mode::inventory_bound, doc, blockUI, false)); add(HudElement(hud_element_mode::inventory_bound, doc, blockUI, false));
} }
/**
* Add element as permanent overlay
* @param doc element layout document
*/
void Hud::openPermanent(UiDocument* doc) {
remove(doc->getRoot());
add(HudElement(hud_element_mode::permanent, doc, doc->getRoot(), false));
}
/** /**
* Hide inventory and turn off inventory mode * Hide inventory and turn off inventory mode
*/ */
@ -477,6 +493,17 @@ void Hud::remove(HudElement& element) {
gui->remove(element.getNode()); gui->remove(element.getNode());
} }
// todo: refactor this garbage
void Hud::remove(std::shared_ptr<UINode> node) {
for (auto& element : elements) {
if (element.getNode() == node) {
element.setRemoved();
remove(element);
}
}
cleanup();
}
void Hud::draw(const GfxContext& ctx){ void Hud::draw(const GfxContext& ctx){
auto level = frontend->getLevel(); auto level = frontend->getLevel();
auto player = level->player; auto player = level->player;

View File

@ -55,6 +55,10 @@ public:
UiDocument* getDocument() const; UiDocument* getDocument() const;
std::shared_ptr<gui::UINode> getNode() const; std::shared_ptr<gui::UINode> getNode() const;
void setRemoved() {
removed = true;
}
bool isRemoved() const { bool isRemoved() const {
return removed; return removed;
} }
@ -90,6 +94,8 @@ class Hud {
std::shared_ptr<gui::UINode> createDebugPanel(Engine* engine); std::shared_ptr<gui::UINode> createDebugPanel(Engine* engine);
std::shared_ptr<InventoryView> createContentAccess(); std::shared_ptr<InventoryView> createContentAccess();
std::shared_ptr<InventoryView> createHotbar(); std::shared_ptr<InventoryView> createHotbar();
void cleanup();
public: public:
Hud(Engine* engine, LevelFrontend* frontend); Hud(Engine* engine, LevelFrontend* frontend);
~Hud(); ~Hud();
@ -105,9 +111,11 @@ public:
void openInventory(); void openInventory();
void openInventory(glm::ivec3 block, UiDocument* doc, std::shared_ptr<Inventory> blockInv); void openInventory(glm::ivec3 block, UiDocument* doc, std::shared_ptr<Inventory> blockInv);
void closeInventory(); void closeInventory();
void openPermanent(UiDocument* doc);
void add(HudElement element); void add(HudElement element);
void remove(HudElement& element); void remove(HudElement& element);
void remove(std::shared_ptr<gui::UINode> node);
}; };
#endif /* SRC_HUD_H_ */ #endif /* SRC_HUD_H_ */

View File

@ -63,3 +63,14 @@ int l_hud_open_block(lua_State* L) {
lua_pushstring(L, def->uiLayout.c_str()); lua_pushstring(L, def->uiLayout.c_str());
return 2; 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;
}

View File

@ -6,11 +6,13 @@
extern int l_hud_open_inventory(lua_State* L); extern int l_hud_open_inventory(lua_State* L);
extern int l_hud_close_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_block(lua_State* L);
extern int l_hud_open_permanent(lua_State* L);
static const luaL_Reg hudlib [] = { static const luaL_Reg hudlib [] = {
{"open_inventory", l_hud_open_inventory}, {"open_inventory", l_hud_open_inventory},
{"close_inventory", l_hud_close_inventory}, {"close_inventory", l_hud_close_inventory},
{"open_block", l_hud_open_block}, {"open_block", l_hud_open_block},
{"open_permanent", l_hud_open_permanent},
{NULL, NULL} {NULL, NULL}
}; };