From f702b37cbffe8e12f32181da23303824f46d3865 Mon Sep 17 00:00:00 2001 From: Zughy <4279489-marco_a@users.noreply.gitlab.com> Date: Sat, 28 Nov 2020 17:54:21 +0100 Subject: [PATCH] Panels are not deleted and recreated anymore when using :hide() and :show() | panel name outside of the declaration table --- api.lua | 87 ++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 65 insertions(+), 22 deletions(-) diff --git a/api.lua b/api.lua index a155ffc..469d57f 100644 --- a/api.lua +++ b/api.lua @@ -10,6 +10,8 @@ Panel = { player_name = "", -- ids of the hud of the player hud_id = {}, + -- text values of the huds, to retrieve on :show() + hud_text = {}, -- because the panel is composed by a background and a text we need to -- define the two HUD to use later background_def = { @@ -38,18 +40,26 @@ Panel = { -function Panel:new(def) +function Panel:new(name, def) local panel = {} local metapanel = clone_table(Panel) setmetatable(panel, metapanel) metapanel.__index = metapanel - if not def.name or type(def.name) ~= "string" then + --v------------------ LEGACY UPDATE, to remove in 3.0 -------------------v + if type(name) == "table" and def == nil then + minetest.log("warning", "[PANEL_LIB] Panel declaration deprecated. Please put the panel name outside of the def table as it follows -> Panel:new(name, def)") + def = clone_table(name) + name = def.name + end + --^------------------ LEGACY UPDATE, to remove in 3.0 -------------------^ + + if not name or type(name) ~= "string" then minetest.log("warning", "[PANEL_LIB] Can't create a panel without a proper name, aborting") return else - panel.name = def.name + panel.name = name end if def.position then @@ -93,20 +103,27 @@ function Panel:new(def) panel.player_name = def.player end + local player = minetest.get_player_by_name(def.player) + + -- creo sfondo e titolo + panel.hud_id.bg_hud_id = player:hud_add(panel.background_def) + panel.hud_id.text_hud_id = player:hud_add(panel.title_def) + + panel.hud_text.bg_hud_txt = panel.background_def.text + panel.hud_text.text_hud_txt = panel.title_def.text + + panel.is_shown = true + -- controllo sottoelementi if def.sub_img_elems then - local i = 1 for name, HUD_elem in pairs(def.sub_img_elems) do add_sub_elem(panel, "image", name, HUD_elem) - i = i +1 end end if def.sub_txt_elems then - local i = 1 for name, HUD_elem in pairs(def.sub_txt_elems) do add_sub_elem(panel, "text", name, HUD_elem) - i = i +1 end end @@ -114,8 +131,8 @@ function Panel:new(def) if not panel_lib.panels[def.player] then panel_lib.panels[def.player] = {} end + panel_lib.panels[def.player][name] = panel - panel_lib.panels[def.player][def.name] = panel return panel end @@ -123,16 +140,21 @@ end function Panel:show() local player = minetest.get_player_by_name(self.player_name) - self.hud_id.bg_hud_id = player:hud_add(self.background_def) - self.hud_id.text_hud_id = player:hud_add(self.title_def) + + if self.hud_text.bg_hud_txt ~= "" then + player:hud_change(self.hud_id.bg_hud_id, "text", self.hud_text.bg_hud_txt) + end + if self.hud_text.text_hud_txt ~= "" then + player:hud_change(self.hud_id.text_hud_id, "text", self.hud_text.text_hud_txt) + end --check for custom elements for _, name in pairs(self.sub_img_elems) do - self.hud_id[name] = player:hud_add(self[name]) + player:hud_change(self.hud_id[name], "text", self.hud_text[name]) end for _, name in pairs(self.sub_txt_elems) do - self.hud_id[name] = player:hud_add(self[name]) + player:hud_change(self.hud_id[name], "text", self.hud_text[name]) end self.is_shown = true @@ -146,7 +168,7 @@ function Panel:hide() local player = minetest.get_player_by_name(self.player_name) for k, v in pairs(self.hud_id) do - player:hud_remove(self.hud_id[k]) + player:hud_change(self.hud_id[k], "text", "") end end @@ -170,6 +192,11 @@ function Panel:update(def, txt_elems, img_elems) for elem, _ in pairs(txt_elems) do for k, v in pairs(txt_elems[elem]) do self[elem][k] = v + + if k == "text" then + self.hud_text[elem] = v + end + if self.is_shown == true then player:hud_change(self.hud_id[elem], k, v) end @@ -183,6 +210,11 @@ function Panel:update(def, txt_elems, img_elems) for elem, _ in pairs(img_elems) do for k, v in pairs(img_elems[elem]) do self[elem][k] = v + + if k == "text" then + self.hud_text[elem] = v + end + if self.is_shown == true then player:hud_change(self.hud_id[elem], k, v) end @@ -196,7 +228,13 @@ end function Panel:remove() panel_lib.panels[self.player_name][self.name] = nil - self:hide() + + local player = minetest.get_player_by_name(self.player_name) + + for k, v in pairs(self.hud_id) do + player:hud_remove(self.hud_id[k]) + end + self = nil end @@ -210,12 +248,6 @@ end function Panel:add_sub_elem(type, name, HUD_elem) add_sub_elem(self, type, name, HUD_elem) - - -- aggiorno se visibile - if self.is_shown then - self:hide() - self:show() - end end @@ -223,10 +255,14 @@ end function Panel:remove_sub_elem(name) self.sub_txt_elems[name] = nil self.sub_img_elems[name] = nil - self[name] = nil + if self.is_shown then minetest.get_player_by_name(self.player_name):hud_remove(self.hud_id[name]) end + self.hud_id[name] = nil + self.hud_text[name] = nil + + self[name] = nil end @@ -284,7 +320,7 @@ function add_sub_elem(panel, type, name, HUD_elem) if panel[name] then minetest.log("error", "[PANEL_LIB] Attempt to create a sub element with the same name of another. Aborting") - return end + return end sub_elems[#sub_elems +1] = name panel[name] = clone_table(mould) @@ -295,5 +331,12 @@ function add_sub_elem(panel, type, name, HUD_elem) -- mantengo la stessa posizione del corpo del panel, costringendo -- l'utente a modificare gli offset se vuole spostare gli elementi + HUD_elem.position = mould.position panel[name].position = mould.position + + -- mostro l'elemento se il pannello era giĆ  visibile + panel[name].text = panel.is_shown and panel[name].text or "" + + panel.hud_id[name] = minetest.get_player_by_name(panel.player_name):hud_add(panel[name]) + panel.hud_text[name] = HUD_elem.text end