Skip to content

Commit ff3dd12

Browse files
committed
feat(#2948): add UserDecorator, proof of concept
1 parent c763948 commit ff3dd12

File tree

12 files changed

+114
-81
lines changed

12 files changed

+114
-81
lines changed

lua/nvim-tree.lua

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

lua/nvim-tree/renderer/builder.lua

+17-11
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,14 @@ local DecoratorGit = require("nvim-tree.renderer.decorator.git")
1313
local DecoratorModified = require("nvim-tree.renderer.decorator.modified")
1414
local DecoratorHidden = require("nvim-tree.renderer.decorator.hidden")
1515
local DecoratorOpened = require("nvim-tree.renderer.decorator.opened")
16+
local UserDecoratorExample = require("nvim-tree.renderer.decorator.example")
1617

1718
local pad = require("nvim-tree.renderer.components.padding")
1819

19-
---@class (exact) HighlightedString
20-
---@field str string
21-
---@field hl string[]
20+
----TODO move all these classes to API meta
21+
----@class (exact) HighlightedString
22+
----@field str string
23+
----@field hl string[]
2224

2325
---@class (exact) AddHighlightArgs
2426
---@field group string[]
@@ -62,16 +64,20 @@ function Builder:new(args)
6264
self.virtual_lines = {}
6365
self.decorators = {
6466
-- priority order
65-
DecoratorCut({ explorer = args.explorer }),
66-
DecoratorCopied({ explorer = args.explorer }),
67-
DecoratorDiagnostics({ explorer = args.explorer }),
68-
DecoratorBookmarks({ explorer = args.explorer }),
69-
DecoratorModified({ explorer = args.explorer }),
70-
DecoratorHidden({ explorer = args.explorer }),
71-
DecoratorOpened({ explorer = args.explorer }),
72-
DecoratorGit({ explorer = args.explorer })
67+
DecoratorCut(self.explorer),
68+
DecoratorCopied(self.explorer),
69+
DecoratorDiagnostics(self.explorer),
70+
DecoratorBookmarks(self.explorer),
71+
DecoratorModified(self.explorer),
72+
DecoratorHidden(self.explorer),
73+
DecoratorOpened(self.explorer),
74+
DecoratorGit(self.explorer),
7375
}
7476
self.hidden_display = Builder:setup_hidden_display_function(self.explorer.opts)
77+
78+
for _, user_decorator in ipairs(args.explorer.opts.renderer.user_decorators) do
79+
table.insert(self.decorators, user_decorator.class())
80+
end
7581
end
7682

7783
---Insert ranged highlight groups into self.highlights

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

+10-8
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
11
local Decorator = require("nvim-tree.renderer.decorator")
22

33
---@class (exact) DecoratorBookmarks: Decorator
4-
---@field icon HighlightedString?
4+
---@field private explorer Explorer
5+
---@field private icon HighlightedString?
56
local DecoratorBookmarks = Decorator:extend()
67

78
---@class DecoratorBookmarks
8-
---@overload fun(explorer: DecoratorArgs): DecoratorBookmarks
9+
---@overload fun(explorer: Explorer): DecoratorBookmarks
910

1011
---@protected
11-
---@param args DecoratorArgs
12-
function DecoratorBookmarks:new(args)
13-
Decorator.new(self, {
14-
explorer = args.explorer,
12+
---@param explorer Explorer
13+
function DecoratorBookmarks:new(explorer)
14+
self.explorer = explorer
15+
16+
DecoratorBookmarks.super.new(self, {
1517
enabled = true,
16-
hl_pos = args.explorer.opts.renderer.highlight_bookmarks or "none",
17-
icon_placement = args.explorer.opts.renderer.icons.bookmarks_placement or "none",
18+
hl_pos = self.explorer.opts.renderer.highlight_bookmarks or "none",
19+
icon_placement = self.explorer.opts.renderer.icons.bookmarks_placement or "none",
1820
})
1921

2022
if self.explorer.opts.renderer.icons.show.bookmarks then

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

+8-6
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
local Decorator = require("nvim-tree.renderer.decorator")
22

33
---@class (exact) DecoratorCopied: Decorator
4+
---@field private explorer Explorer
45
local DecoratorCopied = Decorator:extend()
56

67
---@class DecoratorCopied
7-
---@overload fun(explorer: DecoratorArgs): DecoratorCopied
8+
---@overload fun(explorer: Explorer): DecoratorCopied
89

910
---@protected
10-
---@param args DecoratorArgs
11-
function DecoratorCopied:new(args)
12-
Decorator.new(self, {
13-
explorer = args.explorer,
11+
---@param explorer Explorer
12+
function DecoratorCopied:new(explorer)
13+
self.explorer = explorer
14+
15+
DecoratorCopied.super.new(self, {
1416
enabled = true,
15-
hl_pos = args.explorer.opts.renderer.highlight_clipboard or "none",
17+
hl_pos = self.explorer.opts.renderer.highlight_clipboard or "none",
1618
icon_placement = "none",
1719
})
1820
end

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

+8-6
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
local Decorator = require("nvim-tree.renderer.decorator")
22

33
---@class (exact) DecoratorCut: Decorator
4+
---@field private explorer Explorer
45
local DecoratorCut = Decorator:extend()
56

67
---@class DecoratorCut
7-
---@overload fun(explorer: DecoratorArgs): DecoratorCut
8+
---@overload fun(explorer: Explorer): DecoratorCut
89

910
---@protected
10-
---@param args DecoratorArgs
11-
function DecoratorCut:new(args)
12-
Decorator.new(self, {
13-
explorer = args.explorer,
11+
---@param explorer Explorer
12+
function DecoratorCut:new(explorer)
13+
self.explorer = explorer
14+
15+
DecoratorCut.super.new(self, {
1416
enabled = true,
15-
hl_pos = args.explorer.opts.renderer.highlight_clipboard or "none",
17+
hl_pos = self.explorer.opts.renderer.highlight_clipboard or "none",
1618
icon_placement = "none",
1719
})
1820
end

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

+10-8
Original file line numberDiff line numberDiff line change
@@ -31,20 +31,22 @@ local ICON_KEYS = {
3131
}
3232

3333
---@class (exact) DecoratorDiagnostics: Decorator
34-
---@field icons HighlightedString[]?
34+
---@field private explorer Explorer
35+
---@field private icons HighlightedString[]?
3536
local DecoratorDiagnostics = Decorator:extend()
3637

3738
---@class DecoratorDiagnostics
38-
---@overload fun(explorer: DecoratorArgs): DecoratorDiagnostics
39+
---@overload fun(explorer: Explorer): DecoratorDiagnostics
3940

4041
---@protected
41-
---@param args DecoratorArgs
42-
function DecoratorDiagnostics:new(args)
43-
Decorator.new(self, {
44-
explorer = args.explorer,
42+
---@param explorer Explorer
43+
function DecoratorDiagnostics:new(explorer)
44+
self.explorer = explorer
45+
46+
DecoratorDiagnostics.super.new(self, {
4547
enabled = true,
46-
hl_pos = args.explorer.opts.renderer.highlight_diagnostics or "none",
47-
icon_placement = args.explorer.opts.renderer.icons.diagnostics_placement or "none",
48+
hl_pos = self.explorer.opts.renderer.highlight_diagnostics or "none",
49+
icon_placement = self.explorer.opts.renderer.icons.diagnostics_placement or "none",
4850
})
4951

5052
if not self.enabled then

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

+14-12
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,25 @@ local DirectoryNode = require("nvim-tree.node.directory")
1313
---@alias GitGlyphsByStatus table<GitStatusStrings, string> from opts
1414

1515
---@class (exact) DecoratorGit: Decorator
16-
---@field file_hl_by_xy table<GitXY, string>?
17-
---@field folder_hl_by_xy table<GitXY, string>?
18-
---@field icons_by_status GitIconsByStatus?
19-
---@field icons_by_xy GitIconsByXY?
16+
---@field private explorer Explorer
17+
---@field private file_hl_by_xy table<GitXY, string>?
18+
---@field private folder_hl_by_xy table<GitXY, string>?
19+
---@field private icons_by_status GitIconsByStatus?
20+
---@field private icons_by_xy GitIconsByXY?
2021
local DecoratorGit = Decorator:extend()
2122

2223
---@class DecoratorGit
23-
---@overload fun(explorer: DecoratorArgs): DecoratorGit
24+
---@overload fun(explorer: Explorer): DecoratorGit
2425

2526
---@protected
26-
---@param args DecoratorArgs
27-
function DecoratorGit:new(args)
28-
Decorator.new(self, {
29-
explorer = args.explorer,
30-
enabled = args.explorer.opts.git.enable,
31-
hl_pos = args.explorer.opts.renderer.highlight_git or "none",
32-
icon_placement = args.explorer.opts.renderer.icons.git_placement or "none",
27+
---@param explorer Explorer
28+
function DecoratorGit:new(explorer)
29+
self.explorer = explorer
30+
31+
DecoratorGit.super.new(self, {
32+
enabled = self.explorer.opts.git.enable,
33+
hl_pos = self.explorer.opts.renderer.highlight_git or "none",
34+
icon_placement = self.explorer.opts.renderer.icons.git_placement or "none",
3335
})
3436

3537
if not self.enabled then

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

+10-8
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,22 @@ local Decorator = require("nvim-tree.renderer.decorator")
22
local DirectoryNode = require("nvim-tree.node.directory")
33

44
---@class (exact) DecoratorHidden: Decorator
5-
---@field icon HighlightedString?
5+
---@field private explorer Explorer
6+
---@field private icon HighlightedString?
67
local DecoratorHidden = Decorator:extend()
78

89
---@class DecoratorHidden
9-
---@overload fun(explorer: DecoratorArgs): DecoratorHidden
10+
---@overload fun(explorer: Explorer): DecoratorHidden
1011

1112
---@protected
12-
---@param args DecoratorArgs
13-
function DecoratorHidden:new(args)
14-
Decorator.new(self, {
15-
explorer = args.explorer,
13+
---@param explorer Explorer
14+
function DecoratorHidden:new(explorer)
15+
self.explorer = explorer
16+
17+
DecoratorHidden.super.new(self, {
1618
enabled = true,
17-
hl_pos = args.explorer.opts.renderer.highlight_hidden or "none",
18-
icon_placement = args.explorer.opts.renderer.icons.hidden_placement or "none",
19+
hl_pos = self.explorer.opts.renderer.highlight_hidden or "none",
20+
icon_placement = self.explorer.opts.renderer.icons.hidden_placement or "none",
1921
})
2022

2123
if self.explorer.opts.renderer.icons.show.hidden then

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

+1-7
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,20 @@ local Class = require("nvim-tree.classic")
44
---@alias DecoratorIconPlacement "none" | "before" | "after" | "signcolumn" | "right_align"
55

66
---Abstract Decorator
7-
---Uses the factory pattern to instantiate child instances.
87
---@class (exact) Decorator: Class
9-
---@field protected explorer Explorer
108
---@field protected enabled boolean
119
---@field protected range DecoratorRange
1210
---@field protected icon_placement DecoratorIconPlacement
1311
local Decorator = Class:extend()
1412

1513
---@class (exact) DecoratorArgs
16-
---@field explorer Explorer
17-
18-
---@class (exact) AbstractDecoratorArgs: DecoratorArgs
1914
---@field enabled boolean
2015
---@field hl_pos DecoratorRange
2116
---@field icon_placement DecoratorIconPlacement
2217

2318
---@protected
24-
---@param args AbstractDecoratorArgs
19+
---@param args DecoratorArgs
2520
function Decorator:new(args)
26-
self.explorer = args.explorer
2721
self.enabled = args.enabled
2822
self.range = args.hl_pos
2923
self.icon_placement = args.icon_placement

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

+10-8
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,22 @@ local Decorator = require("nvim-tree.renderer.decorator")
44
local DirectoryNode = require("nvim-tree.node.directory")
55

66
---@class (exact) DecoratorModified: Decorator
7-
---@field icon HighlightedString?
7+
---@field private explorer Explorer
8+
---@field private icon HighlightedString?
89
local DecoratorModified = Decorator:extend()
910

1011
---@class DecoratorModified
11-
---@overload fun(explorer: DecoratorArgs): DecoratorModified
12+
---@overload fun(explorer: Explorer): DecoratorModified
1213

1314
---@protected
14-
---@param args DecoratorArgs
15-
function DecoratorModified:new(args)
16-
Decorator.new(self, {
17-
explorer = args.explorer,
15+
---@param explorer Explorer
16+
function DecoratorModified:new(explorer)
17+
self.explorer = explorer
18+
19+
DecoratorModified.super.new(self, {
1820
enabled = true,
19-
hl_pos = args.explorer.opts.renderer.highlight_modified or "none",
20-
icon_placement = args.explorer.opts.renderer.icons.modified_placement or "none",
21+
hl_pos = self.explorer.opts.renderer.highlight_modified or "none",
22+
icon_placement = self.explorer.opts.renderer.icons.modified_placement or "none",
2123
})
2224

2325
if not self.enabled then

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

+9-7
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,21 @@ local buffers = require("nvim-tree.buffers")
33
local Decorator = require("nvim-tree.renderer.decorator")
44

55
---@class (exact) DecoratorOpened: Decorator
6-
---@field icon HighlightedString|nil
6+
---@field private explorer Explorer
7+
---@field private icon HighlightedString|nil
78
local DecoratorOpened = Decorator:extend()
89

910
---@class DecoratorOpened
10-
---@overload fun(explorer: DecoratorArgs): DecoratorOpened
11+
---@overload fun(explorer: Explorer): DecoratorOpened
1112

1213
---@protected
13-
---@param args DecoratorArgs
14-
function DecoratorOpened:new(args)
15-
Decorator.new(self, {
16-
explorer = args.explorer,
14+
---@param explorer Explorer
15+
function DecoratorOpened:new(explorer)
16+
self.explorer = explorer
17+
18+
DecoratorOpened.super.new(self, {
1719
enabled = true,
18-
hl_pos = args.explorer.opts.renderer.highlight_opened_files or "none",
20+
hl_pos = self.explorer.opts.renderer.highlight_opened_files or "none",
1921
icon_placement = "none",
2022
})
2123
end
+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
local Decorator = require("nvim-tree.renderer.decorator")
2+
3+
---Marker parent for user decorators
4+
---@class (exact) UserDecorator: Decorator
5+
local UserDecorator = Decorator:extend()
6+
7+
---@class UserDecorator
8+
---@overload fun(args: DecoratorArgs): UserDecorator
9+
10+
---@protected
11+
---@param args DecoratorArgs
12+
function UserDecorator:new(args)
13+
UserDecorator.super.new(self, args)
14+
end
15+
16+
return UserDecorator

0 commit comments

Comments
 (0)