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);
}
/**
* 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_ptr<Inven
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
*/
@ -477,6 +493,17 @@ void Hud::remove(HudElement& element) {
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){
auto level = frontend->getLevel();
auto player = level->player;

View File

@ -55,6 +55,10 @@ public:
UiDocument* getDocument() const;
std::shared_ptr<gui::UINode> getNode() const;
void setRemoved() {
removed = true;
}
bool isRemoved() const {
return removed;
}
@ -90,6 +94,8 @@ class Hud {
std::shared_ptr<gui::UINode> createDebugPanel(Engine* engine);
std::shared_ptr<InventoryView> createContentAccess();
std::shared_ptr<InventoryView> 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<Inventory> blockInv);
void closeInventory();
void openPermanent(UiDocument* doc);
void add(HudElement element);
void remove(HudElement& element);
void remove(std::shared_ptr<gui::UINode> node);
};
#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());
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_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}
};