lite-xl/release_files/addons/plugins/select_colorscheme.lua

133 lines
3.6 KiB
Lua

-- mod-version:3
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")
if name and name ~= "" then
core.reload_module(make_color_module_name(name))
Settings.color_scheme = name
end
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", {
submit = color_scheme_submit, suggest = color_scheme_suggest
})
end,
})
-- ----------------------------------------------------------------
Settings:init()