Skip to content

Commit

Permalink
fix(#397): fix issue where scene quit keys would be binded globally
Browse files Browse the repository at this point in the history
  • Loading branch information
tanvirtin committed Feb 6, 2025
1 parent af1440e commit e036c3c
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 31 deletions.
2 changes: 0 additions & 2 deletions lua/vgit/controller.lua
Original file line number Diff line number Diff line change
Expand Up @@ -143,8 +143,6 @@ end

local function register_keymaps(config)
local keymaps = config and config.keymaps or {}

screen_manager.register_keymaps()
keymap.define(keymaps)
end

Expand Down
17 changes: 8 additions & 9 deletions lua/vgit/ui/Scene.lua
Original file line number Diff line number Diff line change
Expand Up @@ -34,27 +34,26 @@ function Scene:get(key)
return self.components[key]
end

function Scene:is_focused()
local focused = false

function Scene:on(event_name, callback)
for _, component in pairs(self.components) do
if component:is_focused() then return true end
component:on(event_name, callback)
end

return focused
return self
end

function Scene:on(event_name, callback)
for _, component in pairs(self.components) do
component:on(event_name, callback)
function Scene:set_keymap(configs)
for _, config in ipairs(configs) do
for _, component in pairs(self.components) do
component:set_keymap(config, config.handler)
end
end

return self
end

function Scene:destroy()
local components = self:get_components()

for _, component in pairs(components) do
component:unmount()
end
Expand Down
44 changes: 24 additions & 20 deletions lua/vgit/ui/screen_manager.lua
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
local loop = require('vgit.core.loop')
local keymap = require('vgit.core.keymap')
local scene_setting = require('vgit.settings.scene')
local DiffScreen = require('vgit.features.screens.DiffScreen')
local HistoryScreen = require('vgit.features.screens.HistoryScreen')
Expand Down Expand Up @@ -91,42 +90,47 @@ function screen_manager.toggle_diff_preference()
return screen_manager
end

function screen_manager.destroy_active_screen()
local screen = screen_manager.active_screen
if not screen then return screen_manager end

local scene = screen.scene
if not scene then return screen_manager end

scene:destroy()
screen_manager.active_screen = nil

return screen_manager
end

function screen_manager.create(screen_name, ...)
if not screen_manager.is_screen_registered(screen_name) then return screen_manager end
if screen_manager.has_active_screen() then screen_manager.destroy_active_screen() end

local success, screen = screen_manager.screens[screen_name](...)
if success then
screen_manager.active_screen = screen
screen.scene
local scene = screen.scene
scene
:on('BufWinLeave', function()
loop.free_textlock()
if screen_manager.has_active_screen() then return screen_manager.destroy_active_screen() end
end)
:on('QuitPre', function()
if screen_manager.has_active_screen() then return screen_manager.destroy_active_screen() end
end)
scene:set_keymap({
{
mode = 'n',
key = scene_setting:get('keymaps').quit,
handler = function()
screen_manager.destroy_active_screen()
end
}
})
end

return screen_manager
end

function screen_manager.destroy_active_screen()
screen_manager.active_screen:destroy()
screen_manager.active_screen = nil

return screen_manager
end

function screen_manager.handle_on_quit_keypress()
if screen_manager.has_active_screen() then return screen_manager.destroy_active_screen() end
end

function screen_manager.register_keymaps()
keymap.set({
mode = 'n',
key = scene_setting:get('keymaps').quit
}, screen_manager.handle_on_quit_keypress)
end

return screen_manager

0 comments on commit e036c3c

Please sign in to comment.