204 lines
5.2 KiB
Lua
204 lines
5.2 KiB
Lua
--Minetest
|
|
--Copyright (C) 2014 sapier
|
|
--
|
|
--self program is free software; you can redistribute it and/or modify
|
|
--it under the terms of the GNU Lesser General Public License as published by
|
|
--the Free Software Foundation; either version 2.1 of the License, or
|
|
--(at your option) any later version.
|
|
--
|
|
--self program is distributed in the hope that it will be useful,
|
|
--but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
--MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
--GNU Lesser General Public License for more details.
|
|
--
|
|
--You should have received a copy of the GNU Lesser General Public License along
|
|
--with self program; if not, write to the Free Software Foundation, Inc.,
|
|
--51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
|
|
local ui_registry = {}
|
|
|
|
--------------------------------------------------------------------------------
|
|
local function add(self, child)
|
|
assert(child ~= nil)
|
|
|
|
if (self.childlist[child.name] ~= nil) then
|
|
return false
|
|
end
|
|
self.childlist[child.name] = child
|
|
|
|
return child.name
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
local function delete(self, child)
|
|
if self.childlist[child.name] == nil then
|
|
return false
|
|
end
|
|
|
|
self.childlist[child.name] = nil
|
|
return true
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
local function set_default(self, name)
|
|
self.default = name
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
local function find_by_name(self, name)
|
|
return self.childlist[name]
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
local function hide(self)
|
|
for key,value in pairs(self.childlist) do
|
|
if type(value.hide) == "function" then
|
|
value:hide()
|
|
end
|
|
end
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
local function update(self)
|
|
local formspec = ""
|
|
local active_toplevel_ui_elements = 0
|
|
|
|
for key,value in pairs(self.childlist) do
|
|
if (value.type == "toplevel") then
|
|
local retval = value:get_formspec()
|
|
|
|
if retval ~= nil and retval ~= "" then
|
|
active_toplevel_ui_elements = active_toplevel_ui_elements +1
|
|
formspec = formspec .. retval
|
|
end
|
|
end
|
|
end
|
|
|
|
-- no need to show addons if there ain't a toplevel element
|
|
if (active_toplevel_ui_elements > 0) then
|
|
for key,value in pairs(self.childlist) do
|
|
if (value.type == "addon") then
|
|
local retval = value:get_formspec()
|
|
|
|
if retval ~= nil and retval ~= "" then
|
|
formspec = formspec .. retval
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
if (active_toplevel_ui_elements == 0) then
|
|
core.log("WARNING: not a single toplevel ui element active switching " ..
|
|
"to default")
|
|
self.childlist[self.default]:show()
|
|
formspec = self.childlist[self.default]:get_formspec()
|
|
end
|
|
|
|
core.show_formspec(self.playername, self.formname, formspec)
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
local ui_metatable = {
|
|
add = add,
|
|
delete = delete,
|
|
set_default = set_default,
|
|
find_by_name = find_by_name,
|
|
hide = hide,
|
|
update = update
|
|
}
|
|
|
|
ui_metatable.__index = ui_metatable
|
|
|
|
--------------------------------------------------------------------------------
|
|
function create_ui(playername, unique_id)
|
|
|
|
if (ui_registry[playername] == nil) then
|
|
ui_registry[playername] = {}
|
|
end
|
|
|
|
if ui_registry[playername][unique_id] ~= nil then
|
|
return nil
|
|
end
|
|
|
|
local self = {}
|
|
|
|
setmetatable(self, ui_metatable)
|
|
|
|
ui_registry[playername][unique_id] = self
|
|
|
|
self.childlist = {}
|
|
self.default = nil
|
|
self.formname = unique_id
|
|
self.playername = playername
|
|
|
|
return self
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
function get_ui_by_unique_id(playername, unique_id)
|
|
|
|
if (ui_registry[playername] == nil) then
|
|
return nil
|
|
end
|
|
|
|
return ui_registry[playername][unique_id]
|
|
end
|
|
|
|
|
|
--------------------------------------------------------------------------------
|
|
--------------------------------------------------------------------------------
|
|
-- Internal functions not to be called from user
|
|
--------------------------------------------------------------------------------
|
|
--------------------------------------------------------------------------------
|
|
--------------------------------------------------------------------------------
|
|
local function handle_buttons(player, formname, fields)
|
|
|
|
if not player:is_player() then
|
|
return
|
|
end
|
|
|
|
local playername = player:get_player_name()
|
|
|
|
if playername == nil or
|
|
ui_registry[playername] == nil then
|
|
return
|
|
end
|
|
|
|
if ui_registry[playername][formname] == nil then
|
|
return
|
|
end
|
|
|
|
for key,value in pairs(ui_registry[playername][formname].childlist) do
|
|
|
|
local retval = value:handle_buttons(fields)
|
|
|
|
if retval then
|
|
ui_registry[playername][formname]:update()
|
|
return
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
--------------------------------------------------------------------------------
|
|
local function player_leave(player)
|
|
|
|
if not player:is_player() then
|
|
return
|
|
end
|
|
|
|
local playername = player:get_player_name()
|
|
|
|
if playername == nil then
|
|
return
|
|
end
|
|
|
|
ui_registry[playername] = nil
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
minetest.register_on_player_receive_fields(handle_buttons)
|
|
minetest.register_on_leaveplayer(player_leave)
|