panel_lib/api.lua

216 lines
4.5 KiB
Lua
Raw Normal View History

2020-04-23 05:54:16 -07:00
panel_lib.panels = {}
2020-04-14 04:26:33 -07:00
local function clone_table() end
2020-04-23 05:54:16 -07:00
Panel = {
-- player to show the panel to
player_name = "",
2020-04-21 14:01:14 -07:00
-- ids of the hud of the player
hud_id = {},
2020-04-23 05:54:16 -07:00
-- because the panel is composed by a background and a text we need to
2020-04-14 04:26:33 -07:00
-- define the two HUD to use later
background_def = {
hud_elem_type = "image",
position = { x = 1, y = 0.5 },
scale = { x = 1, y = 1 },
alignment = { x = -1, y = 0 },
2020-04-23 05:54:16 -07:00
text = "panel_bg.png",
2020-04-14 04:26:33 -07:00
},
2020-04-23 02:54:46 -07:00
title_def = {
2020-04-14 04:26:33 -07:00
hud_elem_type = "text",
position = {x = 1, y = 0.5},
2020-04-23 02:54:46 -07:00
alignment = {x = 0, y = 0},
offset = {x = 0, y = 0},
2020-04-14 04:26:33 -07:00
number = 0xFFFFFF,
text = "Default"
},
sub_img_elems = {},
sub_txt_elems = {}
2020-04-14 04:26:33 -07:00
}
2020-04-23 02:54:46 -07:00
2020-04-23 05:54:16 -07:00
function Panel:new(def)
local panel = {}
2020-04-14 04:26:33 -07:00
2020-04-23 05:54:16 -07:00
setmetatable(panel, self)
2020-04-14 04:26:33 -07:00
self.__index = self
if def.position then
2020-04-23 05:54:16 -07:00
panel.background_def.position = def.position
panel.title_def.position = def.position
2020-04-23 02:54:46 -07:00
end
if def.alignment then
2020-04-23 05:54:16 -07:00
panel.background_def.alignment = def.alignment
2020-04-23 02:54:46 -07:00
end
if def.bg then
2020-04-23 05:54:16 -07:00
panel.background_def.text = def.bg
2020-04-14 04:26:33 -07:00
end
if def.bg_scale then
2020-04-23 05:54:16 -07:00
panel.background_def.scale = def.bg_scale
end
2020-04-23 02:54:46 -07:00
if def.title then
2020-04-23 05:54:16 -07:00
panel.title_def.text = def.title
2020-04-14 04:26:33 -07:00
end
2020-04-23 02:54:46 -07:00
if def.title_alignment then
2020-04-23 05:54:16 -07:00
panel.title_def.alignment = def.title_alignment
2020-04-14 04:26:33 -07:00
end
2020-04-23 02:54:46 -07:00
if def.title_offset then
2020-04-23 05:54:16 -07:00
panel.title_def.offset = def.title_offset
2020-04-23 02:54:46 -07:00
end
if def.title_color then
2020-04-23 05:54:16 -07:00
panel.title_def.number = def.title_color
2020-04-14 04:26:33 -07:00
end
if def.player then
2020-04-23 05:54:16 -07:00
panel.player_name = def.player
end
2020-04-23 02:54:46 -07:00
-- controllo sottoelementi
if def.sub_img_elems then
2020-04-22 03:59:11 -07:00
local i = 1
for name, elem in pairs(def.sub_img_elems) do
2020-04-23 05:54:16 -07:00
panel.sub_img_elems[i] = name
panel[name] = clone_table(panel.background_def)
2020-04-23 02:54:46 -07:00
for param, v in pairs(elem) do
2020-04-23 05:54:16 -07:00
panel[name][param] = v
2020-04-23 02:54:46 -07:00
end
2020-04-23 05:54:16 -07:00
-- mantengo la stessa posizione del corpo della panel, costringendo
2020-04-23 02:54:46 -07:00
-- l'utente a modificare gli offset se vuole spostare gli elementi
2020-04-23 05:54:16 -07:00
panel[name].position = def.position
2020-04-22 03:59:11 -07:00
i = i +1
end
end
if def.sub_txt_elems then
2020-04-22 03:59:11 -07:00
local i = 1
for name, elem in pairs(def.sub_txt_elems) do
2020-04-23 05:54:16 -07:00
panel.sub_txt_elems[i] = name
panel[name] = clone_table(panel.title_def)
2020-04-23 02:54:46 -07:00
for param, v in pairs(elem) do
2020-04-23 05:54:16 -07:00
panel[name][param] = v
2020-04-23 02:54:46 -07:00
end
-- idem come sopra
2020-04-23 05:54:16 -07:00
panel[name].position = def.position
2020-04-22 03:59:11 -07:00
i = i +1
end
2020-04-14 04:26:33 -07:00
end
2020-04-23 02:54:46 -07:00
-- salvo in memoria
2020-04-23 05:54:16 -07:00
panel_lib.panels[def.player] = panel
return panel
2020-04-14 04:26:33 -07:00
end
2020-04-23 05:54:16 -07:00
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)
2020-04-23 02:54:46 -07:00
self.hud_id.text_hud_id = player:hud_add(self.title_def)
--check for custom elements
for _, name in pairs(self.sub_img_elems) do
self.hud_id[name] = player:hud_add(self[name])
end
for _, name in pairs(self.sub_txt_elems) do
self.hud_id[name] = player:hud_add(self[name])
end
2020-04-14 04:26:33 -07:00
end
2020-04-23 05:54:16 -07:00
function Panel:hide()
if (self.hud_id) then
2020-04-23 02:54:46 -07:00
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])
2020-04-14 04:26:33 -07:00
end
end
end
2020-04-23 05:54:16 -07:00
function Panel:update(def, txt_elems, img_elems)
2020-04-21 14:01:14 -07:00
if def ~= nil then
for k, v in pairs(def) do
self[k] = v
end
end
if txt_elems ~= nil then
for elem, _ in pairs(txt_elems) do
for k, v in pairs(txt_elems[elem]) do
self[elem][k] = v
end
end
end
2020-04-22 07:06:02 -07:00
if img_elems ~= nil then
for elem, _ in pairs(img_elems) do
for k, v in pairs(img_elems[elem]) do
self[elem][k] = v
end
end
end
2020-04-21 14:01:14 -07:00
end
2020-04-23 05:54:16 -07:00
function Panel:remove()
panel_lib.panels[self.player_name] = nil
2020-04-23 02:54:46 -07:00
self:hide()
self = nil
end
2020-04-21 14:01:14 -07:00
----------------------------------------------
-----------------GETTERS----------------------
----------------------------------------------
2020-04-23 05:54:16 -07:00
function panel_lib.get_panel(p_name)
return panel_lib.panels[p_name]
2020-04-21 14:01:14 -07:00
end
----------------------------------------------
---------------FUNZIONI LOCALI----------------
----------------------------------------------
-- code from => http://lua-users.org/wiki/CopyTable
function clone_table(orig)
2020-04-23 02:54:46 -07:00
local orig_type = type(orig)
local copy
if orig_type == 'table' then
copy = {}
for orig_key, orig_value in pairs(orig) do
copy[orig_key] = orig_value
end
else -- number, string, boolean, etc
copy = orig
end
return copy
end