Skip to content

Commit 129c349

Browse files
committed
feat(#2948): add decorator registry and order
1 parent 919a0a3 commit 129c349

15 files changed

+152
-94
lines changed

doc/nvim-tree-lua.txt

-1
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,6 @@ Following is the default configuration. See |nvim-tree-opts| for details. >lua
417417
},
418418
},
419419
renderer = {
420-
user_decorators = {},
421420
add_trailing = false,
422421
group_empty = false,
423422
full_name = false,

lua/nvim-tree.lua

-1
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,6 @@ local DEFAULT_OPTS = { -- BEGIN_DEFAULT_OPTS
276276
},
277277
},
278278
renderer = {
279-
user_decorators = {},
280279
add_trailing = false,
281280
group_empty = false,
282281
full_name = false,

lua/nvim-tree/api.lua

+5
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ local events = require("nvim-tree.events")
77
local help = require("nvim-tree.help")
88
local keymap = require("nvim-tree.keymap")
99
local notify = require("nvim-tree.notify")
10+
local decorator_registry = require("nvim-tree.renderer.decorator.registry")
1011

1112
local DirectoryNode = require("nvim-tree.node.directory")
1213
local FileLinkNode = require("nvim-tree.node.file-link")
@@ -312,6 +313,10 @@ Api.commands.get = wrap(function()
312313
return require("nvim-tree.commands").get()
313314
end)
314315

316+
-- TODO provide a registration convenience to hide classic
317+
-- TODO add doc
315318
Api.decorator.BaseDecorator = require("nvim-tree.renderer.decorator.user") --[[@as nvim_tree.api.decorator.BaseDecorator ]]
319+
Api.decorator.register = decorator_registry.register
320+
Api.decorator.unregister = decorator_registry.unregister
316321

317322
return Api

lua/nvim-tree/renderer/builder.lua

+11-22
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,11 @@
1+
local decorator_registry = require("nvim-tree.renderer.decorator.registry")
12
local notify = require("nvim-tree.notify")
23
local utils = require("nvim-tree.utils")
34
local view = require("nvim-tree.view")
45

56
local Class = require("nvim-tree.classic")
67
local DirectoryNode = require("nvim-tree.node.directory")
7-
8-
local DecoratorBookmarks = require("nvim-tree.renderer.decorator.bookmarks")
9-
local DecoratorCopied = require("nvim-tree.renderer.decorator.copied")
10-
local DecoratorCut = require("nvim-tree.renderer.decorator.cut")
11-
local DecoratorDiagnostics = require("nvim-tree.renderer.decorator.diagnostics")
12-
local DecoratorGit = require("nvim-tree.renderer.decorator.git")
13-
local DecoratorModified = require("nvim-tree.renderer.decorator.modified")
14-
local DecoratorHidden = require("nvim-tree.renderer.decorator.hidden")
15-
local DecoratorOpened = require("nvim-tree.renderer.decorator.opened")
8+
local DecoratorUser = require("nvim-tree.renderer.decorator.user")
169

1710
local pad = require("nvim-tree.renderer.components.padding")
1811

@@ -56,21 +49,17 @@ function Builder:new(args)
5649
self.signs = {}
5750
self.extmarks = {}
5851
self.virtual_lines = {}
59-
self.decorators = {
60-
-- priority order
61-
DecoratorCut(self.explorer),
62-
DecoratorCopied(self.explorer),
63-
DecoratorDiagnostics(self.explorer),
64-
DecoratorBookmarks(self.explorer),
65-
DecoratorModified(self.explorer),
66-
DecoratorHidden(self.explorer),
67-
DecoratorOpened(self.explorer),
68-
DecoratorGit(self.explorer),
69-
}
7052
self.hidden_display = Builder:setup_hidden_display_function(self.explorer.opts)
7153

72-
for _, user_decorator in ipairs(args.explorer.opts.renderer.user_decorators) do
73-
table.insert(self.decorators, user_decorator.class())
54+
-- lowest priority is registered first
55+
self.decorators = {}
56+
local decorator_args = { explorer = self.explorer }
57+
for _, d in ipairs(decorator_registry.registered) do
58+
if d:is(DecoratorUser) then
59+
table.insert(self.decorators, 1, d())
60+
else
61+
table.insert(self.decorators, 1, d(decorator_args))
62+
end
7463
end
7564
end
7665

lua/nvim-tree/renderer/decorator/bookmarks.lua

+7-6
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,24 @@ local Decorator = require("nvim-tree.renderer.decorator")
44
---@field private explorer Explorer
55
---@field private icon HighlightedString?
66
local DecoratorBookmarks = Decorator:extend()
7+
DecoratorBookmarks.name = "Bookmarks"
78

89
---@class DecoratorBookmarks
910
---@overload fun(explorer: Explorer): DecoratorBookmarks
1011

1112
---@protected
12-
---@param explorer Explorer
13-
function DecoratorBookmarks:new(explorer)
14-
self.explorer = explorer
13+
---@param args DecoratorArgs
14+
function DecoratorBookmarks:new(args)
15+
self.explorer = args.explorer
1516

16-
---@type DecoratorArgs
17-
local args = {
17+
---@type AbstractDecoratorArgs
18+
local a = {
1819
enabled = true,
1920
highlight_range = self.explorer.opts.renderer.highlight_bookmarks or "none",
2021
icon_placement = self.explorer.opts.renderer.icons.bookmarks_placement or "none",
2122
}
2223

23-
DecoratorBookmarks.super.new(self, args)
24+
DecoratorBookmarks.super.new(self, a)
2425

2526
if self.explorer.opts.renderer.icons.show.bookmarks then
2627
self.icon = {

lua/nvim-tree/renderer/decorator/copied.lua

+7-6
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,24 @@ local Decorator = require("nvim-tree.renderer.decorator")
33
---@class (exact) DecoratorCopied: Decorator
44
---@field private explorer Explorer
55
local DecoratorCopied = Decorator:extend()
6+
DecoratorCopied.name = "Copied"
67

78
---@class DecoratorCopied
89
---@overload fun(explorer: Explorer): DecoratorCopied
910

1011
---@protected
11-
---@param explorer Explorer
12-
function DecoratorCopied:new(explorer)
13-
self.explorer = explorer
12+
---@param args DecoratorArgs
13+
function DecoratorCopied:new(args)
14+
self.explorer = args.explorer
1415

15-
---@type DecoratorArgs
16-
local args = {
16+
---@type AbstractDecoratorArgs
17+
local a = {
1718
enabled = true,
1819
highlight_range = self.explorer.opts.renderer.highlight_clipboard or "none",
1920
icon_placement = "none",
2021
}
2122

22-
DecoratorCopied.super.new(self, args)
23+
DecoratorCopied.super.new(self, a)
2324
end
2425

2526
---Copied highlight: renderer.highlight_clipboard and node is copied

lua/nvim-tree/renderer/decorator/cut.lua

+7-6
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,24 @@ local Decorator = require("nvim-tree.renderer.decorator")
33
---@class (exact) DecoratorCut: Decorator
44
---@field private explorer Explorer
55
local DecoratorCut = Decorator:extend()
6+
DecoratorCut.name = "Cut"
67

78
---@class DecoratorCut
89
---@overload fun(explorer: Explorer): DecoratorCut
910

1011
---@protected
11-
---@param explorer Explorer
12-
function DecoratorCut:new(explorer)
13-
self.explorer = explorer
12+
---@param args DecoratorArgs
13+
function DecoratorCut:new(args)
14+
self.explorer = args.explorer
1415

15-
---@type DecoratorArgs
16-
local args = {
16+
---@type AbstractDecoratorArgs
17+
local a = {
1718
enabled = true,
1819
highlight_range = self.explorer.opts.renderer.highlight_clipboard or "none",
1920
icon_placement = "none",
2021
}
2122

22-
DecoratorCut.super.new(self, args)
23+
DecoratorCut.super.new(self, a)
2324
end
2425

2526
---Cut highlight: renderer.highlight_clipboard and node is cut

lua/nvim-tree/renderer/decorator/diagnostics.lua

+7-6
Original file line numberDiff line numberDiff line change
@@ -34,23 +34,24 @@ local ICON_KEYS = {
3434
---@field private explorer Explorer
3535
---@field private diag_icons HighlightedString[]?
3636
local DecoratorDiagnostics = Decorator:extend()
37+
DecoratorDiagnostics.name = "Diagnostics"
3738

3839
---@class DecoratorDiagnostics
3940
---@overload fun(explorer: Explorer): DecoratorDiagnostics
4041

4142
---@protected
42-
---@param explorer Explorer
43-
function DecoratorDiagnostics:new(explorer)
44-
self.explorer = explorer
43+
---@param args DecoratorArgs
44+
function DecoratorDiagnostics:new(args)
45+
self.explorer = args.explorer
4546

46-
---@type DecoratorArgs
47-
local args = {
47+
---@type AbstractDecoratorArgs
48+
local a = {
4849
enabled = true,
4950
highlight_range = self.explorer.opts.renderer.highlight_diagnostics or "none",
5051
icon_placement = self.explorer.opts.renderer.icons.diagnostics_placement or "none",
5152
}
5253

53-
DecoratorDiagnostics.super.new(self, args)
54+
DecoratorDiagnostics.super.new(self, a)
5455

5556
if not self.enabled then
5657
return

lua/nvim-tree/renderer/decorator/git.lua

+7-6
Original file line numberDiff line numberDiff line change
@@ -19,23 +19,24 @@ local DirectoryNode = require("nvim-tree.node.directory")
1919
---@field private icons_by_status GitIconsByStatus?
2020
---@field private icons_by_xy GitIconsByXY?
2121
local DecoratorGit = Decorator:extend()
22+
DecoratorGit.name = "Git"
2223

2324
---@class DecoratorGit
2425
---@overload fun(explorer: Explorer): DecoratorGit
2526

2627
---@protected
27-
---@param explorer Explorer
28-
function DecoratorGit:new(explorer)
29-
self.explorer = explorer
28+
---@param args DecoratorArgs
29+
function DecoratorGit:new(args)
30+
self.explorer = args.explorer
3031

31-
---@type DecoratorArgs
32-
local args = {
32+
---@type AbstractDecoratorArgs
33+
local a = {
3334
enabled = self.explorer.opts.git.enable,
3435
highlight_range = self.explorer.opts.renderer.highlight_git or "none",
3536
icon_placement = self.explorer.opts.renderer.icons.git_placement or "none",
3637
}
3738

38-
DecoratorGit.super.new(self, args)
39+
DecoratorGit.super.new(self, a)
3940

4041
if not self.enabled then
4142
return

lua/nvim-tree/renderer/decorator/hidden.lua

+7-6
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,24 @@ local DirectoryNode = require("nvim-tree.node.directory")
55
---@field private explorer Explorer
66
---@field private icon HighlightedString?
77
local DecoratorHidden = Decorator:extend()
8+
DecoratorHidden.name = "Hidden"
89

910
---@class DecoratorHidden
1011
---@overload fun(explorer: Explorer): DecoratorHidden
1112

1213
---@protected
13-
---@param explorer Explorer
14-
function DecoratorHidden:new(explorer)
15-
self.explorer = explorer
14+
---@param args DecoratorArgs
15+
function DecoratorHidden:new(args)
16+
self.explorer = args.explorer
1617

17-
---@type DecoratorArgs
18-
local args = {
18+
---@type AbstractDecoratorArgs
19+
local a = {
1920
enabled = true,
2021
highlight_range = self.explorer.opts.renderer.highlight_hidden or "none",
2122
icon_placement = self.explorer.opts.renderer.icons.hidden_placement or "none",
2223
}
2324

24-
DecoratorHidden.super.new(self, args)
25+
DecoratorHidden.super.new(self, a)
2526

2627
if self.explorer.opts.renderer.icons.show.hidden then
2728
self.icon = {

lua/nvim-tree/renderer/decorator/init.lua

+5-1
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,22 @@ local Class = require("nvim-tree.classic")
22

33
---Abstract Decorator
44
---@class (exact) Decorator: Class
5+
---@field name string for registry
56
---@field protected enabled boolean
67
---@field protected highlight_range DecoratorHighlightRange
78
---@field protected icon_placement DecoratorIconPlacement
89
local Decorator = Class:extend()
910

1011
---@class (exact) DecoratorArgs
12+
---@field explorer Explorer
13+
---
14+
---@class (exact) AbstractDecoratorArgs
1115
---@field enabled boolean
1216
---@field highlight_range DecoratorHighlightRange
1317
---@field icon_placement DecoratorIconPlacement
1418

1519
---@protected
16-
---@param args DecoratorArgs
20+
---@param args AbstractDecoratorArgs
1721
function Decorator:new(args)
1822
if args then
1923
self.enabled = args.enabled

lua/nvim-tree/renderer/decorator/modified.lua

+7-6
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,24 @@ local DirectoryNode = require("nvim-tree.node.directory")
77
---@field private explorer Explorer
88
---@field private icon HighlightedString?
99
local DecoratorModified = Decorator:extend()
10+
DecoratorModified.name = "Modified"
1011

1112
---@class DecoratorModified
1213
---@overload fun(explorer: Explorer): DecoratorModified
1314

1415
---@protected
15-
---@param explorer Explorer
16-
function DecoratorModified:new(explorer)
17-
self.explorer = explorer
16+
---@param args DecoratorArgs
17+
function DecoratorModified:new(args)
18+
self.explorer = args.explorer
1819

19-
---@type DecoratorArgs
20-
local args = {
20+
---@type AbstractDecoratorArgs
21+
local a = {
2122
enabled = true,
2223
highlight_range = self.explorer.opts.renderer.highlight_modified or "none",
2324
icon_placement = self.explorer.opts.renderer.icons.modified_placement or "none",
2425
}
2526

26-
DecoratorModified.super.new(self, args)
27+
DecoratorModified.super.new(self, a)
2728

2829
if not self.enabled then
2930
return

lua/nvim-tree/renderer/decorator/opened.lua

+7-6
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,24 @@ local Decorator = require("nvim-tree.renderer.decorator")
66
---@field private explorer Explorer
77
---@field private icon HighlightedString|nil
88
local DecoratorOpened = Decorator:extend()
9+
DecoratorOpened.name = "Opened"
910

1011
---@class DecoratorOpened
1112
---@overload fun(explorer: Explorer): DecoratorOpened
1213

1314
---@protected
14-
---@param explorer Explorer
15-
function DecoratorOpened:new(explorer)
16-
self.explorer = explorer
15+
---@param args DecoratorArgs
16+
function DecoratorOpened:new(args)
17+
self.explorer = args.explorer
1718

18-
---@type DecoratorArgs
19-
local args = {
19+
---@type AbstractDecoratorArgs
20+
local a = {
2021
enabled = true,
2122
highlight_range = self.explorer.opts.renderer.highlight_opened_files or "none",
2223
icon_placement = "none",
2324
}
2425

25-
DecoratorOpened.super.new(self, args)
26+
DecoratorOpened.super.new(self, a)
2627
end
2728

2829
---Opened highlight: renderer.highlight_opened_files and node has an open buffer

0 commit comments

Comments
 (0)