@@ -14,6 +14,47 @@ local function deps()
1414 end
1515end
1616
17+ --- @param stack PeekstackStackModel
18+ --- @param idx integer
19+ --- @param item PeekstackPopupModel
20+ --- @param opts ? { close_window ?: boolean , highlight_origin ?: boolean }
21+ local function remove_stack_popup (stack , idx , item , opts )
22+ opts = opts or {}
23+ if stack .zoomed_id == item .id then
24+ stack .zoomed_id = nil
25+ end
26+ if opts .highlight_origin ~= false then
27+ feedback .highlight_origin (item .origin )
28+ end
29+ common .emit_popup_event (" PeekstackClose" , item , stack .root_winid )
30+ history .push_entry (stack , history .build_entry (item , idx ))
31+ user_events .emit (" PeekstackHistoryPush" , {
32+ popup_id = item .id ,
33+ location = item .location ,
34+ root_winid = stack .root_winid ,
35+ })
36+ state .unindex_popup (item )
37+ table.remove (stack .popups , idx )
38+ if opts .close_window ~= false and item .winid and vim .api .nvim_win_is_valid (item .winid ) then
39+ popup .close (item )
40+ end
41+ end
42+
43+ --- @param id integer
44+ --- @param item PeekstackPopupModel
45+ --- @param opts ? { close_window ?: boolean }
46+ local function remove_ephemeral (id , item , opts )
47+ opts = opts or {}
48+ if opts .close_window ~= false and item .winid and vim .api .nvim_win_is_valid (item .winid ) then
49+ popup .close (item )
50+ end
51+ state .unregister_ephemeral (id )
52+ user_events .emit (
53+ " PeekstackClose" ,
54+ user_events .build_popup_data (item , item .origin and item .origin .winid or 0 , { ephemeral = true })
55+ )
56+ end
57+
1758--- @param winid integer
1859function M .handle_win_closed (winid )
1960 deps ()
@@ -83,21 +124,32 @@ function M.handle_buf_wipeout(bufnr)
83124 end
84125 for id , item in pairs (state .ephemerals ) do
85126 if item .bufnr == bufnr then
86- state . unregister_ephemeral (id )
127+ remove_ephemeral (id , item , { close_window = false } )
87128 end
88129 end
89130 for _ , stack in pairs (state .stacks ) do
131+ local removed = false
132+ local focused_removed = false
90133 for idx = # stack .popups , 1 , - 1 do
91134 local item = stack .popups [idx ]
92135 if item .bufnr == bufnr then
93- if stack .zoomed_id == item .id then
94- stack . zoomed_id = nil
136+ if stack .focused_id == item .id then
137+ focused_removed = true
95138 end
96- state . unindex_popup ( item )
97- table.remove ( stack . popups , idx )
139+ remove_stack_popup ( stack , idx , item , { close_window = false } )
140+ removed = true
98141 end
99142 end
100- layout .reflow (stack )
143+ if removed then
144+ if focused_removed then
145+ if # stack .popups > 0 then
146+ stack .focused_id = stack .popups [# stack .popups ].id
147+ else
148+ stack .focused_id = nil
149+ end
150+ end
151+ layout .reflow (stack )
152+ end
101153 end
102154end
103155
@@ -121,23 +173,32 @@ function M.handle_origin_wipeout(bufnr)
121173 end
122174 for id , item in pairs (state .ephemerals ) do
123175 if should_close_for_origin (item ) then
124- popup .close (item )
125- state .unregister_ephemeral (id )
176+ remove_ephemeral (id , item )
126177 end
127178 end
128179 for _ , stack in pairs (state .stacks ) do
180+ local removed = false
181+ local focused_removed = false
129182 for idx = # stack .popups , 1 , - 1 do
130183 local item = stack .popups [idx ]
131184 if should_close_for_origin (item ) then
132- if stack .zoomed_id == item .id then
133- stack .zoomed_id = nil
185+ if stack .focused_id == item .id then
186+ focused_removed = true
187+ end
188+ remove_stack_popup (stack , idx , item )
189+ removed = true
190+ end
191+ end
192+ if removed then
193+ if focused_removed then
194+ if # stack .popups > 0 then
195+ stack .focused_id = stack .popups [# stack .popups ].id
196+ else
197+ stack .focused_id = nil
134198 end
135- popup .close (item )
136- state .unindex_popup (item )
137- table.remove (stack .popups , idx )
138199 end
200+ layout .reflow (stack )
139201 end
140- layout .reflow (stack )
141202 end
142203end
143204
0 commit comments