@@ -9,7 +9,7 @@ use hashbrown::HashSet;
9
9
use objc2:: runtime:: { AnyObject , ProtocolObject } ;
10
10
use objc2_app_kit:: * ;
11
11
use objc2_foundation:: { NSMutableDictionary , NSNumber , NSString } ;
12
- use std:: rc:: Rc ;
12
+ use std:: { collections :: VecDeque , rc:: Rc } ;
13
13
14
14
use crate :: {
15
15
context:: Context ,
@@ -158,6 +158,19 @@ impl EventGenerator {
158
158
QueuedEvents :: new ( self . context , self . events )
159
159
}
160
160
161
+ fn remove_subtree ( & mut self , node : & Node ) {
162
+ let mut to_remove = VecDeque :: new ( ) ;
163
+ to_remove. push_back ( * node) ;
164
+
165
+ while let Some ( node) = to_remove. pop_front ( ) {
166
+ for child in node. filtered_children ( & filter) {
167
+ to_remove. push_back ( child) ;
168
+ }
169
+
170
+ self . events . push ( QueuedEvent :: NodeDestroyed ( node. id ( ) ) ) ;
171
+ }
172
+ }
173
+
161
174
fn insert_text_change_if_needed_parent ( & mut self , node : Node ) {
162
175
if !node. supports_text_ranges ( ) {
163
176
return ;
@@ -230,11 +243,17 @@ impl TreeChangeHandler for EventGenerator {
230
243
if old_node. raw_value ( ) != new_node. raw_value ( ) {
231
244
self . insert_text_change_if_needed ( new_node) ;
232
245
}
233
- let old_node_was_filtered_out = filter ( old_node) != FilterResult :: Include ;
234
- if filter ( new_node) != FilterResult :: Include {
235
- if !old_node_was_filtered_out && old_node. is_selected ( ) == Some ( true ) {
246
+ let old_filter_result = filter ( old_node) ;
247
+ let new_filter_result = filter ( new_node) ;
248
+ if new_filter_result != FilterResult :: Include {
249
+ if old_filter_result == FilterResult :: Include && old_node. is_selected ( ) == Some ( true ) {
236
250
self . enqueue_selected_rows_change_if_needed ( old_node) ;
237
251
}
252
+ if new_filter_result == FilterResult :: ExcludeSubtree {
253
+ self . remove_subtree ( old_node) ;
254
+ } else {
255
+ self . events . push ( QueuedEvent :: NodeDestroyed ( new_node. id ( ) ) ) ;
256
+ }
238
257
return ;
239
258
}
240
259
let node_id = new_node. id ( ) ;
@@ -280,13 +299,13 @@ impl TreeChangeHandler for EventGenerator {
280
299
&& new_node. live ( ) != Live :: Off
281
300
&& ( new_node. value ( ) != old_node. value ( )
282
301
|| new_node. live ( ) != old_node. live ( )
283
- || old_node_was_filtered_out )
302
+ || old_filter_result != FilterResult :: Include )
284
303
{
285
304
self . events
286
305
. push ( QueuedEvent :: live_region_announcement ( new_node) ) ;
287
306
}
288
307
if new_node. is_selected ( ) != old_node. is_selected ( )
289
- || ( old_node_was_filtered_out && new_node. is_selected ( ) == Some ( true ) )
308
+ || ( old_filter_result != FilterResult :: Include && new_node. is_selected ( ) == Some ( true ) )
290
309
{
291
310
self . enqueue_selected_rows_change_if_needed ( new_node) ;
292
311
}
0 commit comments