Skip to content

Commit 1e13176

Browse files
committed
refactor(#2875): multi instance renderer
1 parent 1ae1c33 commit 1e13176

File tree

1 file changed

+73
-0
lines changed

1 file changed

+73
-0
lines changed

lua/nvim-tree/actions/reloaders.lua

+73
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
local git = require "nvim-tree.git"
2+
local view = require "nvim-tree.view"
3+
local core = require "nvim-tree.core"
4+
local explorer_node = require "nvim-tree.explorer.node"
5+
local Iterator = require "nvim-tree.iterators.node-iterator"
6+
7+
local M = {}
8+
9+
---@param explorer Explorer|nil
10+
---@param projects table
11+
local function refresh_nodes(explorer, projects)
12+
Iterator.builder({ explorer })
13+
:applier(function(n)
14+
if n.nodes then
15+
local toplevel = git.get_toplevel(n.cwd or n.link_to or n.absolute_path)
16+
if explorer then
17+
explorer:reload(n, projects[toplevel] or {})
18+
end
19+
end
20+
end)
21+
:recursor(function(n)
22+
return n.group_next and { n.group_next } or (n.open and n.nodes)
23+
end)
24+
:iterate()
25+
end
26+
27+
---@param parent_node Node|nil
28+
---@param projects table
29+
function M.reload_node_status(parent_node, projects)
30+
if parent_node == nil then
31+
return
32+
end
33+
34+
local toplevel = git.get_toplevel(parent_node.absolute_path)
35+
local status = projects[toplevel] or {}
36+
for _, node in ipairs(parent_node.nodes) do
37+
explorer_node.update_git_status(node, explorer_node.is_git_ignored(parent_node), status)
38+
if node.nodes and #node.nodes > 0 then
39+
M.reload_node_status(node, projects)
40+
end
41+
end
42+
end
43+
44+
local event_running = false
45+
function M.reload_explorer()
46+
local explorer = core.get_explorer()
47+
if event_running or not explorer or vim.v.exiting ~= vim.NIL then
48+
return
49+
end
50+
event_running = true
51+
52+
local projects = git.reload()
53+
refresh_nodes(explorer, projects)
54+
if view.is_visible() then
55+
explorer.renderer:draw()
56+
end
57+
event_running = false
58+
end
59+
60+
function M.reload_git()
61+
local explorer = core.get_explorer()
62+
if not explorer or not git.config.git.enable or event_running then
63+
return
64+
end
65+
event_running = true
66+
67+
local projects = git.reload()
68+
M.reload_node_status(explorer, projects)
69+
explorer.renderer:draw()
70+
event_running = false
71+
end
72+
73+
return M

0 commit comments

Comments
 (0)