From a844c7ec5ec126c92ac8e03fe49ca92e97fd6406 Mon Sep 17 00:00:00 2001 From: unknown <24964441+wsor4035@users.noreply.github.com> Date: Sat, 12 Feb 2022 17:13:16 -0500 Subject: [PATCH] add demo formspec --- .luacheckrc | 2 +- computers/api.lua | 45 +++++++++++++- computers/formspec.lua | 95 +++++++++++++++++++++++++++++ computers/init.lua | 1 + computers/mod.conf | 1 + computers/textures/kuto_button.png | Bin 0 -> 504 bytes 6 files changed, 142 insertions(+), 2 deletions(-) create mode 100644 computers/formspec.lua create mode 100644 computers/textures/kuto_button.png diff --git a/.luacheckrc b/.luacheckrc index dbe476c..d54c5ef 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -21,5 +21,5 @@ read_globals = { "vector", "ItemStack", "dump", "DIR_DELIM", "VoxelArea", "Settings", "PcgRandom", "VoxelManip", "PseudoRandom", --mod produced - "default", "screwdriver", "unifieddyes", + "default", "screwdriver", "unifieddyes", "formspec_ast", } \ No newline at end of file diff --git a/computers/api.lua b/computers/api.lua index 165f2a2..2640720 100644 --- a/computers/api.lua +++ b/computers/api.lua @@ -1,3 +1,46 @@ +--local usage +local futil = computers.formspec + +computers.show_formspec = computers.formspec.show_formspec + function computers.load_gui(pos, node, clicker) - minetest.chat_send_all("test") + --minetest.chat_send_all("test") + + local formspec = { + formspec_version = 4, + { + type = "size", + w = 10, + h = 10, + }, + { + type = "label", + x = 1, + y = 1, + label = "test label", + }, + { + type = "button", + x = 1, + y = 2, + w = 5, + h = 2, + name = "test_btn", + label = "test btn", + on_event = function(form, player, element) + local cindex = futil.get_index_by_name(form, "test_btn") + form[cindex] = {type = "label", x=1, y=3, label = "test button label"} + + return form + end, + props = { + border = false, + bgimg = "kuto_button.png^[combine:16x16^[noalpha^[colorize:#ffffff70", + bgimg_hovered = "kuto_button.png^[combine:16x16^[noalpha^[colorize:#ffffff90", + bgimg_middle = "4,4", + } + } + } + + computers.show_formspec(clicker, "computers:gui", formspec) end \ No newline at end of file diff --git a/computers/formspec.lua b/computers/formspec.lua new file mode 100644 index 0000000..672eabb --- /dev/null +++ b/computers/formspec.lua @@ -0,0 +1,95 @@ +local registered_astk = {} +computers.formspec = {} + +computers.formspec.get_element_by_name = formspec_ast.get_element_by_name + +function computers.formspec.get_index_by_name(tree, name) + if type(tree) ~= "table" then return end + + for key, element in pairs(tree) do + if type(element) == "table" and element.name and element.name == name then + return key + end + end +end + +--note this is terrible hard coded +local function insert_styles(form, styles) + local headers = {size = true, position = true, anchor = true, no_prepend = true, real_cordinates = true} + local cindex = 0 + local fs = {} + + for key, val in pairs(form) do + if type(val) == "number" and not tonumber(key) then + fs[key] = val + elseif type(val) == "table" and val.type and headers[val.type] then + table.insert(fs, val) + cindex = key + end + end + + for _, val in pairs(styles) do + table.insert(fs, val) + end + + cindex = cindex+1 + for i=cindex, #form do + table.insert(fs, form[i]) + end + + return fs +end + +function computers.formspec.convert_to_ast(form) + local styles = {} + + + local function rfind(fs) + for key, val in pairs(fs) do + if type(val) == "table" and val.type and val.type:find("container") then + rfind(val) + elseif type(val) == "table" and val.props then + table.insert(styles, {type = "style", selectors = val.selectors or {val.name}, props = val.props}) + end + end + end + + rfind(form) + + local fs = insert_styles(form, styles) + return fs +end + +function computers.formspec.show_formspec(player, formname, fs) + local playername = player + local formspec = fs + + if type(player) == "userdata" then + playername = player:get_player_name() + end + if type(fs) == "table" then + formspec = formspec_ast.unparse(computers.formspec.convert_to_ast(fs)) + registered_astk[playername] = fs + end + + minetest.show_formspec(playername, formname, formspec) +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "computers:gui" then return end + local pname = player:get_player_name() + + if fields.quit then registered_astk[pname] = nil return end + + local keys = {} + for key, val in pairs(fields) do table.insert(keys, key) end + + local element = computers.formspec.get_element_by_name(registered_astk[pname], keys[1]) + + if element and element.on_event then + --on_event(form, player, element) + local form = element.on_event(registered_astk[pname], player, element) + + if form then computers.formspec.show_formspec(player, formname, form) end + end +end) \ No newline at end of file diff --git a/computers/init.lua b/computers/init.lua index 343bfde..5786338 100644 --- a/computers/init.lua +++ b/computers/init.lua @@ -2,5 +2,6 @@ computers = {} computers.modpath = minetest.get_modpath("computers") dofile(computers.modpath .. "/old_stuff/init.lua") +dofile(computers.modpath .. "/formspec.lua") dofile(computers.modpath .. "/api.lua") dofile(computers.modpath .. "/demo.lua") diff --git a/computers/mod.conf b/computers/mod.conf index 77e5d97..8eac82b 100644 --- a/computers/mod.conf +++ b/computers/mod.conf @@ -1,2 +1,3 @@ name = computers +depends = formspec_ast optional_depends = screwdriver, default, basic_materials diff --git a/computers/textures/kuto_button.png b/computers/textures/kuto_button.png new file mode 100644 index 0000000000000000000000000000000000000000..ebc8d7e09ccc43071ac808bb0ad83fe7540f6ac4 GIT binary patch literal 504 zcmVu%k2F)Gv_jM27IxcmbdGNAYX8-cr+54n_mbu zJ`*5F2R)3YG~1j`OeLu~K5nT~^=44@s=e>u5m?r34eFYN$28M&geQb!YmTXSOSoOj zrj~^dga<4+pzx*A(;h!5&UpN$*hd#wJdb2qDrGSs{nRpwxn7_P=lF$2Y^Ocr^K&l(58+AuHYiQH#=5muiTv%a^01 za{rsBZHx?i-GdQmcy!&@UTEBgud?fY9=h(=5%?eAyioD4N>1bNqL(XLcpq9f;Pj%R zrFY(VzoFlZ*A zHb=(*000SaNLh0L04^f{04^f|c%?sf0000lNklXJIHv#~@2Mifsz?=#I0000