MultiCraft/builtin/fstk/ui.lua

241 lines
7.1 KiB
Lua
Raw Normal View History

--Minetest
--Copyright (C) 2014 sapier
--
2015-11-10 03:49:24 -08:00
--This 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
2015-11-10 03:49:24 -08:00
--the Free Software Foundation; either version 3.0 of the License, or
--(at your option) any later version.
--
2015-11-10 03:49:24 -08:00
--This 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
2015-11-10 03:49:24 -08:00
--with this program; if not, write to the Free Software Foundation, Inc.,
--51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
ui = {}
ui.childlist = {}
ui.default = nil
--------------------------------------------------------------------------------
function ui.add(child)
--TODO check child
ui.childlist[child.name] = child
2015-11-10 03:49:24 -08:00
return child.name
end
--------------------------------------------------------------------------------
function ui.delete(child)
if ui.childlist[child.name] == nil then
return false
end
2015-11-10 03:49:24 -08:00
ui.childlist[child.name] = nil
return true
end
--------------------------------------------------------------------------------
function ui.set_default(name)
ui.default = name
end
--------------------------------------------------------------------------------
function ui.find_by_name(name)
return ui.childlist[name]
end
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Internal functions not to be called from user
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
local sub8 = utf8.sub
2015-11-10 03:49:24 -08:00
local function wordwrap_quickhack(str)
local res = ""
local ar = str:split("\n")
for i = 1, #ar do
local text = ar[i]
-- Hack to add word wrapping.
-- TODO: Add engine support for wrapping in formspecs
while #text > 80 do
if res ~= "" then
res = res .. ","
end
res = res .. core.formspec_escape(sub8(text, 1, 79))
text = sub8(text, 80, #text)
2015-11-10 03:49:24 -08:00
end
if res ~= "" then
res = res .. ","
end
res = res .. core.formspec_escape(text)
end
return res
end
--------------------------------------------------------------------------------
2020-10-02 09:46:39 -07:00
local maintab = core.settings:get("maintab_LAST")
2020-03-13 12:57:00 -07:00
local connect_time = tonumber(core.settings:get("connect_time"))
function ui.update()
local formspec = ""
2019-05-22 13:35:29 -07:00
-- attempt auto restart
if gamedata ~= nil and gamedata.errormessage ~= nil and
core.settings:get_bool("auto_connect") == true and
2020-03-13 12:57:00 -07:00
connect_time and connect_time < os.time() - 30 and
2019-12-26 03:50:55 -08:00
not gamedata.errormessage:find("Kicked") then
2020-03-13 12:57:00 -07:00
if maintab == "local" then
2019-05-22 13:35:29 -07:00
gamedata.singleplayer = true
gamedata.selected_world =
tonumber(core.settings:get("mainmenu_last_selected_world"))
end
core.settings:set("connect_time", os.time())
gamedata.reconnect_requested = false
gamedata.errormessage = nil
gamedata.do_reconnect = true
core.start()
return
2019-05-22 13:35:29 -07:00
end
-- handle errors
if gamedata ~= nil and gamedata.reconnect_requested then
2015-11-10 03:49:24 -08:00
formspec = wordwrap_quickhack(gamedata.errormessage or "")
formspec = "size[12,5]" ..
"label[0.5,0;" .. fgettext("The server has requested a reconnect:") ..
"]textlist[0.2,0.8;11.5,3.5;;" .. formspec ..
2019-05-16 06:22:55 -07:00
"]button[6,4.6;3,0.5;btn_reconnect_no;" .. fgettext("Close") .. "]" ..
2015-11-10 03:49:24 -08:00
"button[3,4.6;3,0.5;btn_reconnect_yes;" .. fgettext("Reconnect") .. "]"
elseif gamedata ~= nil and gamedata.errormessage ~= nil then
formspec = wordwrap_quickhack(gamedata.errormessage)
2020-03-13 12:57:00 -07:00
2015-11-10 03:49:24 -08:00
local error_title
2019-12-26 03:50:55 -08:00
if gamedata.errormessage:find("ModError") then
2020-02-04 08:42:51 -08:00
error_title = fgettext("An error occurred in a Lua script:")
2015-11-10 03:49:24 -08:00
else
2020-02-04 08:42:51 -08:00
error_title = fgettext("An error occurred:")
2015-11-10 03:49:24 -08:00
end
2020-02-21 06:01:39 -08:00
local restart_btn = "]button[4.5,4.6;3,0.5;btn_reconnect_no;" .. fgettext("Close") .. "]"
2020-03-13 12:57:00 -07:00
if maintab == "local" and
connect_time and connect_time < os.time() - 30 then
2019-05-16 06:22:55 -07:00
restart_btn = "]button[6,4.6;3,0.5;btn_reconnect_no;" .. fgettext("Close") .. "]" ..
"button[3,4.6;3,0.5;btn_reconnect_yes;" .. fgettext("Restart") .. "]"
end
2015-11-10 03:49:24 -08:00
formspec = "size[12,5]" ..
"label[0.5,0;" .. error_title ..
"]textlist[0.2,0.8;11.5,3.5;;" .. formspec ..
2019-05-16 06:22:55 -07:00
restart_btn
else
local active_toplevel_ui_elements = 0
for _, value in pairs(ui.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
2015-11-10 03:49:24 -08:00
-- no need to show addons if there ain't a toplevel element
if (active_toplevel_ui_elements > 0) then
for _, value in pairs(ui.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 > 1) then
2015-11-10 03:49:24 -08:00
core.log("warning", "more than one active ui "..
"element, self most likely isn't intended")
end
if (active_toplevel_ui_elements == 0) then
2015-11-10 03:49:24 -08:00
core.log("warning", "no toplevel ui element "..
"active; switching to default")
ui.childlist[ui.default]:show()
formspec = ui.childlist[ui.default]:get_formspec()
end
end
2015-11-01 01:01:13 -07:00
core.update_formspec(formspec)
end
--------------------------------------------------------------------------------
function ui.handle_buttons(fields)
for _, value in pairs(ui.childlist) do
local retval = value:handle_buttons(fields)
if retval then
ui.update()
return
end
end
end
--------------------------------------------------------------------------------
function ui.handle_events(event)
for _, value in pairs(ui.childlist) do
if value.handle_events ~= nil then
local retval = value:handle_events(event)
if retval then
return retval
end
end
end
end
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- initialize callbacks
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
2015-11-01 01:01:13 -07:00
core.button_handler = function(fields)
2015-11-10 03:49:24 -08:00
if fields["btn_reconnect_yes"] then
2020-10-02 09:46:39 -07:00
if maintab == "local" then
2019-05-14 13:50:02 -07:00
gamedata.singleplayer = true
gamedata.selected_world =
tonumber(core.settings:get("mainmenu_last_selected_world"))
end
2019-05-22 13:35:29 -07:00
core.settings:set("connect_time", os.time())
2015-11-10 03:49:24 -08:00
gamedata.reconnect_requested = false
gamedata.errormessage = nil
gamedata.do_reconnect = true
core.start()
return
2020-02-21 06:01:39 -08:00
elseif fields["btn_reconnect_no"] then
gamedata.errormessage = nil
2015-11-10 03:49:24 -08:00
gamedata.reconnect_requested = false
ui.update()
return
end
if ui.handle_buttons(fields) then
ui.update()
end
end
--------------------------------------------------------------------------------
2015-11-01 01:01:13 -07:00
core.event_handler = function(event)
if ui.handle_events(event) then
ui.update()
return
end
if event == "Refresh" then
ui.update()
return
end
end