Add 'on button' mode to the button

This commit is contained in:
Joachim Stolberg 2022-09-18 11:53:51 +02:00
parent 742fc51dc0
commit 4469dd128c
7 changed files with 39 additions and 27 deletions

View File

@ -16,8 +16,8 @@ local S = techage.S
techage.menu = {} techage.menu = {}
local function index(list, x) local function index(list, x)
for idx, v in ipairs(list) do for idx, v in ipairs(list or {}) do
if v == x then return idx end if tostring(v) == x then return idx end
end end
return nil return nil
end end
@ -99,7 +99,6 @@ local function generate_formspec_substring(pos, meta, form_def, player_name)
end end
tbl[#tbl+1] = "label[4.75," .. offs .. ";" .. val .. "]" tbl[#tbl+1] = "label[4.75," .. offs .. ";" .. val .. "]"
elseif elem.type == "dropdown" then elseif elem.type == "dropdown" then
local l = elem.choices:split(",")
if nvm.running or techage.is_running(nvm) then if nvm.running or techage.is_running(nvm) then
local val = elem.default or "" local val = elem.default or ""
if meta:contains(elem.name) then if meta:contains(elem.name) then
@ -120,7 +119,13 @@ local function generate_formspec_substring(pos, meta, form_def, player_name)
if meta:contains(elem.name) then if meta:contains(elem.name) then
val = meta:get_string(elem.name) or "" val = meta:get_string(elem.name) or ""
end end
local idx = index(l, val) or 1 local idx
if elem.values then
idx = index(elem.values, val) or 1
else
local l = elem.choices:split(",")
idx = index(l, val) or 1
end
tbl[#tbl+1] = "dropdown[4.72," .. (offs) .. ";5.5,1.4;" .. elem.name .. ";" .. elem.choices .. ";" .. idx .. "]" tbl[#tbl+1] = "dropdown[4.72," .. (offs) .. ";5.5,1.4;" .. elem.name .. ";" .. elem.choices .. ";" .. idx .. "]"
end end
elseif elem.type == "items" then -- inventory elseif elem.type == "items" then -- inventory
@ -203,8 +208,15 @@ local function evaluate_data(pos, meta, form_def, fields, player_name)
end end
elseif elem.type == "dropdown" then elseif elem.type == "dropdown" then
if fields[elem.name] ~= nil then if fields[elem.name] ~= nil then
if elem.values then
local l = elem.choices:split(",")
local idx = index(l, fields[elem.name]) or 1
local text = elem.values[idx]
meta:set_string(elem.name, text)
else
meta:set_string(elem.name, fields[elem.name]) meta:set_string(elem.name, fields[elem.name])
end end
end
elseif elem.type == "items" and player_name then elseif elem.type == "items" and player_name then
local inv_name = minetest.formspec_escape(player_name) .. "_techage_wrench_menu" local inv_name = minetest.formspec_escape(player_name) .. "_techage_wrench_menu"
local dinv = minetest.get_inventory({type = "detached", name = inv_name}) local dinv = minetest.get_inventory({type = "detached", name = inv_name})

View File

@ -1043,7 +1043,7 @@ techage.manual_DE.aText = {
"\n".. "\n"..
"\n", "\n",
"Der Taster/Schalter sendet 'on'/'off' Kommandos zu den Blöcken\\, die über die Nummern konfiguriert wurden.\n".. "Der Taster/Schalter sendet 'on'/'off' Kommandos zu den Blöcken\\, die über die Nummern konfiguriert wurden.\n"..
"Der Taster/Schalter kann als Taster (button) oder Schalter (switch) konfiguriert werden. Wird er als Taster konfiguriert\\, so kann die Zeit zwischen den 'on' und 'off' Kommandos eingestellt werden.\n".. "Der Taster/Schalter kann als Taster (button) oder Schalter (switch) konfiguriert werden. Wird er als Taster konfiguriert\\, so kann die Zeit zwischen den 'on' und 'off' Kommandos eingestellt werden. Mit der Betriebsart \"on button\" wird nur ein 'on' und kein 'off' Kommandos gesendet.\n"..
"\n".. "\n"..
"Über die Checkbox \"public\" kann eingestellt werden\\, ob den Taster von jedem (gesetzt)\\, oder nur vom Besitzer selbst (nicht gesetzt) genutzt werden darf.\n".. "Über die Checkbox \"public\" kann eingestellt werden\\, ob den Taster von jedem (gesetzt)\\, oder nur vom Besitzer selbst (nicht gesetzt) genutzt werden darf.\n"..
"\n".. "\n"..

View File

@ -1046,7 +1046,7 @@ techage.manual_EN.aText = {
"\n".. "\n"..
"\n", "\n",
"The button/switch sends 'on' / 'off' commands to the blocks that have been configured via the numbers.\n".. "The button/switch sends 'on' / 'off' commands to the blocks that have been configured via the numbers.\n"..
"The button/switch can be configured as a button or a switch. If it is configured as a button\\, the time between the 'on' and 'off' commands can be set.\n".. "The button/switch can be configured as a button or a switch. If it is configured as a button\\, the time between the 'on' and 'off' commands can be set. With the operating mode \"on button\" only an 'on' and no 'off' command is sent.\n"..
"\n".. "\n"..
"The checkbox \"public\" can be used to set whether the button can be used by everyone (set) or only by the owner himself (not set).\n".. "The checkbox \"public\" can be used to set whether the button can be used by everyone (set) or only by the owner himself (not set).\n"..
"\n".. "\n"..

View File

@ -22,7 +22,7 @@ local logic = techage.logic
local WRENCH_MENU = { local WRENCH_MENU = {
{ {
type = "dropdown", type = "dropdown",
choices = "switch,button 1s,button 2s,button 4s,button 8s,button 16s,button 32s", choices = "switch,on button,button 1s,button 2s,button 4s,button 8s,button 16s,button 32s",
name = "type", name = "type",
label = S("Type"), label = S("Type"),
tooltip = S("Button or switch"), tooltip = S("Button or switch"),
@ -87,7 +87,8 @@ local function switch_off(pos, is_button)
logic.swap_node(pos, "techage:ta4_button_off") logic.swap_node(pos, "techage:ta4_button_off")
end end
local meta = M(pos) local meta = M(pos)
if not meta:contains("command") or meta:get_string("command") == "on" then if meta:get_string("off_command") ~= "true" and
(not meta:contains("command") or meta:get_string("command") == "on") then
logic.send_off(pos, M(pos)) logic.send_off(pos, M(pos))
end end
if not is_button then if not is_button then
@ -105,7 +106,7 @@ local function formspec(meta)
if idx == 0 then idx = 1 end if idx == 0 then idx = 1 end
local access_idx = meta:get_string("public") == "true" and 3 or meta:get_string("protected") == "true" and 2 or 1 local access_idx = meta:get_string("public") == "true" and 3 or meta:get_string("protected") == "true" and 2 or 1
return "size[7.5,6]".. return "size[7.5,6]"..
"dropdown[0.2,0;3;type;switch,button 1s,button 2s,button 4s,button 8s,button 16s,button 32s;"..idx.."]".. "dropdown[0.2,0;3;type;switch,on button,button 1s,button 2s,button 4s,button 8s,button 16s,button 32s;"..idx.."]"..
"field[0.5,2;7,1;numbers;"..S("Insert destination node number(s)")..";"..numbers.."]" .. "field[0.5,2;7,1;numbers;"..S("Insert destination node number(s)")..";"..numbers.."]" ..
"label[0.2,3;"..S("Access:").."]".. "label[0.2,3;"..S("Access:").."]"..
"dropdown[3,3;4;access;private,protected,public;"..access_idx.."]".. "dropdown[3,3;4;access;private,protected,public;"..access_idx.."]"..
@ -115,6 +116,8 @@ end
local function store_fields_data(pos, fields) local function store_fields_data(pos, fields)
local meta = M(pos) local meta = M(pos)
meta:set_string("numbers", fields.numbers) meta:set_string("numbers", fields.numbers)
meta:set_string("off_command", "")
if fields.access == "protected" then if fields.access == "protected" then
meta:set_string("protected", "true") meta:set_string("protected", "true")
meta:set_string("public", "") meta:set_string("public", "")
@ -131,23 +134,27 @@ local function store_fields_data(pos, fields)
if fields.type == "switch" then if fields.type == "switch" then
meta:set_int("cycle_idx", 1) meta:set_int("cycle_idx", 1)
cycle_time = 0 cycle_time = 0
elseif fields.type == "button 1s" then elseif fields.type == "on button" then
meta:set_int("cycle_idx", 2) meta:set_int("cycle_idx", 2)
meta:set_string("off_command", "true")
cycle_time = 1
elseif fields.type == "button 1s" then
meta:set_int("cycle_idx", 3)
cycle_time = 1 cycle_time = 1
elseif fields.type == "button 2s" then elseif fields.type == "button 2s" then
meta:set_int("cycle_idx", 3) meta:set_int("cycle_idx", 4)
cycle_time = 2 cycle_time = 2
elseif fields.type == "button 4s" then elseif fields.type == "button 4s" then
meta:set_int("cycle_idx", 4) meta:set_int("cycle_idx", 5)
cycle_time = 4 cycle_time = 4
elseif fields.type == "button 8s" then elseif fields.type == "button 8s" then
meta:set_int("cycle_idx", 5) meta:set_int("cycle_idx", 6)
cycle_time = 8 cycle_time = 8
elseif fields.type == "button 16s" then elseif fields.type == "button 16s" then
meta:set_int("cycle_idx", 6) meta:set_int("cycle_idx", 7)
cycle_time = 16 cycle_time = 16
elseif fields.type == "button 32s" then elseif fields.type == "button 32s" then
meta:set_int("cycle_idx", 7) meta:set_int("cycle_idx", 8)
cycle_time = 32 cycle_time = 32
end end
if cycle_time ~= nil then if cycle_time ~= nil then

View File

@ -46,21 +46,14 @@ local WRENCH_MENU = {
label = S("Cycle time"), label = S("Cycle time"),
tooltip = S("Timer cycle time (default: 100 ms)"), tooltip = S("Timer cycle time (default: 100 ms)"),
default = "1", default = "1",
values = {0.1, 0.2, 0.5, 1.0, 2.0}
}, },
} }
local CYCLE_TIMES = {
["100ms"] = 0.1,
["200ms"] = 0.2,
["500ms"] = 0.5,
["1s"] = 1.0,
["2s"] = 2.0
}
local function cycle_time(pos) local function cycle_time(pos)
local mem = techage.get_mem(pos) local mem = techage.get_mem(pos)
if not mem.cycletime then if not mem.cycletime then
mem.cycletime = CYCLE_TIMES[M(pos):get_string("cycletime")] or 0.1 mem.cycletime = tonumber(M(pos):get_string("cycletime")) or 0.1
end end
return mem.cycletime return mem.cycletime
end end

View File

@ -527,7 +527,7 @@ Dieser Status und weitere Informationen werden auch ausgegeben, wenn mit dem Sch
### TA3 Taster/Schalter / Button/Switch ### TA3 Taster/Schalter / Button/Switch
Der Taster/Schalter sendet `on`/`off` Kommandos zu den Blöcken, die über die Nummern konfiguriert wurden. Der Taster/Schalter sendet `on`/`off` Kommandos zu den Blöcken, die über die Nummern konfiguriert wurden.
Der Taster/Schalter kann als Taster (button) oder Schalter (switch) konfiguriert werden. Wird er als Taster konfiguriert, so kann die Zeit zwischen den `on` und `off` Kommandos eingestellt werden. Der Taster/Schalter kann als Taster (button) oder Schalter (switch) konfiguriert werden. Wird er als Taster konfiguriert, so kann die Zeit zwischen den `on` und `off` Kommandos eingestellt werden. Mit der Betriebsart "on button" wird nur ein `on` und kein `off` Kommandos gesendet.
Über die Checkbox "public" kann eingestellt werden, ob den Taster von jedem (gesetzt), oder nur vom Besitzer selbst (nicht gesetzt) genutzt werden darf. Über die Checkbox "public" kann eingestellt werden, ob den Taster von jedem (gesetzt), oder nur vom Besitzer selbst (nicht gesetzt) genutzt werden darf.

View File

@ -526,7 +526,7 @@ This status and other information is also output when the wrench is clicked on t
### TA3 Button / Switch ### TA3 Button / Switch
The button/switch sends `on` / `off` commands to the blocks that have been configured via the numbers. The button/switch sends `on` / `off` commands to the blocks that have been configured via the numbers.
The button/switch can be configured as a button or a switch. If it is configured as a button, the time between the `on` and `off` commands can be set. The button/switch can be configured as a button or a switch. If it is configured as a button, the time between the `on` and `off` commands can be set. With the operating mode "on button" only an `on` and no `off` command is sent.
The checkbox "public" can be used to set whether the button can be used by everyone (set) or only by the owner himself (not set). The checkbox "public" can be used to set whether the button can be used by everyone (set) or only by the owner himself (not set).