* feat(#2948): add UserDecorator, proof of concept * feat(#2948): add UserDecorator, proof of concept * feat(#2948): add UserDecorator, proof of concept * feat(#2948): add UserDecorator * feat(#2948): add UserDecorator * feat(#2948): add UserDecorator * feat(#2948): add Decorator node icon override * feat(#2948): add nvim_tree.api.* node classes * feat(#2948): extract _meta following nvim pattern * feat(#2948): extract _meta following nvim pattern * feat(#2948): add decorator registry and order * feat(#2948): add decorator registry and order * feat(#2948): tidy * feat(#2948): document API * feat(#2948): document API * feat(#2948): document API * feat(#2948): pass api nodes to user decorators * feat(#2948): document API * feat(#2948): use renderer.decorators to define order and register * feat(#2948): tidy decorator args and complete documentation * feat(#2948): decorator classes specified by prefix rather than suffix * feat(#2948): improve doc * feat(#2948): improve doc * feat(#2948): improve doc * feat(#2948): additional user decorator safety * feat(#2948): create nvim_tree.api.decorator.UserDecorator class in API, add :extend * feat(#2948): improve doc
This commit is contained in:
committed by
GitHub
parent
ca7c4c33ca
commit
7a4ff1a516
@@ -1,48 +1,52 @@
|
||||
local Class = require("nvim-tree.classic")
|
||||
|
||||
---@alias DecoratorRange "none" | "icon" | "name" | "all"
|
||||
---@alias DecoratorIconPlacement "none" | "before" | "after" | "signcolumn" | "right_align"
|
||||
|
||||
---Abstract Decorator
|
||||
---Uses the factory pattern to instantiate child instances.
|
||||
---@class (exact) Decorator: Class
|
||||
---@field protected explorer Explorer
|
||||
---@field protected enabled boolean
|
||||
---@field protected range DecoratorRange
|
||||
---@field protected icon_placement DecoratorIconPlacement
|
||||
---@field protected highlight_range nvim_tree.api.decorator.HighlightRange
|
||||
---@field protected icon_placement nvim_tree.api.decorator.IconPlacement
|
||||
local Decorator = Class:extend()
|
||||
|
||||
---@class (exact) DecoratorArgs
|
||||
---@field explorer Explorer
|
||||
|
||||
---@class (exact) AbstractDecoratorArgs: DecoratorArgs
|
||||
---@field enabled boolean
|
||||
---@field hl_pos DecoratorRange
|
||||
---@field icon_placement DecoratorIconPlacement
|
||||
|
||||
---@protected
|
||||
---@param args AbstractDecoratorArgs
|
||||
function Decorator:new(args)
|
||||
self.explorer = args.explorer
|
||||
self.enabled = args.enabled
|
||||
self.range = args.hl_pos
|
||||
self.icon_placement = args.icon_placement
|
||||
---Abstract icon override, optionally implemented
|
||||
---@param node Node
|
||||
---@return HighlightedString? icon_node
|
||||
function Decorator:icon_node(node)
|
||||
return self:nop(node)
|
||||
end
|
||||
|
||||
---Maybe highlight groups
|
||||
---Abstract icons, optionally implemented
|
||||
---@protected
|
||||
---@param node Node
|
||||
---@return string|nil icon highlight group
|
||||
---@return string|nil name highlight group
|
||||
function Decorator:groups_icon_name(node)
|
||||
---@return HighlightedString[]? icons
|
||||
function Decorator:icons(node)
|
||||
self:nop(node)
|
||||
end
|
||||
|
||||
---Abstract highlight group, optionally implemented
|
||||
---@protected
|
||||
---@param node Node
|
||||
---@return string? highlight_group
|
||||
function Decorator:highlight_group(node)
|
||||
self:nop(node)
|
||||
end
|
||||
|
||||
---Maybe highlight groups for icon and name
|
||||
---@param node Node
|
||||
---@return string? icon highlight group
|
||||
---@return string? name highlight group
|
||||
function Decorator:highlight_group_icon_name(node)
|
||||
local icon_hl, name_hl
|
||||
|
||||
if self.enabled and self.range ~= "none" then
|
||||
local hl = self:calculate_highlight(node)
|
||||
if self.enabled and self.highlight_range ~= "none" then
|
||||
local hl = self:highlight_group(node)
|
||||
|
||||
if self.range == "all" or self.range == "icon" then
|
||||
if self.highlight_range == "all" or self.highlight_range == "icon" then
|
||||
icon_hl = hl
|
||||
end
|
||||
if self.range == "all" or self.range == "name" then
|
||||
if self.highlight_range == "all" or self.highlight_range == "name" then
|
||||
name_hl = hl
|
||||
end
|
||||
end
|
||||
@@ -52,13 +56,13 @@ end
|
||||
|
||||
---Maybe icon sign
|
||||
---@param node Node
|
||||
---@return string|nil name
|
||||
---@return string? name
|
||||
function Decorator:sign_name(node)
|
||||
if not self.enabled or self.icon_placement ~= "signcolumn" then
|
||||
return
|
||||
end
|
||||
|
||||
local icons = self:calculate_icons(node)
|
||||
local icons = self:icons(node)
|
||||
if icons and #icons > 0 then
|
||||
return icons[1].hl[1]
|
||||
end
|
||||
@@ -66,56 +70,40 @@ end
|
||||
|
||||
---Icons when "before"
|
||||
---@param node Node
|
||||
---@return HighlightedString[]|nil icons
|
||||
---@return HighlightedString[]? icons
|
||||
function Decorator:icons_before(node)
|
||||
if not self.enabled or self.icon_placement ~= "before" then
|
||||
return
|
||||
end
|
||||
|
||||
return self:calculate_icons(node)
|
||||
return self:icons(node)
|
||||
end
|
||||
|
||||
---Icons when "after"
|
||||
---@param node Node
|
||||
---@return HighlightedString[]|nil icons
|
||||
---@return HighlightedString[]? icons
|
||||
function Decorator:icons_after(node)
|
||||
if not self.enabled or self.icon_placement ~= "after" then
|
||||
return
|
||||
end
|
||||
|
||||
return self:calculate_icons(node)
|
||||
return self:icons(node)
|
||||
end
|
||||
|
||||
---Icons when "right_align"
|
||||
---@param node Node
|
||||
---@return HighlightedString[]|nil icons
|
||||
---@return HighlightedString[]? icons
|
||||
function Decorator:icons_right_align(node)
|
||||
if not self.enabled or self.icon_placement ~= "right_align" then
|
||||
return
|
||||
end
|
||||
|
||||
return self:calculate_icons(node)
|
||||
end
|
||||
|
||||
---Maybe icons, optionally implemented
|
||||
---@protected
|
||||
---@param _ Node
|
||||
---@return HighlightedString[]|nil icons
|
||||
function Decorator:calculate_icons(_)
|
||||
return nil
|
||||
end
|
||||
|
||||
---Maybe highlight group, optionally implemented
|
||||
---@protected
|
||||
---@param _ Node
|
||||
---@return string|nil group
|
||||
function Decorator:calculate_highlight(_)
|
||||
return nil
|
||||
return self:icons(node)
|
||||
end
|
||||
|
||||
---Define a sign
|
||||
---@protected
|
||||
---@param icon HighlightedString|nil
|
||||
---@param icon HighlightedString?
|
||||
function Decorator:define_sign(icon)
|
||||
if icon and #icon.hl > 0 then
|
||||
local name = icon.hl[1]
|
||||
|
||||
Reference in New Issue
Block a user