aboutsummaryrefslogtreecommitdiff
path: root/plugins/select_colorscheme.lua
blob: f20d949c09e497ce84e90202ffa6dc963c6e9683 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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()