From 2f1be2b03e98713ee496da336b8264cdbc8c19b4 Mon Sep 17 00:00:00 2001 From: "Y. Wang" Date: Wed, 13 Apr 2022 10:23:50 +0200 Subject: Move signal aspect selector to a separate file --- advtrains/formspec.lua | 37 ++++++++ advtrains/init.lua | 1 + advtrains_interlocking/init.lua | 1 + advtrains_interlocking/signal_api.lua | 125 --------------------------- advtrains_interlocking/signal_aspect_ui.lua | 128 ++++++++++++++++++++++++++++ 5 files changed, 167 insertions(+), 125 deletions(-) create mode 100644 advtrains/formspec.lua create mode 100644 advtrains_interlocking/signal_aspect_ui.lua diff --git a/advtrains/formspec.lua b/advtrains/formspec.lua new file mode 100644 index 0000000..91e300d --- /dev/null +++ b/advtrains/formspec.lua @@ -0,0 +1,37 @@ +local sformat = string.format +local fsescape = minetest.formspec_escape + +local function f_button_exit(x, y, w, h, id, text) + return sformat("button_exit[%f,%f;%f,%f;%s;%s]", x, y, w, h, id, text) +end + +local function S_button_exit(x, y, w, h, id, ...) + return f_button_exit(x, y, w, h, id, attrans(...)) +end + +local function f_dropdown(x, y, w, id, entries, sel, indexed) + local t = {} + for k, v in pairs(entries) do + t[k] = fsescape(v) + end + return sformat("dropdown[%f,%f;%f;%s;%s;%d%s]", + x, y, w, id, table.concat(t, ","), + sel or 1, + indexed and ";true" or "") +end + +local function f_label(x, y, text) + return sformat("label[%f,%f;%s]", x, y, fsescape(text)) +end + +local function S_label(x, y, ...) + return f_label(x, y, attrans(...)) +end + +return { + button_exit = f_button_exit, + S_button_exit = S_button_exit, + dropdown = f_dropdown, + label = f_label, + S_label = S_label, +} diff --git a/advtrains/init.lua b/advtrains/init.lua index 468623c..1cba255 100644 --- a/advtrains/init.lua +++ b/advtrains/init.lua @@ -202,6 +202,7 @@ advtrains.meseconrules = advtrains.fpath=minetest.get_worldpath().."/advtrains" advtrains.speed = dofile(advtrains.modpath.."/speed.lua") +advtrains.formspec = dofile(advtrains.modpath.."/formspec.lua") dofile(advtrains.modpath.."/path.lua") dofile(advtrains.modpath.."/trainlogic.lua") diff --git a/advtrains_interlocking/init.lua b/advtrains_interlocking/init.lua index a2f5882..a5bf41e 100644 --- a/advtrains_interlocking/init.lua +++ b/advtrains_interlocking/init.lua @@ -14,6 +14,7 @@ local modpath = minetest.get_modpath(minetest.get_current_modname()) .. DIR_DELI dofile(modpath.."database.lua") dofile(modpath.."signal_api.lua") +dofile(modpath.."signal_aspect_ui.lua") dofile(modpath.."demosignals.lua") dofile(modpath.."train_sections.lua") dofile(modpath.."route_prog.lua") diff --git a/advtrains_interlocking/signal_api.lua b/advtrains_interlocking/signal_api.lua index 6e862a8..78acc0a 100644 --- a/advtrains_interlocking/signal_api.lua +++ b/advtrains_interlocking/signal_api.lua @@ -411,128 +411,3 @@ minetest.register_on_punchnode(function(pos, node, player, pointed_thing) players_assign_ip[pname] = nil end end) - - ---== aspect selector ==-- - -local players_aspsel = {} - ---[[ -suppasp: "supported_aspects" table -purpose: form title string -callback: func(pname, aspect) called on form submit -isasp: aspect currently set -]] -local function make_signal_aspect_selector_t1(suppasp, purpose, isasp) - local form = {"size[7,7]"} - form[#form+1] = string.format("label[0.5,0.5;%s]", attrans_formspec("Select signal aspect")) - form[#form+1] = string.format("label[0.5,1;%s]", minetest.formspec_escape(purpose)) - - form[#form+1] = string.format("label[0.5,1.5;%s]", attrans_formspec("Main aspect")) - local entries = {} - local selid = 1 - for idx, spv in ipairs(suppasp.main) do - local entry - if isasp and spv == isasp.main then - selid = idx - end - if spv == 0 then - entry = attrans("Danger (halt)") - elseif spv == -1 then - entry = attrans("Continue at maximum speed") - elseif not spv then - entry = attrans("No info: continue with current speed limit") - else - entry = attrans("Continue with the speed limit of @1", spv) - end - entries[idx] = minetest.formspec_escape(entry) - end - form[#form+1] = string.format("dropdown[0.5,2;6;main;%s;%d;true]", table.concat(entries,","), selid) - - form[#form+1] = string.format("label[0.5,3;%s]", attrans_formspec("Shunt aspect")) - if suppasp.shunt == nil then - local st = 1 - if isasp and isasp.shunt then st = 2 end - form[#form+1] = string.format("dropdown[0.5,3.5;6;shunt_free;%s,%s;%d;true]", - attrans_formspec("No shunting"), - attrans_formspec("Shunting allowed"), - st) - end - - form[#form+1] = string.format("label[0.5,4.5;%s]", attrans_formspec("Distant aspect")) - local entries = {} - local selid = 1 - for idx, spv in ipairs(suppasp.dst) do - local entry - if isasp and spv == isasp.dst then - selid = idx - end - if spv == 0 then - entry = attrans("Expect to stop at the next signal") - elseif spv == -1 then - entry = attrans("Expect to continue at maximum speed") - elseif not spv then - entry = attrans("No info") - else - entry = attrans("Expect to continue with a speed limit of @1", spv) - end - entries[idx] = minetest.formspec_escape(entry) - end - form[#form+1] = string.format("dropdown[0.5,5;6;dst;%s;%d;true]", table.concat(entries, ","), selid) - form[#form+1] = string.format("button_exit[0.5,6;5,1;save;%s]", attrans_formspec("Save signal aspect")) - return table.concat(form) -end - -function advtrains.interlocking.show_signal_aspect_selector(pname, p_suppasp, p_purpose, callback, isasp) - local suppasp = p_suppasp or { - main = {0, -1}, dst = {false}, shunt = false, info = {}, - } - local purpose = p_purpose or "" - - local form = make_signal_aspect_selector_t1(suppasp, purpose, isasp) - - local token = advtrains.random_id() - - minetest.show_formspec(pname, "at_il_sigaspdia_"..token, form) - - minetest.after(1, function() - players_aspsel[pname] = { - suppasp = suppasp, - callback = callback, - token = token, - } - end) -end - -local function usebool(sup, val, free) - if sup == nil then - return val==free - else - return sup - end -end - -minetest.register_on_player_receive_fields(function(player, formname, fields) - local pname = player:get_player_name() - local psl = players_aspsel[pname] - if psl then - if formname == "at_il_sigaspdia_"..psl.token then - if fields.save then - local maini = tonumber(fields.main) - if not maini then return end - local dsti = tonumber(fields.dst) - if not dsti then return end - local asp = { - main = psl.suppasp.main[maini], - dst = psl.suppasp.dst[dsti], - shunt = usebool(psl.suppasp.shunt, fields.shunt_free, "2"), - info = {} - } - psl.callback(pname, asp) - end - else - players_aspsel[pname] = nil - end - end - -end) diff --git a/advtrains_interlocking/signal_aspect_ui.lua b/advtrains_interlocking/signal_aspect_ui.lua new file mode 100644 index 0000000..d5a7543 --- /dev/null +++ b/advtrains_interlocking/signal_aspect_ui.lua @@ -0,0 +1,128 @@ +local F = advtrains.formspec +local players_aspsel = {} + +local function make_signal_aspect_selector_t1(suppasp, purpose, isasp) + local form = {"size[7,7]"} + form[#form+1] = F.S_label(0.5, 0.5, "Select signal aspect") + form[#form+1] = F.label(0.5, 1, purpose) + + form[#form+1] = F.S_label(0.5, 1.5, "Main aspect") + local entries = {} + local selid = 1 + for idx, spv in ipairs(suppasp.main) do + local entry + if isasp and spv == isasp.main then + selid = idx + end + if spv == 0 then + entry = attrans("Danger (halt)") + elseif spv == -1 then + entry = attrans("Continue at maximum speed") + elseif not spv then + entry = attrans("Continue with current speed limit") + else + entry = attrans("Continue with the speed limit of @1", spv) + end + entries[idx] = entry + end + form[#form+1] = F.dropdown(0.5, 2, 6, "main", entries, selid, true) + + form[#form+1] = F.S_label(0.5, 3, "Shunt aspect") + if suppasp.shunt == nil then + local st = 1 + if isasp and isasp.shunt then st = 2 end + local entries = { + attrans("No shunting"), + attrans("Shunting allowed"), + } + form[#form+1] = F.dropdown(0.5, 3.5, 6, "shunt_free", entries, st, true) + end + + form[#form+1] = F.S_label(0.5, 4.5, "Distant aspect") + local entries = {} + local selid = 1 + for idx, spv in ipairs(suppasp.dst) do + local entry + if isasp and spv == isasp.dst then + selid = idx + end + if spv == 0 then + entry = attrans("Expect to stop at the next signal") + elseif spv == -1 then + entry = attrans("Expect to continue at maximum speed") + elseif not spv then + entry = attrans("No information on distant signal") + else + entry = attrans("Expect to continue with a speed limit of @1", spv) + end + entries[idx] = entry + end + form[#form+1] = F.dropdown(0.5, 5, 6, "dst", entries, selid, true) + + form[#form+1] = F.S_button_exit(0.5, 6, 5, 1, "save", "Save signal aspect") + return table.concat(form) +end + +function advtrains.interlocking.show_signal_aspect_selector(pname, p_suppasp, p_purpose, callback, isasp) + local suppasp = p_suppasp or { + main = {0, -1}, + dst = {false}, + shunt = false, + info = {}, + } + local purpose = p_purpose or "" + + local form + if true then + form = make_signal_aspect_selector_t1(suppasp, purpose, isasp) + end + + local token = advtrains.random_id() + minetest.show_formspec(pname, "at_il_sigaspdia_"..token, form) + players_aspsel[pname] = { + suppasp = suppasp, + callback = callback, + token = token, + } +end + +local function usebool(sup, val, free) + if sup == nil then + return val == free + else + return sup + end +end + +local function get_aspect_from_formspec_t1(suppasp, fields) + local maini = tonumber(fields.main) + if not maini then return end + local dsti = tonumber(fields.dst) + if not dsti then return end + return { + main = suppasp.main[maini], + dst = suppasp.dst[dsti], + shunt = usebool(suppasp.shunt, fields.shunt_free, "2"), + info = {}, + } +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local pname = player:get_player_name() + local psl = players_aspsel[pname] + if psl then + if formname == "at_il_sigaspdia_"..psl.token then + if fields.save then + local asp + if true then + asp = get_aspect_from_formspec_t1(psl.suppasp, fields) + if asp then + psl.callback(pname, asp) + end + end + end + else + players_aspsel[pname] = nil + end + end +end) -- cgit v1.2.3