Skip to content

Commit 4f51269

Browse files
committed
move group methods into DN
1 parent 54c59b9 commit 4f51269

File tree

4 files changed

+79
-54
lines changed

4 files changed

+79
-54
lines changed

lua/nvim-tree/api.lua

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,13 +210,16 @@ local function edit(mode, node)
210210
end
211211

212212
---@param mode string
213-
---@return fun(node: table)
213+
---@return fun(node: Node)
214214
local function open_or_expand_or_dir_up(mode, toggle_group)
215+
---@param node Node
215216
return function(node)
216217
if node.name == ".." then
217218
actions.root.change_dir.fn("..")
218219
elseif node:is(DirectoryNode) then
220+
---
219221
---@cast node DirectoryNode
222+
---
220223
node:expand_or_collapse(toggle_group)
221224
elseif not toggle_group then
222225
edit(mode, node)

lua/nvim-tree/explorer/init.lua

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,13 @@ function Explorer:reload(node, git_status)
170170
)
171171

172172
local is_root = not node.parent
173+
---
174+
--- @cast node DirectoryNode
175+
---
173176
local child_folder_only = node:has_one_child_folder() and node.nodes[1]
177+
---
178+
--- @cast child_folder_only DirectoryNode
179+
---
174180
if config.renderer.group_empty and not is_root and child_folder_only then
175181
node.group_next = child_folder_only
176182
local ns = self:reload(child_folder_only, git_status)
@@ -311,7 +317,13 @@ function Explorer:explore(node, status, parent)
311317
self:populate_children(handle, cwd, node, status, parent)
312318

313319
local is_root = not node.parent
320+
---
321+
--- @cast node DirectoryNode
322+
---
314323
local child_folder_only = node:has_one_child_folder() and node.nodes[1]
324+
---
325+
--- @cast child_folder_only DirectoryNode
326+
---
315327
if config.renderer.group_empty and not is_root and child_folder_only then
316328
local child_cwd = child_folder_only.link_to or child_folder_only.absolute_path
317329
local child_status = git.load_project_status(child_cwd)

lua/nvim-tree/node/directory.lua

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,66 @@ function DirectoryNode:last_group_node()
128128
return node
129129
end
130130

131+
---@return boolean
132+
function DirectoryNode:has_one_child_folder()
133+
return #self.nodes == 1 and self.nodes[1].nodes and vim.loop.fs_access(self.nodes[1].absolute_path, "R") or false
134+
end
135+
136+
---@private
137+
---@return Node[]
138+
function DirectoryNode:get_all_nodes_in_group()
139+
local next_node = self:get_parent_of_group()
140+
local nodes = {}
141+
while next_node do
142+
table.insert(nodes, next_node)
143+
next_node = next_node.group_next
144+
end
145+
return nodes
146+
end
147+
148+
---@private
149+
-- Toggle group empty folders
150+
function DirectoryNode:toggle_group_folders()
151+
local is_grouped = self.group_next ~= nil
152+
153+
if is_grouped then
154+
self:ungroup_empty_folders()
155+
else
156+
self:group_empty_folders()
157+
end
158+
end
159+
160+
---Group empty folders
161+
-- Recursively group nodes
162+
---@private
163+
---@return Node[]
164+
function DirectoryNode:group_empty_folders()
165+
local is_root = not self.parent
166+
local child_folder_only = self:has_one_child_folder() and self.nodes[1]
167+
---
168+
--- @cast child_folder_only DirectoryNode
169+
---
170+
if self.explorer.opts.renderer.group_empty and not is_root and child_folder_only then
171+
self.group_next = child_folder_only
172+
local ns = child_folder_only:group_empty_folders()
173+
self.nodes = ns or {}
174+
return ns
175+
end
176+
return self.nodes
177+
end
178+
179+
---Ungroup empty folders
180+
-- If a node is grouped, ungroup it: put node.group_next to the node.nodes and set node.group_next to nil
181+
---@private
182+
function DirectoryNode:ungroup_empty_folders()
183+
local cur = self
184+
while cur and cur.group_next do
185+
cur.nodes = { cur.group_next }
186+
cur.group_next = nil
187+
cur = cur.nodes[1]
188+
end
189+
end
190+
131191
---@param toggle_group boolean
132192
function DirectoryNode:expand_or_collapse(toggle_group)
133193
toggle_group = toggle_group or false
@@ -140,6 +200,9 @@ function DirectoryNode:expand_or_collapse(toggle_group)
140200
end
141201

142202
local head_node = self:get_parent_of_group()
203+
---
204+
--- @cast head_node DirectoryNode
205+
---
143206
if toggle_group then
144207
head_node:toggle_group_folders()
145208
end

lua/nvim-tree/node/init.lua

Lines changed: 0 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,6 @@ function BaseNode:destroy()
3232
end
3333
end
3434

35-
---@return boolean
36-
function BaseNode:has_one_child_folder()
37-
return #self.nodes == 1 and self.nodes[1].nodes and vim.loop.fs_access(self.nodes[1].absolute_path, "R") or false
38-
end
39-
4035
--luacheck: push ignore 212
4136
---Update the GitStatus of the node
4237
---@param parent_ignored boolean
@@ -146,54 +141,6 @@ function BaseNode:get_parent_of_group()
146141
return node
147142
end
148143

149-
---@return Node[]
150-
function BaseNode:get_all_nodes_in_group()
151-
local next_node = self:get_parent_of_group()
152-
local nodes = {}
153-
while next_node do
154-
table.insert(nodes, next_node)
155-
next_node = next_node.group_next
156-
end
157-
return nodes
158-
end
159-
160-
-- Toggle group empty folders
161-
function BaseNode:toggle_group_folders()
162-
local is_grouped = self.group_next ~= nil
163-
164-
if is_grouped then
165-
self:ungroup_empty_folders()
166-
else
167-
self:group_empty_folders()
168-
end
169-
end
170-
171-
---Group empty folders
172-
-- Recursively group nodes
173-
---@return Node[]
174-
function BaseNode:group_empty_folders()
175-
local is_root = not self.parent
176-
local child_folder_only = self:has_one_child_folder() and self.nodes[1]
177-
if self.explorer.opts.renderer.group_empty and not is_root and child_folder_only then
178-
self.group_next = child_folder_only
179-
local ns = child_folder_only:group_empty_folders()
180-
self.nodes = ns or {}
181-
return ns
182-
end
183-
return self.nodes
184-
end
185-
186-
---Ungroup empty folders
187-
-- If a node is grouped, ungroup it: put node.group_next to the node.nodes and set node.group_next to nil
188-
function BaseNode:ungroup_empty_folders()
189-
local cur = self
190-
while cur and cur.group_next do
191-
cur.nodes = { cur.group_next }
192-
cur.group_next = nil
193-
cur = cur.nodes[1]
194-
end
195-
end
196-
197144
---Create a sanitized partial copy of a node, populating children recursively.
198145
---@return BaseNode cloned
199146
function BaseNode:clone()

0 commit comments

Comments
 (0)