Panels are not deleted and recreated anymore when using :hide() and :show() | panel name outside of the declaration table

master
Zughy 2020-11-28 17:54:21 +01:00
parent 48634d6ea2
commit f702b37cbf
1 changed files with 65 additions and 22 deletions

87
api.lua
View File

@ -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