aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorY. Wang <yw05@forksworld.de>2022-04-13 10:23:50 +0200
committerY. Wang <yw05@forksworld.de>2022-04-13 15:50:05 +0200
commit2f1be2b03e98713ee496da336b8264cdbc8c19b4 (patch)
tree3431f94c142d4ab6c61d8ac9432da6ad6a627d57
parentd86b03fa18af90dd27b840eca11c2b556a225ca2 (diff)
downloadadvtrains-2f1be2b03e98713ee496da336b8264cdbc8c19b4.tar.gz
advtrains-2f1be2b03e98713ee496da336b8264cdbc8c19b4.tar.bz2
advtrains-2f1be2b03e98713ee496da336b8264cdbc8c19b4.zip
Move signal aspect selector to a separate file
-rw-r--r--advtrains/formspec.lua37
-rw-r--r--advtrains/init.lua1
-rw-r--r--advtrains_interlocking/init.lua1
-rw-r--r--advtrains_interlocking/signal_api.lua125
-rw-r--r--advtrains_interlocking/signal_aspect_ui.lua128
5 files changed, 167 insertions, 125 deletions
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)