aboutsummaryrefslogtreecommitdiff
path: root/plugins/settings.lua
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/settings.lua')
-rw-r--r--plugins/settings.lua102
1 files changed, 72 insertions, 30 deletions
diff --git a/plugins/settings.lua b/plugins/settings.lua
index a9fd1b9..62d1592 100644
--- a/plugins/settings.lua
+++ b/plugins/settings.lua
@@ -27,6 +27,7 @@ local FontsList = require "widget.fontslist"
local ItemsList = require "widget.itemslist"
local KeybindingDialog = require "widget.keybinddialog"
local Fonts = require "widget.fonts"
+local FilePicker = require "widget.filepicker"
local settings = {}
@@ -46,25 +47,28 @@ settings.type = {
SELECTION = 4,
LIST_STRINGS = 5,
BUTTON = 6,
- FONT = 7
+ FONT = 7,
+ FILE = 8,
+ DIRECTORY = 9
}
---@alias settings.types
----|>'settings.type.STRING'
----| 'settings.type.NUMBER'
----| 'settings.type.TOGGLE'
----| 'settings.type.SELECTION'
----| 'settings.type.LIST_STRINGS'
----| 'settings.type.BUTTON'
----| 'settings.type.FONT'
+---| `settings.type.STRING`
+---| `settings.type.NUMBER`
+---| `settings.type.TOGGLE`
+---| `settings.type.SELECTION`
+---| `settings.type.LIST_STRINGS`
+---| `settings.type.BUTTON`
+---| `settings.type.FONT`
+---| `settings.type.FILE`
---Represents a setting to render on a settings pane.
---@class settings.option
---@field public label string
---@field public description string
---@field public path string
----@field public type settings.types
----@field public default string | number | table<integer, string> | table<integer, integer>
+---@field public type settings.types | integer
+---@field public default string | number | boolean | table<integer, string> | table<integer, integer>
---@field public min number
---@field public max number
---@field public step number
@@ -76,6 +80,8 @@ settings.type = {
---@field public icon string
---@field public on_click nil | string | fun(button:string, x:integer, y:integer)
---@field public on_apply nil | fun(value:any)
+---@field public exists boolean
+---@field public filters table<integer,string>
settings.option = {
---Title displayed to the user eg: "My Option"
label = "",
@@ -108,7 +114,12 @@ settings.option = {
---Command or function executed when a BUTTON is clicked
on_click = nil,
---Optional function executed when the option value is applied.
- on_apply = nil
+ on_apply = nil,
+ ---When FILE or DIRECTORY this flag tells the path should exist.
+ exists = false,
+ ---Lua patterns used on FILE or DIRECTORY to filter browser results and
+ ---also force the selection to match one of the filters.
+ filters = {}
}
---Add a new settings section to the settings UI
@@ -655,18 +666,20 @@ local function get_installed_plugins()
for _, filename in ipairs(system.list_dir(plugin_dir) or {}) do
local valid = false
local file_info = system.get_file_info(plugin_dir .. "/" .. filename)
- if
- file_info.type == "file"
- and
- filename:match("%.lua$")
- and
- not filename:match("^language_")
- then
- valid = true
- filename = filename:gsub("%.lua$", "")
- elseif file_info.type == "dir" then
- if system.get_file_info(plugin_dir .. "/" .. filename .. "/init.lua") then
+ if file_info then
+ if
+ file_info.type == "file"
+ and
+ filename:match("%.lua$")
+ and
+ not filename:match("^language_")
+ then
valid = true
+ filename = filename:gsub("%.lua$", "")
+ elseif file_info.type == "dir" then
+ if system.get_file_info(plugin_dir .. "/" .. filename .. "/init.lua") then
+ valid = true
+ end
end
end
if valid then
@@ -691,7 +704,7 @@ local function get_installed_colors()
for _, filename in ipairs(system.list_dir(dir) or {}) do
local file_info = system.get_file_info(dir .. "/" .. filename)
if
- file_info.type == "file"
+ file_info and file_info.type == "file"
and
filename:match("%.lua$")
then
@@ -745,7 +758,8 @@ end
---@param name string
---@return string
local function prettify_name(name)
- return name:gsub("[%-_]", " "):gsub("%S+", capitalize_first)
+ name = name:gsub("[%-_]", " "):gsub("%S+", capitalize_first)
+ return name
end
---Load config options from the USERDIR user_settings.lua and store them on
@@ -974,7 +988,7 @@ local Settings = Widget:extend()
---Constructor
function Settings:new()
- Settings.super.new(self, false)
+ Settings.super.new(self, nil, false)
self.name = "Settings"
self.defer_draw = false
@@ -1142,6 +1156,34 @@ local function add_control(pane, option, plugin_name)
end
widget = fonts
found = true
+
+ elseif option.type == settings.type.FILE then
+ ---@type widget.label
+ Label(pane, option.label .. ":")
+ ---@type widget.filepicker
+ local file = FilePicker(pane, option_value or "")
+ if option.exists then
+ file:set_mode(FilePicker.mode.FILE_EXISTS)
+ else
+ file:set_mode(FilePicker.mode.FILE)
+ end
+ file.filters = option.filters or {}
+ widget = file
+ found = true
+
+ elseif option.type == settings.type.DIRECTORY then
+ ---@type widget.label
+ Label(pane, option.label .. ":")
+ ---@type widget.filepicker
+ local file = FilePicker(pane, option_value or "")
+ if option.exists then
+ file:set_mode(FilePicker.mode.DIRECTORY_EXISTS)
+ else
+ file:set_mode(FilePicker.mode.DIRECTORY)
+ end
+ file.filters = option.filters or {}
+ widget = file
+ found = true
end
if widget and type(path) ~= "nil" then
@@ -1206,7 +1248,7 @@ function Settings:load_core_settings()
for _, section in ipairs(settings.sections) do
local options = settings.core[section]
- ---@type widget
+ ---@type widget|widget.foldingbook.pane
local pane = self.core_sections:get_pane(section)
if not pane then
pane = self.core_sections:add_pane(section, section)
@@ -1674,21 +1716,21 @@ function Settings:update()
local prev_child = nil
for pos=#pane.container.childs, 1, -1 do
local child = pane.container.childs[pos]
- local x, y = 10, 10
+ local x, y = 10, (10 * SCALE)
if prev_child then
if
(prev_child:is(Label) and not prev_child.desc)
or
(child:is(Label) and child.desc)
then
- y = prev_child:get_bottom() + 10
+ y = prev_child:get_bottom() + (10 * SCALE)
else
- y = prev_child:get_bottom() + 40
+ y = prev_child:get_bottom() + (30 * SCALE)
end
end
if child:is(Line) then
x = 0
- elseif child:is(ItemsList) then
+ elseif child:is(ItemsList) or child:is(FilePicker) or child:is(TextBox) then
child:set_size(pane.container:get_width() - 20, child.size.y)
end
child:set_position(x, y)