* refactor(#2875): multi instance renderer * refactor(#2875): multi instance renderer * refactor(#2875): multi instance renderer * refactor(#2875): multi instance renderer * node classes and constructors * node methods * refactor(#2875): multi instance renderer * node classes and constructors * explorer is a directory node * extract methods from explore_node * extract methods from explore_node * extract methods from explore_node * extract methods from lib * use .. name for root node for compatibility * use node.explorer * extract node factory, remove unused code * factories for all nodes, add RootNode * factories for all nodes, add RootNode * use factory pattern for decorators * note regression and commit * fix dir git status regression * destroy nodes, not explorer * add BaseNode:is * revert changes to create-file, handle in #2924 * extract methods from explorer * extract methods from explorer * extract methods from explorer * use Node everywhere in luadoc * extract methods from lib * extract methods from lib * lint * remove unused code * don't call methods on fake root node * get_node_at_cursor returns explorer (root) node instead of { name = '..' } * remove unused inject_node * refactor(#2875): multi instance renderer * refactor(#2875): multi instance renderer * refactor(#2875): multi instance renderer * extract methods from lib * node factory uses stat only * temporary DirectoryNode casting until method extraction into child classes * lua-language-server 3.10.5 -> 3.11.0 * explicitly call Explorer constructor * normalise explorer RootNode new call, tidy annotations
This commit is contained in:
committed by
GitHub
parent
c9104a5d07
commit
38aac09151
@@ -3,7 +3,6 @@ local core = require("nvim-tree.core")
|
||||
local utils = require("nvim-tree.utils")
|
||||
local events = require("nvim-tree.events")
|
||||
local notify = require("nvim-tree.notify")
|
||||
local explorer_node = require("nvim-tree.explorer.node")
|
||||
|
||||
---@class LibOpenOpts
|
||||
---@field path string|nil path
|
||||
@@ -15,6 +14,7 @@ local M = {
|
||||
}
|
||||
|
||||
---Cursor position as per vim.api.nvim_win_get_cursor
|
||||
---nil on no explorer or invalid view win
|
||||
---@return integer[]|nil
|
||||
function M.get_cursor_position()
|
||||
if not core.get_explorer() then
|
||||
@@ -31,154 +31,28 @@ end
|
||||
|
||||
---@return Node|nil
|
||||
function M.get_node_at_cursor()
|
||||
local explorer = core.get_explorer()
|
||||
if not explorer then
|
||||
return
|
||||
end
|
||||
|
||||
local cursor = M.get_cursor_position()
|
||||
if not cursor then
|
||||
return
|
||||
end
|
||||
|
||||
if cursor[1] == 1 and view.is_root_folder_visible(core.get_cwd()) then
|
||||
return { name = ".." }
|
||||
return explorer
|
||||
end
|
||||
|
||||
return utils.get_nodes_by_line(core.get_explorer().nodes, core.get_nodes_starting_line())[cursor[1]]
|
||||
end
|
||||
|
||||
---Create a sanitized partial copy of a node, populating children recursively.
|
||||
---@param node Node|nil
|
||||
---@return Node|nil cloned node
|
||||
local function clone_node(node)
|
||||
if not node then
|
||||
node = core.get_explorer()
|
||||
if not node then
|
||||
return nil
|
||||
end
|
||||
end
|
||||
|
||||
local n = {
|
||||
absolute_path = node.absolute_path,
|
||||
executable = node.executable,
|
||||
extension = node.extension,
|
||||
git_status = node.git_status,
|
||||
has_children = node.has_children,
|
||||
hidden = node.hidden,
|
||||
link_to = node.link_to,
|
||||
name = node.name,
|
||||
open = node.open,
|
||||
type = node.type,
|
||||
fs_stat = node.fs_stat,
|
||||
}
|
||||
|
||||
if type(node.nodes) == "table" then
|
||||
n.nodes = {}
|
||||
for _, child in ipairs(node.nodes) do
|
||||
table.insert(n.nodes, clone_node(child))
|
||||
end
|
||||
end
|
||||
|
||||
return n
|
||||
return utils.get_nodes_by_line(explorer.nodes, core.get_nodes_starting_line())[cursor[1]]
|
||||
end
|
||||
|
||||
---Api.tree.get_nodes
|
||||
---@return Node[]|nil
|
||||
---@return Node[]?
|
||||
function M.get_nodes()
|
||||
return clone_node(core.get_explorer())
|
||||
end
|
||||
|
||||
-- If node is grouped, return the last node in the group. Otherwise, return the given node.
|
||||
---@param node Node
|
||||
---@return Node
|
||||
function M.get_last_group_node(node)
|
||||
while node and node.group_next do
|
||||
node = node.group_next
|
||||
end
|
||||
|
||||
return node ---@diagnostic disable-line: return-type-mismatch -- it can't be nil
|
||||
end
|
||||
|
||||
---Group empty folders
|
||||
-- Recursively group nodes
|
||||
---@param node Node
|
||||
---@return Node[]
|
||||
function M.group_empty_folders(node)
|
||||
local is_root = not node.parent
|
||||
local child_folder_only = explorer_node.has_one_child_folder(node) and node.nodes[1]
|
||||
if M.group_empty and not is_root and child_folder_only then
|
||||
node.group_next = child_folder_only
|
||||
local ns = M.group_empty_folders(child_folder_only)
|
||||
node.nodes = ns or {}
|
||||
return ns
|
||||
end
|
||||
return node.nodes
|
||||
end
|
||||
|
||||
---Ungroup empty folders
|
||||
-- If a node is grouped, ungroup it: put node.group_next to the node.nodes and set node.group_next to nil
|
||||
---@param node Node
|
||||
function M.ungroup_empty_folders(node)
|
||||
local cur = node
|
||||
while cur and cur.group_next do
|
||||
cur.nodes = { cur.group_next }
|
||||
cur.group_next = nil
|
||||
cur = cur.nodes[1]
|
||||
end
|
||||
end
|
||||
|
||||
---@param node Node
|
||||
---@return Node[]
|
||||
function M.get_all_nodes_in_group(node)
|
||||
local next_node = utils.get_parent_of_group(node)
|
||||
local nodes = {}
|
||||
while next_node do
|
||||
table.insert(nodes, next_node)
|
||||
next_node = next_node.group_next
|
||||
end
|
||||
return nodes
|
||||
end
|
||||
|
||||
-- Toggle group empty folders
|
||||
---@param head_node Node
|
||||
local function toggle_group_folders(head_node)
|
||||
local is_grouped = head_node.group_next ~= nil
|
||||
|
||||
if is_grouped then
|
||||
M.ungroup_empty_folders(head_node)
|
||||
else
|
||||
M.group_empty_folders(head_node)
|
||||
end
|
||||
end
|
||||
|
||||
---@param node Node
|
||||
function M.expand_or_collapse(node, toggle_group)
|
||||
local explorer = core.get_explorer()
|
||||
|
||||
toggle_group = toggle_group or false
|
||||
if node.has_children then
|
||||
node.has_children = false
|
||||
end
|
||||
|
||||
if #node.nodes == 0 and explorer then
|
||||
explorer:expand(node)
|
||||
end
|
||||
|
||||
local head_node = utils.get_parent_of_group(node)
|
||||
if toggle_group then
|
||||
toggle_group_folders(head_node)
|
||||
end
|
||||
|
||||
local open = M.get_last_group_node(node).open
|
||||
local next_open
|
||||
if toggle_group then
|
||||
next_open = open
|
||||
else
|
||||
next_open = not open
|
||||
end
|
||||
for _, n in ipairs(M.get_all_nodes_in_group(head_node)) do
|
||||
n.open = next_open
|
||||
end
|
||||
|
||||
if explorer then
|
||||
explorer.renderer:draw()
|
||||
end
|
||||
return explorer and explorer:clone()
|
||||
end
|
||||
|
||||
function M.set_target_win()
|
||||
|
||||
Reference in New Issue
Block a user