diff --git a/res/layouts/pages/content_menu.xml b/res/layouts/pages/content_menu.xml
index af15b32c..85dd54d0 100644
--- a/res/layouts/pages/content_menu.xml
+++ b/res/layouts/pages/content_menu.xml
@@ -1,28 +1,34 @@
+
-
-
+
+
+
+
+
-
-
-
+
-
-
-
+
-
-
-
+
+
+
+
+
diff --git a/res/layouts/pages/content_menu.xml.lua b/res/layouts/pages/content_menu.xml.lua
index 130b7387..6d730340 100644
--- a/res/layouts/pages/content_menu.xml.lua
+++ b/res/layouts/pages/content_menu.xml.lua
@@ -1,4 +1,13 @@
local packs_installed = {}
+local pack_open = {}
+local PARSERS = {
+ toml = toml,
+ json = json
+}
+
+local CONFIG_NAMES = {
+ "config"
+}
function on_open(params)
refresh()
@@ -41,9 +50,159 @@ function refresh_search()
end
end
+local function create_checkbox(id, name, cheaked)
+ document.configs:add(string.format(
+ "%s",
+ 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:gsub("^%l", string.upper)
+ ))
+ 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:gsub("^%l", string.upper), 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(
+ "",
+ color, text
+ ))
+ end
+end
+
+local function create_config(i, config, name, 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]["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]["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]["elements"][a[1]] = type(a[2])
+ end
+ create_label(nil, '', 0)
+end
+
+
+local function load_config_file(path)
+ 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] and valid_name(name:lower()) then
+ local value = file.read(path)
+ return PARSERS[extension].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
+
+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("^.+%.(.+)$")
+ 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]["elements"][elem_id]
+
+ if type_val == 'number' then
+ 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 PARSERS[extension] then
+ file.write(path, PARSERS[extension].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 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
@@ -51,18 +210,44 @@ 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]
+ 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("([^%.]+)")
+ local config = load_config(c)
+
+ if config then
+ create_config(i, config, name, c)
+ end
+ end
+ return
+ end
+ document.configs.visible = false
+ document.content_info.visible = true
+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
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
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 00000000..6dd9a7a2
Binary files /dev/null and b/res/textures/gui/folder_icon.png differ
diff --git a/res/textures/gui/settings_icon.png b/res/textures/gui/settings_icon.png
new file mode 100644
index 00000000..6a7aea33
Binary files /dev/null and b/res/textures/gui/settings_icon.png differ