aboutsummaryrefslogtreecommitdiff
path: root/plugins/select_colorscheme.lua
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/select_colorscheme.lua')
-rw-r--r--plugins/select_colorscheme.lua128
1 files changed, 128 insertions, 0 deletions
diff --git a/plugins/select_colorscheme.lua b/plugins/select_colorscheme.lua
new file mode 100644
index 0000000..f20d949
--- /dev/null
+++ b/plugins/select_colorscheme.lua
@@ -0,0 +1,128 @@
+-- mod-version:2 -- lite-xl 2.0
+local core = require "core"
+local command = require "core.command"
+local common = require "core.common"
+local style = require "core.style"
+local CommandView = require "core.commandview"
+
+-- ----------------------------------------------------------------
+local PATH_CONFIG = USERDIR .. "/color_settings.lua"
+
+local Settings = {}
+Settings.color_scheme = ""
+Settings.color_list = {}
+local color_default = {name = "Default", module = "core.style"}
+local plugin_enable = false
+
+-- =========================Proxy method==========================
+local move_suggestion_idx = CommandView.move_suggestion_idx
+
+function CommandView:move_suggestion_idx(dir)
+ move_suggestion_idx(self, dir)
+ if plugin_enable then
+ local color_name = self.suggestions[self.suggestion_idx].text
+ Settings:change_color(color_name)
+ end
+end
+
+local on_quit_project = core.on_quit_project
+
+function core.on_quit_project()
+ Settings:save_settings()
+ on_quit_project()
+end
+-- ----------------------------------------------------------------
+
+function Settings:get_color_list()
+ return self.color_list
+end
+
+function Settings:init()
+ self:load_settings()
+ self:make_color_list()
+end
+
+function Settings:make_color_list()
+ for _, root_dir in ipairs {DATADIR, USERDIR} do
+ local plugin_dir = root_dir .. "/colors"
+ for _, filename in ipairs(system.list_dir(plugin_dir) or {}) do
+ table.insert(self.color_list, filename:match("(.-)%.lua$"))
+ end
+ end
+ table.insert(self.color_list, color_default.name)
+end
+
+function Settings:is_change_color(color_name)
+ return not (self.color_scheme == color_name)
+end
+
+function Settings:get_color_scheme()
+ return (self.color_scheme == "") and color_default.name or self.color_scheme
+end
+
+local function make_color_module_name(name)
+ return (name == color_default.name) and color_default.module or "colors."..name
+end
+
+function Settings:change_color(name)
+ if self:is_change_color(name) then
+ core.reload_module(make_color_module_name(name))
+ self.color_scheme = name
+ end
+end
+
+function Settings:save_settings()
+ local fp = io.open(PATH_CONFIG, "w")
+ if fp then
+ fp:write(self.color_scheme)
+ fp:close()
+ end
+end
+
+function Settings:load_settings()
+ local fp = io.open(PATH_CONFIG, "r")
+ if fp then
+ local name = fp:read("*a")
+ core.reload_module(make_color_module_name(name))
+ Settings.color_scheme = name
+ fp:close()
+ end
+end
+
+-- -------------------------------Utility--------------------------
+local function table_remove_value(list, value)
+ for i=1, #list do
+ if list[i] == value then
+ table.remove(list, i)
+ break
+ end
+ end
+end
+-- ----------------------------------------------------------------
+local function normalize_color_list(list)
+ table_remove_value(list, Settings:get_color_scheme())
+ table.sort(list, function(a, b) return string.lower(a) > string.lower(b) end)
+ return {Settings:get_color_scheme(), table.unpack(list)}
+end
+-- =========================Add Commands==========================
+local color_scheme_submit = function(text, item)
+ if item then
+ Settings:change_color(item.text)
+ plugin_enable = false
+ end
+end
+
+local color_scheme_suggest = function(text)
+ plugin_enable = true
+ local res_list = common.fuzzy_match(Settings:get_color_list(), text)
+ return normalize_color_list(res_list)
+end
+
+command.add(nil, {
+ ["ui:color scheme"] = function()
+ core.command_view:enter("Select color scheme", color_scheme_submit, color_scheme_suggest)
+ end,
+ })
+-- ----------------------------------------------------------------
+
+Settings:init()