Skip to content

Commit

Permalink
fix(files): fix for filter losing state of open folders before search
Browse files Browse the repository at this point in the history
  • Loading branch information
cseickel committed Jan 16, 2022
1 parent 5e620fb commit 9d4b748
Show file tree
Hide file tree
Showing 11 changed files with 148 additions and 49 deletions.
10 changes: 5 additions & 5 deletions lua/neo-tree.lua
Original file line number Diff line number Diff line change
Expand Up @@ -56,11 +56,11 @@ local define_events = function()
args.diagnostics_lookup = utils.get_diagnostic_counts()
end)

events.define_autocmd_event(
events.VIM_BUFFER_CHANGED,
{ "BufDelete", "BufWritePost", "BufFilePost", "BufNew" },
200
)
events.define_autocmd_event(events.VIM_BUFFER_CHANGED, { "BufWritePost", "BufFilePost" }, 200)

events.define_autocmd_event(events.VIM_BUFFER_ADDED, { "BufAdd" }, 200)

events.define_autocmd_event(events.VIM_BUFFER_DELETED, { "BufDelete" }, 200)
events.define_autocmd_event(events.VIM_BUFFER_ENTER, { "BufEnter", "BufWinEnter" }, 0)
events.define_autocmd_event(events.VIM_WIN_ENTER, { "WinEnter" }, 0)
events.define_autocmd_event(events.VIM_DIR_CHANGED, { "DirChanged" }, 200)
Expand Down
2 changes: 2 additions & 0 deletions lua/neo-tree/events/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@ local M = {
FILE_RENAMED = "file_renamed",
FS_EVENT = "fs_event",
GIT_EVENT = "git_event",
VIM_BUFFER_ADDED = "vim_buffer_added",
VIM_BUFFER_CHANGED = "vim_buffer_changed",
VIM_BUFFER_DELETED = "vim_buffer_deleted",
VIM_BUFFER_ENTER = "vim_buffer_enter",
VIM_DIAGNOSTIC_CHANGED = "vim_diagnostic_changed",
VIM_DIR_CHANGED = "vim_dir_changed",
Expand Down
4 changes: 2 additions & 2 deletions lua/neo-tree/log.lua
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ local default_config = {

-- Level configuration
modes = {
{ name = "trace", hl = "Comment" },
{ name = "debug", hl = "Comment" },
{ name = "trace", hl = "None" },
{ name = "debug", hl = "None" },
{ name = "info", hl = "None" },
{ name = "warn", hl = "WarningMsg" },
{ name = "error", hl = "ErrorMsg" },
Expand Down
35 changes: 22 additions & 13 deletions lua/neo-tree/sources/buffers/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -130,30 +130,39 @@ M.setup = function(config, global_config)
--convert to new event system
events.subscribe({
event = events.BEFORE_RENDER,
handler = config.before_render,
handler = function(state)
local this_state = get_state()
if state == this_state then
config.before_render(this_state)
end
end,
id = before_render_id,
})
elseif global_config.enable_git_status then
events.subscribe({
event = events.BEFORE_RENDER,
handler = function(state)
state.git_status_lookup = utils.get_git_status()
local this_state = get_state()
if state == this_state then
state.git_status_lookup = utils.get_git_status()
end
end,
id = before_render_id,
})
end

events.subscribe({
event = events.VIM_BUFFER_ENTER,
handler = M.buffers_changed,
id = "buffers." .. events.VIM_BUFFER_ENTER,
})

events.subscribe({
event = events.VIM_BUFFER_CHANGED,
handler = M.buffers_changed,
id = "buffers." .. events.VIM_BUFFER_CHANGED,
})
local refresh_events = {
events.VIM_BUFFER_CHANGED,
events.VIM_BUFFER_ADDED,
events.VIM_BUFFER_DELETED,
}
for _, e in ipairs(refresh_events) do
events.subscribe({
event = e,
handler = M.buffers_changed,
id = "buffers." .. e,
})
end

if default_config.bind_to_cwd then
events.subscribe({
Expand Down
35 changes: 30 additions & 5 deletions lua/neo-tree/sources/filesystem/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ local fs_scan = require("neo-tree.sources.filesystem.lib.fs_scan")
local renderer = require("neo-tree.ui.renderer")
local inputs = require("neo-tree.ui.inputs")
local events = require("neo-tree.events")
local log = require("neo-tree.log")

local M = {}
local default_config = nil
Expand Down Expand Up @@ -98,6 +99,7 @@ M.focus = function(path_to_reveal, callback)
end

local navigate_internal = function(path, path_to_reveal, callback)
log.trace("navigate_internal", path, path_to_reveal)
local state = get_state()
local pos = utils.get_value(state, "window.position", "left")
local was_float = state.force_float or pos == "float"
Expand All @@ -116,6 +118,7 @@ local navigate_internal = function(path, path_to_reveal, callback)
if callback then
callback()
end
state.in_navigate = false
end)
else
local previously_focused = nil
Expand All @@ -137,6 +140,7 @@ local navigate_internal = function(path, path_to_reveal, callback)
if callback then
callback()
end
state.in_navigate = false
end)
end

Expand All @@ -150,12 +154,16 @@ end
---@param path_to_reveal string Node to focus after the items are loaded.
---@param callback function Callback to call after the items are loaded.
M.navigate = function(path, path_to_reveal, callback)
log.trace("navigate", path, path_to_reveal)
local state = get_state()
state.in_navigate = true
utils.debounce("filesystem_navigate", function()
navigate_internal(path, path_to_reveal, callback)
end, 100)
end

M.reveal_current_file = function(toggle_if_open)
log.trace("Revealing current file")
if toggle_if_open then
if M.close() then
-- It was open, and now it's not.
Expand Down Expand Up @@ -191,15 +199,20 @@ M.reveal_current_file = function(toggle_if_open)
end

M.reset_search = function(refresh)
log.trace("reset_search")
local state = get_state()
if refresh == nil then
refresh = true
end
local state = get_state()
if state.open_folders_before_search then
renderer.set_expanded_nodes(state.tree, state.open_folders_before_search)
state.open_folders_before_search = nil
log.trace("reset_search: open_folders_before_search")
state.force_open_folders = utils.table_copy(state.open_folders_before_search)
else
log.trace("reset_search: why are there no open_folders_before_search?")
state.force_open_folders = nil
end
state.search_pattern = nil
state.open_folders_before_search = nil
if refresh then
M.refresh()
end
Expand Down Expand Up @@ -246,7 +259,11 @@ end

---Refreshes the tree by scanning the filesystem again.
M.refresh = function(callback)
log.trace("filesystem refresh")
local state = get_state()
if state.in_navigate or state.in_show_nodes then
return
end
if state.path and renderer.window_exists(state) then
if type(callback) ~= "function" then
callback = nil
Expand All @@ -270,14 +287,22 @@ M.setup = function(config, global_config)
--convert to new event system
events.subscribe({
event = events.BEFORE_RENDER,
handler = config.before_render,
handler = function(state)
local this_state = get_state()
if state == this_state then
config.before_render(this_state)
end
end,
id = before_render_id,
})
elseif global_config.enable_git_status then
events.subscribe({
event = events.BEFORE_RENDER,
handler = function(state)
state.git_status_lookup = utils.get_git_status()
local this_state = get_state()
if state == this_state then
state.git_status_lookup = utils.get_git_status()
end
end,
id = before_render_id,
})
Expand Down
43 changes: 36 additions & 7 deletions lua/neo-tree/sources/filesystem/lib/filter.lua
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ local fs = require("neo-tree.sources.filesystem")
local inputs = require("neo-tree.ui.inputs")
local popups = require("neo-tree.ui.popups")
local renderer = require("neo-tree.ui.renderer")
local utils = require("neo-tree.utils")
local log = require("neo-tree.log")

local M = {}

Expand All @@ -22,13 +24,13 @@ M.show_filter = function(state, search_as_you_type)
size = width,
})

if
not state.search_pattern
or state.search_pattern == "" and not state.open_folders_before_search
then
local has_pre_search_folders = utils.truthy(state.open_folders_before_search)
if not has_pre_search_folders then
log.trace("No search or pre-search folders, recording pre-search folders now")
state.open_folders_before_search = renderer.get_expanded_nodes(state.tree)
end

local waiting_for_default_value = utils.truthy(state.search_pattern)
local input = Input(popup_options, {
prompt = " ",
default_value = state.search_pattern,
Expand All @@ -54,19 +56,46 @@ M.show_filter = function(state, search_as_you_type)
if not search_as_you_type then
return
end
-- apparently when a default value is set, on_change fires for every character
if waiting_for_default_value then
if #value < #state.search_pattern then
return
else
waiting_for_default_value = false
end
end
if value == state.search_pattern then
return
end
if value == nil or value == "" then
elseif value == nil then
return
elseif value == "" then
if state.search_pattern == nil then
return
end
log.trace("Resetting search in on_change")
local original_open_folders = nil
if type(state.open_folders_before_search) == "table" then
original_open_folders = utils.table_copy(state.open_folders_before_search)
end
fs.reset_search()
state.open_folders_before_search = original_open_folders
else
log.trace("Setting search in on_change to: " .. value)
state.search_pattern = value
fs.refresh()
end
end,
})

inputs.show_input(input)
input:mount()

input:map("i", "<esc>", function(bufnr)
input:unmount()
end, { noremap = true })

input:on({ event.BufLeave, event.BufDelete }, function()
input:unmount()
end, { once = true })
end

return M
8 changes: 6 additions & 2 deletions lua/neo-tree/sources/filesystem/lib/fs_scan.lua
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ M.get_items_async = function(state, parent_id, path_to_reveal, callback)
root.loaded = true
root.search_pattern = state.search_pattern
context.folders[root.path] = root
state.default_expanded_nodes = { state.path }
state.default_expanded_nodes = state.force_open_folders or { state.path }

context.job_complete = function()
file_items.deep_sort(root.children)
Expand Down Expand Up @@ -108,7 +108,11 @@ M.get_items_async = function(state, parent_id, path_to_reveal, callback)
local path = parent_id or state.path
context.paths_to_load = {}
if parent_id == nil then
if state.tree then
if utils.truthy(state.force_open_folders) then
for _, path in ipairs(state.force_open_folders) do
table.insert(context.paths_to_load, path)
end
elseif state.tree then
context.paths_to_load = renderer.get_expanded_nodes(state.tree)
end
if path_to_reveal then
Expand Down
4 changes: 2 additions & 2 deletions lua/neo-tree/sources/git_status/defaults.lua
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
local highlights = require("neo-tree.ui.highlights")

local filesystem = {
local git_status = {
window = {
position = "left",
width = 40,
Expand Down Expand Up @@ -62,4 +62,4 @@ local filesystem = {
},
}

return filesystem
return git_status
7 changes: 6 additions & 1 deletion lua/neo-tree/sources/git_status/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,12 @@ M.setup = function(config, global_config)
--convert to new event system
events.subscribe({
event = events.BEFORE_RENDER,
handler = config.before_render,
handler = function(state)
local this_state = get_state()
if state == this_state then
config.before_render(this_state)
end
end,
id = config.name .. ".config.before_render",
})
else
Expand Down
27 changes: 15 additions & 12 deletions lua/neo-tree/ui/renderer.lua
Original file line number Diff line number Diff line change
Expand Up @@ -259,22 +259,19 @@ M.get_expanded_nodes = function(tree)
end

M.collapse_all_nodes = function(tree)
local function collapse_all(parent_node)
if parent_node:has_children() then
for _, child in ipairs(tree:get_nodes(parent_node:get_id())) do
child:collapse()
end
parent_node:collapse()
end
end

for _, node in ipairs(tree:get_nodes()) do
collapse_all(node)
local expanded = M.get_expanded_nodes(tree)
for _, id in ipairs(expanded) do
local node = tree:get_node(id)
node:collapse(id)
end
-- but make sure the root is expanded
local root = tree:get_nodes()[1]
root:expand()
end

M.set_expanded_nodes = function(tree, expanded_nodes)
M.collapse_all_nodes(tree)
log.debug("Setting expanded nodes")
for _, id in ipairs(expanded_nodes or {}) do
local node = tree:get_node(id)
if node ~= nil then
Expand Down Expand Up @@ -466,7 +463,13 @@ local draw = function(nodes, state, parent_id)
-- If we are going to redraw, preserve the current set of expanded nodes.
local expanded_nodes = {}
if parent_id == nil and state.tree ~= nil then
expanded_nodes = M.get_expanded_nodes(state.tree)
if state.force_open_folders then
log.trace("Force open folders")
state.force_open_folders = nil
else
log.trace("Preserving expanded nodes")
expanded_nodes = M.get_expanded_nodes(state.tree)
end
end
for _, id in ipairs(state.default_expanded_nodes) do
table.insert(expanded_nodes, id)
Expand Down

0 comments on commit 9d4b748

Please sign in to comment.