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