aboutsummaryrefslogtreecommitdiff
path: root/plugins/nonicons.lua
blob: 82a0242bce7f966ccacbb5387ca42c8fe9b77cf6 (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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
-- mod-version:3
-- Author: Jipok
-- Doesn't work well with scaling mode == "ui"

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"

local nonicons = require "libraries.font_nonicons"

-- 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(nonicons.path, 15 * SCALE)
local map = nonicons.utf8
local chevron_width = icon_font:get_width(map["chevron-down-16"])
local previous_scale = SCALE
local extension_icons = {
  [".lua"] = { "#51a0cf", "lua-16" },
  [".md"]  = { "#519aba", "markdown-16" }, -- Markdown
  [".cpp"] = { "#519aba", "c-plusplus-16" },
  [".c"]   = { "#599eff", "c-16" },
  [".h"] = { "#599eff", "heading-16" },
  [".py"]  = { "#3572A5", "python-16" }, -- Python
  [".pyc"]  = { "#519aba", "python-16" }, [".pyd"]  = { "#519aba", "python-16" },
  [".php"] = { "#a074c4", "php-16" },
  [".cs"] = { "#596706", "c-sharp-16" },  -- C#
  [".conf"] = { "#6d8086", "gear-16" }, [".cfg"] = { "#6d8086", "gear-16" },
  [".toml"] = { "#6d8086", "toml-16" },
  [".yaml"] = { "#6d8086", "yaml-16" }, [".yml"] = { "#6d8086", "yaml-16" },
  [".json"] = { "#854CC7", "json-16" },
  [".css"] = { "#563d7c", "css-16" },
  [".html"] = { "#e34c26", "html-16" },
  [".js"] = { "#cbcb41", "javascript-16" }, [".cjs"] = { "#cbcb41", "javascript-16" }, [".mjs"] = { "#cbcb41", "javascript-16" },  -- JavaScript
  [".go"] = { "#519aba", "go-16" },
  [".jpg"] = { "#a074c4", "image-16" }, [".png"] = { "#a074c4", "image-16" },
  [".sh"] = { "#4d5a5e", "terminal-16" },  -- Shell
  [".java"] = { "#cc3e44", "java-16" },
  [".scala"] = { "#cc3e44", "scala-16" },
  [".kt"] = { "#F88A02", "kotlin-16" },  -- Kotlin
  [".pl"] = { "#519aba", "perl-16" }, [".pm"] = { "#519aba", "perl-16" },  -- Perl
  [".r"] = { "#358a5b", "r-16" },
  [".rake"] = { "#701516", "ruby-16" },
  [".rb"] = { "#701516", "ruby-16" },  -- Ruby
  [".rs"] = { "#dea584", "rust-16" },  -- Rust
  [".rss"] = { "#cc3e44", "rss-16" },
  [".sql"] = { "#dad8d8", "database-16" },
  [".swift"] = { "#e37933", "swift-16" },
  [".ts"] = { "#519aba", "typescript-16" },  -- TypeScript
  [".elm"] = { "#519aba", "elm-16" },
  [".diff"] = { "#41535b", "file-diff-16" },
  [".ex"] = { "#a074c4", "elixir-16" }, [".exs"] = { "#a074c4", "elixir-16" },  -- Elixir
  [".vim"] = { "#8f00ff", "vim-16" },
  -- Following without special icon:
  [".awk"] = { "#4d5a5e", "code-16" },
  [".nim"] = { "#F88A02", "code-16" },
  [".zig"] = { "#cbcb41", "code-16" },
  [".j2"] = { "#ffff00", "milestone-16" },
  [".ini"] = { "#ffffff", "pencil-16" },
  [".fish"] = { "#ca2c92", "terminal-16" },
  [".bash"] = { "#4169e1", "terminal-16" },
}
local known_names_icons = {
  ["changelog"] = { "#657175", "history-16" }, ["changelog.txt"] = { "#4d5a5e", "history-16" },
  ["changelog.md"] = { "#519aba", "history-16" },
  ["makefile"] = { "#6d8086", "terminal-16" },
  ["dockerfile"] = { "#296478", "docker-16" },
  ["docker-compose.yml"] = { "#4289a1", "docker-16" },
  ["license"] = { "#d0bf41", "file-badge-16" }, ["copying"] = { "#d0bf41", "file-badge-16" },
  ["cmakelists.txt"] = { "#6d8086", "gear-16" },
  ["readme.md"] = { "#72b886", "file-16" }, ["readme"] = { "#72b886", "file-16" },
  ["init.lua"] = { "#2d6496", "lua-16" },
  ["setup.py"] = { "#559dd9", "python-16" },
  ["build.zig"] = { "#6d8086", "gear-16" },
}

-- Preparing colors
for _, v in pairs(extension_icons) do
  v[1] = { common.color(v[1]) }
end
for _, v in pairs(known_names_icons) do
  v[1] = { common.color(v[1]) }
end

-- 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(map["chevron-down-16"])
    previous_scale = SCALE
  end
  if not config.plugins.nonicons.use_default_dir_icons then
    icon = map["file-16"] -- unicode 61766
    font = icon_font
    color = style.text
    if item.type == "dir" then
      icon = item.expanded and map["file-directory-open-fill-16"] or map["file-directory-fill-16"] -- unicode U+F23C and U+F23B
    end
  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 = map[custom_icon[2]]
      font = icon_font
    end
    if active or hovered then
      color = style.accent
    end
  end
  return icon, font, color
end

-- 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 chevron_icon = item.expanded and "chevron-down-16" or "chevron-right-16"
      local chevron_color = hovered and style.accent or style.text
      common.draw_text(icon_font, chevron_color, map[chevron_icon], nil, x, y, 0, h)
    end
    return chevron_width + style.padding.x/4
  end
  return TreeView_draw_item_chevron(self, item, active, hovered, x, y, w, h)
end

-- 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