diff options
Diffstat (limited to 'plugins/select_colorscheme.lua')
-rw-r--r-- | plugins/select_colorscheme.lua | 128 |
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() |