From 2018b2f8a4c9e0f2fd27532a95ffecb61d04588d Mon Sep 17 00:00:00 2001 From: Xertis Date: Thu, 28 Nov 2024 22:26:48 +0300 Subject: [PATCH 1/5] add content_config --- res/layouts/pages/content_menu.xml | 16 ++- res/layouts/pages/content_menu.xml.lua | 158 ++++++++++++++++++++++++- res/preload.json | 4 +- res/textures/gui/folder_icon.png | Bin 0 -> 181 bytes res/textures/gui/settings_icon.png | Bin 0 -> 258 bytes 5 files changed, 174 insertions(+), 4 deletions(-) create mode 100644 res/textures/gui/folder_icon.png create mode 100644 res/textures/gui/settings_icon.png diff --git a/res/layouts/pages/content_menu.xml b/res/layouts/pages/content_menu.xml index af15b32c..9197ee21 100644 --- a/res/layouts/pages/content_menu.xml +++ b/res/layouts/pages/content_menu.xml @@ -1,15 +1,23 @@ + - - + + + + + @@ -25,4 +33,8 @@ + + + + diff --git a/res/layouts/pages/content_menu.xml.lua b/res/layouts/pages/content_menu.xml.lua index 130b7387..75a4e5de 100644 --- a/res/layouts/pages/content_menu.xml.lua +++ b/res/layouts/pages/content_menu.xml.lua @@ -1,4 +1,5 @@ local packs_installed = {} +local pack_open = {} function on_open(params) refresh() @@ -41,9 +42,140 @@ function refresh_search() end end +local function create_checkbox(id, name, cheaked) + document.configs:add(string.format( + "%s", + id, name, id, cheaked, name + )) +end + +local function create_textbox(id, name, text) + document.configs:add(string.format( + "", + id .. "_label", name + )) + document.configs:add(string.format( + "%s", + id, name, id, name, text + )) +end + +local function create_trackbar(id, name, val) + document.configs:add(string.format( + "", + id .. "_label", name, val + )) + document.configs:add(string.format( + "%s", + id, name, id, val, name + )) +end + +local function create_label(id, text, color) + if id then + document.configs:add(string.format( + "", + id, color, text + )) + else + document.configs:add(string.format( + "", + text + )) + end +end + +local function create_config(i, config, name, path) + create_label(name, '[' .. name .. ']', "#008000") + pack_open[2][i] = {{}, path = path} + for _, a in ipairs(config.checkboxes) do + create_checkbox(i .. '_' .. a[1], a[1], a[2]) + pack_open[2][i][1][a[1]] = type(a[2]) + end + create_label(nil, '', 0) + for _, a in ipairs(config.trackbars) do + create_trackbar(i .. '_' .. a[1], a[1], a[2]) + create_label(nil, '', 0) + pack_open[2][i][1][a[1]] = type(a[2]) + end + + for _, a in ipairs(config.textboxes) do + create_textbox(i .. '_' .. a[1], a[1], a[2]) + create_label(nil, '', 0) + pack_open[2][i][1][a[1]] = type(a[2]) + end + create_label(nil, '', 0) +end + + +local function load_config_file(path) + local extension = path:match("%.(%w+)$") + + if not extension or file.isdir(path) then + return + end + + local value = file.read(path) + + if extension == "toml" then + return toml.parse(value), extension + elseif extension == "json" then + return json.parse(value), extension + end +end + +local function load_config(path) + if file.exists(path) then + local value = load_config_file(path) + local config = {checkboxes = {}, + trackbars = {}, + textboxes = {} + } + + if not value then + return + end + + for i, v in pairs(value) do + if type(v) == "string" then + table.insert(config.textboxes, {i, v}) + elseif type(v) == "boolean" then + table.insert(config.checkboxes, {i, v}) + elseif type(v) == "number" then + table.insert(config.trackbars, {i, v}) + end + end + + return config + end +end + +function set_value(name, id, value) + local config_id = tonumber(id:match("^(%w+)_")) + local elem_id = id:match("^[^_]+_(.+)$") + local type_val = pack_open[2][config_id][1][elem_id] + + if type_val == 'number' then + document[id .. '_label'].text = string.format("%s (%s)", elem_id, value) + end + + local path = pack_open[2][config_id].path + local config, extension = load_config_file(path) + config[name] = value + + if extension == "toml" then + file.write(path, toml.tostring(config)) + elseif extension == "json" then + file.write(path, json.tostring(config)) + end +end function open_pack(id) local packinfo = pack.get_info(id) + pack_open = {id, {}} + + document.configs.visible = false + document.content_info.visible = true if packinfo['dependencies'] == nil then document.dependencies.text = 'None' else document.dependencies.text = table.tostring(packinfo['dependencies']) end if packinfo['creator'] == '' then document.author.text = 'None' else document.author.text = packinfo['creator'] end @@ -51,11 +183,35 @@ function open_pack(id) if packinfo['description'] == nil then document.description.text = 'None' else document.description.text = packinfo['description'] end end +function open_config() + local id = pack_open[1] + if (not document.configs.visible and id) and + (file.exists("config:" .. id) and #file.list("config:" .. id) > 0) then + + document.configs:clear() + document.configs.visible = true + document.content_info.visible = false + local configs = file.list("config:" .. id) + for i, c in ipairs(configs) do + local name = c:match("([^/]+)$") + name = name:match("([^%.]+)") + local config = load_config(c) + + if config then + create_config(i, config, name, c) + end + end + else + document.configs.visible = false + document.content_info.visible = true + end +end + function refresh() local packs_available = pack.get_available() packs_installed = pack.get_installed() - for i,k in ipairs(packs_available) do + for _, k in ipairs(packs_available) do table.insert(packs_installed, k) end diff --git a/res/preload.json b/res/preload.json index 8971103f..5efe0162 100644 --- a/res/preload.json +++ b/res/preload.json @@ -17,7 +17,9 @@ "gui/warning", "gui/error", "gui/cross", - "gui/refresh" + "gui/refresh", + "gui/folder_icon", + "gui/settings_icon" ], "fonts": [ { diff --git a/res/textures/gui/folder_icon.png b/res/textures/gui/folder_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6dd9a7a25e55ec06aabd0e1aaa5e33d67efe8c8e GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1en(96@sF~q|E?Ic4!1_ci0mH+=6v$Y(J@G1Bz z<}vGD$O)&%?^67Batdi}I&gYbI{SmWQ3p=BaY)RY*2Fcr|Hti`gW?kBn`El;PbluK5apu z({a1}Vywts3omw_S3I`G Date: Fri, 29 Nov 2024 18:18:31 +0300 Subject: [PATCH 2/5] refact content_menu.xml --- res/layouts/pages/content_menu.xml | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/res/layouts/pages/content_menu.xml b/res/layouts/pages/content_menu.xml index 9197ee21..cb95f1a1 100644 --- a/res/layouts/pages/content_menu.xml +++ b/res/layouts/pages/content_menu.xml @@ -20,17 +20,11 @@ - - - + - - - + - - - + From 3e07b13a4c026334eaabc14e0faae7625548e908 Mon Sep 17 00:00:00 2001 From: Xertis Date: Sat, 30 Nov 2024 16:59:12 +0300 Subject: [PATCH 3/5] minor update --- res/layouts/pages/content_menu.xml | 2 +- res/layouts/pages/content_menu.xml.lua | 70 +++++++++++++++----------- 2 files changed, 43 insertions(+), 29 deletions(-) diff --git a/res/layouts/pages/content_menu.xml b/res/layouts/pages/content_menu.xml index cb95f1a1..85dd54d0 100644 --- a/res/layouts/pages/content_menu.xml +++ b/res/layouts/pages/content_menu.xml @@ -13,7 +13,7 @@ size='32' margin='0,0,10,15' gravity='bottom-right' color='#FFFFFF50' hover-color='#FFFFFF10'/> - diff --git a/res/layouts/pages/content_menu.xml.lua b/res/layouts/pages/content_menu.xml.lua index 75a4e5de..bb000e98 100644 --- a/res/layouts/pages/content_menu.xml.lua +++ b/res/layouts/pages/content_menu.xml.lua @@ -1,5 +1,9 @@ local packs_installed = {} local pack_open = {} +local parsers = { + toml = toml, + json = json +} function on_open(params) refresh() @@ -45,14 +49,14 @@ end local function create_checkbox(id, name, cheaked) document.configs:add(string.format( "%s", - id, name, id, cheaked, name + id, name, id, cheaked, name:gsub("^%l", string.upper) )) end local function create_textbox(id, name, text) document.configs:add(string.format( "", - id .. "_label", name + id .. "_label", name:gsub("^%l", string.upper) )) document.configs:add(string.format( "%s", @@ -63,7 +67,7 @@ end local function create_trackbar(id, name, val) document.configs:add(string.format( "", - id .. "_label", name, val + id .. "_label", name:gsub("^%l", string.upper), val )) document.configs:add(string.format( "%s", @@ -79,30 +83,30 @@ local function create_label(id, text, color) )) else document.configs:add(string.format( - "", - text + "", + color, text )) end end local function create_config(i, config, name, path) - create_label(name, '[' .. name .. ']', "#008000") - pack_open[2][i] = {{}, path = path} + create_label(name, ('[' .. name .. ']'):upper(), "#FFFFFF") + pack_open[2][i] = {elements = {}, path = path} for _, a in ipairs(config.checkboxes) do create_checkbox(i .. '_' .. a[1], a[1], a[2]) - pack_open[2][i][1][a[1]] = type(a[2]) + pack_open[2][i]["elements"][a[1]] = type(a[2]) end create_label(nil, '', 0) for _, a in ipairs(config.trackbars) do create_trackbar(i .. '_' .. a[1], a[1], a[2]) create_label(nil, '', 0) - pack_open[2][i][1][a[1]] = type(a[2]) + pack_open[2][i]["elements"][a[1]] = type(a[2]) end for _, a in ipairs(config.textboxes) do create_textbox(i .. '_' .. a[1], a[1], a[2]) create_label(nil, '', 0) - pack_open[2][i][1][a[1]] = type(a[2]) + pack_open[2][i]["elements"][a[1]] = type(a[2]) end create_label(nil, '', 0) end @@ -115,12 +119,9 @@ local function load_config_file(path) return end - local value = file.read(path) - - if extension == "toml" then - return toml.parse(value), extension - elseif extension == "json" then - return json.parse(value), extension + if parsers[extension] then + local value = file.read(path) + return parsers[extension].parse(value), extension end end @@ -150,23 +151,33 @@ local function load_config(path) end end +local function valid_configs(path) + if file.exists(path) and file.isdir(path) then + for _, c in ipairs(file.list(path)) do + local extension = c:match("%.(%w+)$") + if parsers[extension] then + return true + end + end + end + return false +end + function set_value(name, id, value) local config_id = tonumber(id:match("^(%w+)_")) local elem_id = id:match("^[^_]+_(.+)$") - local type_val = pack_open[2][config_id][1][elem_id] + local type_val = pack_open[2][config_id]["elements"][elem_id] if type_val == 'number' then - document[id .. '_label'].text = string.format("%s (%s)", elem_id, value) + document[id .. '_label'].text = string.format("%s (%s)", elem_id:gsub("^%l", string.upper), value) end local path = pack_open[2][config_id].path local config, extension = load_config_file(path) config[name] = value - if extension == "toml" then - file.write(path, toml.tostring(config)) - elseif extension == "json" then - file.write(path, json.tostring(config)) + if parsers[extension] then + file.write(path, parsers[extension].tostring(config)) end end @@ -176,6 +187,7 @@ function open_pack(id) document.configs.visible = false document.content_info.visible = true + if valid_configs("config:" .. id) then document.open_config.enabled = true else document.open_config.enabled = false end if packinfo['dependencies'] == nil then document.dependencies.text = 'None' else document.dependencies.text = table.tostring(packinfo['dependencies']) end if packinfo['creator'] == '' then document.author.text = 'None' else document.author.text = packinfo['creator'] end @@ -185,13 +197,15 @@ end function open_config() local id = pack_open[1] - if (not document.configs.visible and id) and - (file.exists("config:" .. id) and #file.list("config:" .. id) > 0) then + local path = "config:" .. id + if (not document.configs.visible and id) and valid_configs(path) then document.configs:clear() document.configs.visible = true document.content_info.visible = false + local configs = file.list("config:" .. id) + for i, c in ipairs(configs) do local name = c:match("([^/]+)$") name = name:match("([^%.]+)") @@ -201,10 +215,10 @@ function open_config() create_config(i, config, name, c) end end - else - document.configs.visible = false - document.content_info.visible = true + return end + document.configs.visible = false + document.content_info.visible = true end function refresh() @@ -218,7 +232,7 @@ function refresh() local contents = document.contents contents:clear() - for i,id in ipairs(packs_installed) do + for i, id in ipairs(packs_installed) do local packinfo = pack.get_info(id) packinfo.id = id From 4133e6fd0a8bace0ffc0bf91de30e35c2f29469a Mon Sep 17 00:00:00 2001 From: Xertis <118364459+Xertis@users.noreply.github.com> Date: Mon, 9 Dec 2024 19:51:41 +0300 Subject: [PATCH 4/5] set markup --- res/layouts/pages/content_menu.xml.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/res/layouts/pages/content_menu.xml.lua b/res/layouts/pages/content_menu.xml.lua index bb000e98..dd07da39 100644 --- a/res/layouts/pages/content_menu.xml.lua +++ b/res/layouts/pages/content_menu.xml.lua @@ -78,19 +78,19 @@ end local function create_label(id, text, color) if id then document.configs:add(string.format( - "", + "", id, color, text )) else document.configs:add(string.format( - "", + "", color, text )) end end local function create_config(i, config, name, path) - create_label(name, ('[' .. name .. ']'):upper(), "#FFFFFF") + create_label(name, ('**[' .. name .. ']**'):upper(), "#FFFFFF") pack_open[2][i] = {elements = {}, path = path} for _, a in ipairs(config.checkboxes) do create_checkbox(i .. '_' .. a[1], a[1], a[2]) From 271271c059c6c1b4278417a452d48f75b01a6631 Mon Sep 17 00:00:00 2001 From: Xertis Date: Fri, 27 Dec 2024 10:13:37 +0300 Subject: [PATCH 5/5] add valid config names --- res/layouts/pages/content_menu.xml.lua | 31 +++++++++++++++++++------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/res/layouts/pages/content_menu.xml.lua b/res/layouts/pages/content_menu.xml.lua index dd07da39..6d730340 100644 --- a/res/layouts/pages/content_menu.xml.lua +++ b/res/layouts/pages/content_menu.xml.lua @@ -1,10 +1,14 @@ local packs_installed = {} local pack_open = {} -local parsers = { +local PARSERS = { toml = toml, json = json } +local CONFIG_NAMES = { + "config" +} + function on_open(params) refresh() end @@ -113,15 +117,26 @@ end local function load_config_file(path) - local extension = path:match("%.(%w+)$") + local function valid_name(file_name) + for _, name in ipairs(CONFIG_NAMES) do + if string.find(file_name, name) then + return true + end + end + + return false + end + + local extension = path:match("^.+%.(.+)$") + local name = path:match("([^/]+)%.([^%.]+)$") if not extension or file.isdir(path) then return end - if parsers[extension] then + if PARSERS[extension] and valid_name(name:lower()) then local value = file.read(path) - return parsers[extension].parse(value), extension + return PARSERS[extension].parse(value), extension end end @@ -154,8 +169,8 @@ end local function valid_configs(path) if file.exists(path) and file.isdir(path) then for _, c in ipairs(file.list(path)) do - local extension = c:match("%.(%w+)$") - if parsers[extension] then + local extension = c:match("^.+%.(.+)$") + if PARSERS[extension] then return true end end @@ -176,8 +191,8 @@ function set_value(name, id, value) local config, extension = load_config_file(path) config[name] = value - if parsers[extension] then - file.write(path, parsers[extension].tostring(config)) + if PARSERS[extension] then + file.write(path, PARSERS[extension].tostring(config)) end end