aboutsummaryrefslogtreecommitdiff
path: root/plugins/nonicons.lua
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/nonicons.lua')
-rw-r--r--plugins/nonicons.lua160
1 files changed, 104 insertions, 56 deletions
diff --git a/plugins/nonicons.lua b/plugins/nonicons.lua
index 9a1e963..b8b01bc 100644
--- a/plugins/nonicons.lua
+++ b/plugins/nonicons.lua
@@ -1,11 +1,57 @@
--- mod-version:2 -- lite-xl 2.0
+-- mod-version:3
+-- Author: Jipok
+-- Doesn't work well with scaling mode == "ui"
+
local core = require "core"
local common = require "core.common"
+local config = require "core.config"
local style = require "core.style"
local TreeView = require "plugins.treeview"
+local Node = require "core.node"
+-- Config
+config.plugins.nonicons = common.merge({
+ use_default_dir_icons = false,
+ use_default_chevrons = false,
+ draw_treeview_icons = true,
+ draw_tab_icons = true,
+ -- The config specification used by the settings gui
+ config_spec = {
+ name = "Nonicons",
+ {
+ label = "Use Default Directory Icons",
+ description = "When enabled does not use nonicon directory icons.",
+ path = "use_default_dir_icons",
+ type = "toggle",
+ default = false
+ },
+ {
+ label = "Use Default Chevrons",
+ description = "When enabled does not use nonicon expand/collapse arrow icons.",
+ path = "use_default_chevrons",
+ type = "toggle",
+ default = false
+ },
+ {
+ label = "Draw Treeview Icons",
+ description = "Enables file related icons on the treeview.",
+ path = "draw_treeview_icons",
+ type = "toggle",
+ default = true
+ },
+ {
+ label = "Draw Tab Icons",
+ description = "Adds file related icons to tabs.",
+ path = "draw_tab_icons",
+ type = "toggle",
+ default = true
+ }
+ }
+}, config.plugins.nonicons)
local icon_font = renderer.font.load(USERDIR.."/fonts/nonicons.ttf", 15 * SCALE)
+local chevron_width = icon_font:get_width("")
+local previous_scale = SCALE
local extension_icons = {
[".lua"] = { "#51a0cf", "" },
[".md"] = { "#519aba", "" }, -- Markdown
@@ -39,16 +85,16 @@ local extension_icons = {
[".swift"] = { "#e37933", "" },
[".ts"] = { "#519aba", "" }, -- TypeScript
[".elm"] = { "#519aba", "" },
- [".diff"] = { "#41535b", "" }, [".patch"] = { "#41535b", "" },
+ [".diff"] = { "#41535b", "" },
[".ex"] = { "#a074c4", "" }, [".exs"] = { "#a074c4", "" }, -- Elixir
-- Following without special icon:
[".awk"] = { "#4d5a5e", "" },
[".nim"] = { "#F88A02", "" },
[".zig"] = { "#cbcb41", "" },
-
}
local known_names_icons = {
["changelog"] = { "#657175", "" }, ["changelog.txt"] = { "#4d5a5e", "" },
+ ["changelog.md"] = { "#519aba", "" },
["makefile"] = { "#6d8086", "" },
["dockerfile"] = { "#296478", "" },
["docker-compose.yml"] = { "#4289a1", "" },
@@ -68,66 +114,68 @@ for k, v in pairs(known_names_icons) do
v[1] = { common.color(v[1]) }
end
--- Replace original draw
-function TreeView:draw()
- if not self.visible then return end
- self:draw_background(style.background2)
-
- local icon_width = icon_font:get_width("")
- local spacing = icon_font:get_width("") / 2
-
- local doc = core.active_view.doc
- local active_filename = doc and system.absolute_path(doc.filename or "")
-
- for item, x,y,w,h in self:each_item() do
- local color = style.text
-
- -- highlight active_view doc
- if item.abs_filename == active_filename then
- color = style.accent
+-- Override function to change default icons for dirs, special extensions and names
+local TreeView_get_item_icon = TreeView.get_item_icon
+function TreeView:get_item_icon(item, active, hovered)
+ local icon, font, color = TreeView_get_item_icon(self, item, active, hovered)
+ if previous_scale ~= SCALE then
+ icon_font:set_size(
+ icon_font:get_size() * (SCALE / previous_scale)
+ )
+ chevron_width = icon_font:get_width("")
+ previous_scale = SCALE
+ end
+ if not config.plugins.nonicons.use_default_dir_icons then
+ icon = "" -- unicode 61766
+ font = icon_font
+ color = style.text
+ if item.type == "dir" then
+ icon = item.expanded and "" or "" -- unicode U+F23C and U+F23B
end
-
- -- hovered item background
- if item == self.hovered_item then
- renderer.draw_rect(x, y, w, h, style.line_highlight)
+ end
+ if config.plugins.nonicons.draw_treeview_icons then
+ local custom_icon = known_names_icons[item.name:lower()]
+ if custom_icon == nil then
+ custom_icon = extension_icons[item.name:match("^.+(%..+)$")]
+ end
+ if custom_icon ~= nil then
+ color = custom_icon[1]
+ icon = custom_icon[2]
+ font = icon_font
+ end
+ if active or hovered then
color = style.accent
end
+ end
+ return icon, font, color
+end
- -- icons
- x = x + item.depth * style.padding.x + style.padding.x
+-- Override function to draw chevrons if setting is disabled
+local TreeView_draw_item_chevron = TreeView.draw_item_chevron
+function TreeView:draw_item_chevron(item, active, hovered, x, y, w, h)
+ if not config.plugins.nonicons.use_default_chevrons then
if item.type == "dir" then
- local icon1 = item.expanded and "" or "" -- unicode 61726 and 61728
- local icon2 = item.expanded and "" or "" -- unicode U+F23C and U+F23B
- x = x - spacing
- common.draw_text(icon_font, color, icon1, nil, x, y, 0, h)
- x = x + style.padding.x + spacing
- common.draw_text(icon_font, color, icon2, nil, x, y, 0, h)
- x = x + icon_width
- else
- x = x + style.padding.x
- -- default icon
- local icon = "" -- unicode 61766
- local icon_color = color
- -- icon depending on the file extension or full name
- local custom_icon = known_names_icons[item.name:lower()]
- if custom_icon == nil then
- custom_icon = extension_icons[item.name:match("^.+(%..+)$")]
- end
- if custom_icon ~= nil then
- icon_color = custom_icon[1]
- icon = custom_icon[2]
- end
- common.draw_text(icon_font, icon_color, icon, nil, x, y, 0, h)
- x = x + icon_width
+ local chevron_icon = item.expanded and "" or ""
+ local chevron_color = hovered and style.accent or style.text
+ common.draw_text(icon_font, chevron_color, chevron_icon, nil, x, y, 0, h)
end
-
- -- text
- x = x + spacing
- x = common.draw_text(style.font, color, item.name, nil, x, y, 0, h)
+ return chevron_width + style.padding.x/4
end
+ return TreeView_draw_item_chevron(self, item, active, hovered, x, y, w, h)
+end
- self:draw_scrollbar()
- if self.hovered_item and self.tooltip.alpha > 0 then
- core.root_view:defer_draw(self.draw_tooltip, self)
+-- Override function to draw icons in tabs titles if setting is enabled
+local Node_draw_tab_title = Node.draw_tab_title
+function Node:draw_tab_title(view, font, is_active, is_hovered, x, y, w, h)
+ if config.plugins.nonicons.draw_tab_icons then
+ local padx = chevron_width + style.padding.x/2
+ local tx = x + padx -- Space for icon
+ w = w - padx
+ Node_draw_tab_title(self, view, font, is_active, is_hovered, tx, y, w, h)
+ if (view == nil) or (view.doc == nil) then return end
+ local item = { type = "file", name = view.doc:get_name() }
+ TreeView:draw_item_icon(item, false, is_hovered, x, y, w, h)
+ else
+ Node_draw_tab_title(self, view, font, is_active, is_hovered, x, y, w, h)
end
end