Skip to content

Commit

Permalink
fix(events): fix for accidentally destroying event definitions
Browse files Browse the repository at this point in the history
  • Loading branch information
cseickel committed Jan 15, 2022
1 parent ea86f15 commit 6832ed1
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 18 deletions.
4 changes: 4 additions & 0 deletions lua/neo-tree/events/init.lua
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
local vim = vim
local q = require("neo-tree.events.queue")
local log = require("neo-tree.log")

local M = {
-- Well known event names, you can make up your own
Expand Down Expand Up @@ -29,14 +30,17 @@ M.define_autocmd_event = function(event_name, autocmds, debounce_frequency, seed
"autocmd " .. table.concat(autocmds, ",") .. " * " .. callback,
"augroup END",
}
log.trace("Registering autocmds: %s", table.concat(cmds, "\n"))
vim.cmd(table.concat(cmds, "\n"))
end,
seed = seed_fn,
teardown = function()
log.trace("Teardown autocmds for ", event_name)
vim.cmd(string.format("autocmd! NeoTreeEvent_%s", event_name))
end,
debounce_frequency = debounce_frequency,
}
log.debug("Defining autocmd event: %s", event_name)
q.define_event(event_name, opts)
end

Expand Down
43 changes: 28 additions & 15 deletions lua/neo-tree/events/queue.lua
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ function Queue:without(id)
end

local event_queues = {}
local events = {}
local event_definitions = {}
local M = {}

local validate_event_handler = function(event_handler)
Expand All @@ -68,22 +68,22 @@ local validate_event_handler = function(event_handler)
end

M.clear_all_events = function()
for event_name, _ in pairs(events) do
for event_name, queue in pairs(event_queues) do
M.destroy_event(event_name)
end
events = {}
event_queues = {}
end

M.define_event = function(event_name, opts)
local existing = events[event_name]
local existing = event_definitions[event_name]
if existing ~= nil then
error("Event already defined: " .. event_name)
end
events[event_name] = opts
event_definitions[event_name] = opts
end

M.destroy_event = function(event_name)
local existing = events[event_name]
local existing = event_definitions[event_name]
if existing == nil then
return false
end
Expand All @@ -94,7 +94,7 @@ M.destroy_event = function(event_name)
end
existing.setup_was_run = false
end
events[event_name] = nil
event_queues[event_name] = nil
return true
end

Expand All @@ -106,13 +106,16 @@ local fire_event_internal = function(event, args)
log.trace("Firing event: " .. event)

if queue:is_empty() then
log.trace("Event queue is empty")
return nil
end
local seed = utils.get_value(events, event .. ".seed")
local seed = utils.get_value(event_definitions, event .. ".seed")
if seed ~= nil then
local success, result = pcall(seed, args)
if not success then
error("Error in seed function for " .. event .. ": " .. result)
if success then
log.trace("Seed for " .. event .. " returned: " .. tostring(result))
else
log.error("Error in seed function for " .. event .. ": " .. result)
end
end

Expand All @@ -121,15 +124,17 @@ local fire_event_internal = function(event, args)
for i = first, last do
local event_handler = queue[i]
local success, result = pcall(event_handler.handler, args)
if not success then
local id = event_handler.id or event_handler
local id = event_handler.id or event_handler
if success then
log.trace("Handler ", id, " for " .. event .. " called successfully.")
else
log.error(string.format("Error in event handler for event %s[%s]: %s", event, id, result))
end
end
end

M.fire_event = function(event, args)
local freq = utils.get_value(events, event .. ".debounce_frequency", 0, true)
local freq = utils.get_value(event_definitions, event .. ".debounce_frequency", 0, true)
if freq > 0 then
utils.debounce("EVENT_FIRED: " .. event, function()
fire_event_internal(event, args or {})
Expand All @@ -144,18 +149,26 @@ M.subscribe = function(event_handler)

local queue = event_queues[event_handler.event]
if queue == nil then
log.debug("Creating queue for event: " .. event_handler.event)
queue = Queue:new()
local def = events[event_handler.event]
local def = event_definitions[event_handler.event]
if def then
log.trace("Event definition for ", event_handler.event, ": ", def)
else
log.trace("No event definition for ", event_handler.event)
end
if def and type(def.setup) == "function" then
local success, result = pcall(def.setup)
if success then
def.setup_was_run = true
log.debug("Setup for event " .. event_handler.event .. " was run")
else
error("Error in setup for " .. event_handler.event .. ": " .. result)
log.error("Error in setup for " .. event_handler.event .. ": " .. result)
end
end
event_queues[event_handler.event] = queue
end
log.debug("Adding event handler [", event_handler.id, "] for event: ", event_handler.event)
queue:add(event_handler)
end

Expand Down
6 changes: 3 additions & 3 deletions lua/neo-tree/log.lua
Original file line number Diff line number Diff line change
Expand Up @@ -61,15 +61,15 @@ log.new = function(config, standalone)

obj.use_file = function(file, quiet)
if file == false then
config.use_file = false
if not quiet then
print("[neo-tree] Logging to file disabled")
obj.info("[neo-tree] Logging to file disabled")
end
config.use_file = false
else
obj.outfile = file or outfile
config.use_file = true
if not quiet then
print("[neo-tree] Logging to file: " .. obj.outfile)
obj.info("[neo-tree] Logging to file: " .. obj.outfile)
end
end
end
Expand Down
4 changes: 4 additions & 0 deletions lua/neo-tree/ui/renderer.lua
Original file line number Diff line number Diff line change
Expand Up @@ -299,6 +299,7 @@ local auto_close_floats_is_set = false

local enable_auto_close_floats = function()
if auto_close_floats_is_set then
log.trace("Auto close floats is already set.")
return
end
local event_handler = {
Expand All @@ -308,12 +309,15 @@ local enable_auto_close_floats = function()
local cfg = vim.api.nvim_win_get_config(win_id)
if cfg.relative > "" or cfg.external then
-- floating window, ignore
log.trace("Ignoring floating window", cfg)
return
end
log.trace("Closing all floating windows")
require("neo-tree").close_all("float")
end,
id = "neo-tree-auto-close-floats",
}
log.trace("Enabling auto close floats")
events.subscribe(event_handler)
auto_close_floats_is_set = true
end
Expand Down

0 comments on commit 6832ed1

Please sign in to comment.