Skip to content

Commit

Permalink
Merge pull request #387 from Xertis/main
Browse files Browse the repository at this point in the history
Adding a config tab to content_menu
  • Loading branch information
MihailRis authored Dec 29, 2024
2 parents dff2f01 + 271271c commit 3c9c14e
Show file tree
Hide file tree
Showing 5 changed files with 207 additions and 14 deletions.
28 changes: 17 additions & 11 deletions res/layouts/pages/content_menu.xml
Original file line number Diff line number Diff line change
@@ -1,28 +1,34 @@

<container size='1000,580' color='#0F1E2DB2' interval='5' context='menu'>
<panel id='contents' pos='15,15' size='440,490' color='0' max-length='455' scrollable='true'>
<!-- content is generated in script -->
</panel>
<button pos='15,525' size='440,40' onclick='menu:back()'>@Back</button>
<button pos='485,525' size='500,40' onclick='core.open_folder("user:content")'>@Open content folder</button>

<panel id='search_panel' size='440,35' pos='15,485' interval='1' color='#0000004C'>
<textbox id='search_textbox' multiline='false' size='440,25' sub-consumer='function(x) refresh_search() end'></textbox>
</panel>

<panel id='content_info' pos='485,15' size='440,406' color='0' max-length='406' scrollable='true'>
<image onclick='core.open_folder("user:content")' interactive='true' src='gui/folder_icon'
size='32' margin='0,0,10,15' gravity='bottom-right'
color='#FFFFFF50' hover-color='#FFFFFF10'/>

<image id="open_config" enabled="false" onclick='open_config()' interactive='true' src='gui/settings_icon'
size='32' margin='0,0,52,15' gravity='bottom-right'
color='#FFFFFF50' hover-color='#FFFFFF10'/>

<panel id='content_info' pos='485,15' size='440,506' color='0' max-length='506' scrollable='true'>
<label>@Creator</label>
<label id='author' multiline="true" color='#8C8C8C'>None</label>
<label></label>
<label></label>
<label>@Version</label>
<label margin="0,50,0,0">@Version</label>
<label id='version' multiline="true" color='#8C8C8C'>None</label>
<label></label>
<label></label>
<label>@Description</label>
<label margin="0,50,0,0">@Description</label>
<label id='description' multiline="true" color='#8C8C8C'>None</label>
<label></label>
<label></label>
<label>@Dependencies</label>
<label margin="0,50,0,0">@Dependencies</label>
<label id='dependencies' multiline="true" color='#8C8C8C'>None</label>
</panel>

<panel id='configs' visible='false' pos='485,15' size='440,506' color='0' max-length='506' scrollable='true'>
<!-- content is generated in script -->
</panel>
</container>
189 changes: 187 additions & 2 deletions res/layouts/pages/content_menu.xml.lua
Original file line number Diff line number Diff line change
@@ -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()
Expand Down Expand Up @@ -41,28 +50,204 @@ function refresh_search()
end
end

local function create_checkbox(id, name, cheaked)
document.configs:add(string.format(
"<checkbox id='%s' consumer='function(x) set_value(\"%s\", \"%s\", x) end' checked='%s'>%s</checkbox>",
id, name, id, cheaked, name:gsub("^%l", string.upper)
))
end

local function create_textbox(id, name, text)
document.configs:add(string.format(
"<label id='%s'>%s</label>",
id .. "_label", name:gsub("^%l", string.upper)
))
document.configs:add(string.format(
"<textbox id='%s' consumer='function(x) set_value(\"%s\", \"%s\", x) end' hint='%s'>%s</textbox>",
id, name, id, name, text
))
end

local function create_trackbar(id, name, val)
document.configs:add(string.format(
"<label id='%s'>%s (%s)</label>",
id .. "_label", name:gsub("^%l", string.upper), val
))
document.configs:add(string.format(
"<trackbar id='%s' consumer='function(x) set_value(\"%s\", \"%s\", x) end' value='%s' min='0' max='1000' step='10'>%s</trackbar>",
id, name, id, val, name
))
end

local function create_label(id, text, color)
if id then
document.configs:add(string.format(
"<label markup='md' id='%s' color='%s'>%s</label>",
id, color, text
))
else
document.configs:add(string.format(
"<label markup='md' color='%s'>%s</label>",
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
if packinfo['version'] == nil then document.version.text = 'None' else document.version.text = packinfo['version'] end
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
Expand Down
4 changes: 3 additions & 1 deletion res/preload.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@
"gui/warning",
"gui/error",
"gui/cross",
"gui/refresh"
"gui/refresh",
"gui/folder_icon",
"gui/settings_icon"
],
"fonts": [
{
Expand Down
Binary file added res/textures/gui/folder_icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added res/textures/gui/settings_icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 3c9c14e

Please sign in to comment.