@@ -116,6 +116,77 @@ impl<'a> AdapterChangeHandler<'a> {
116
116
self . remove_node ( node) ;
117
117
}
118
118
119
+ fn apply_filters (
120
+ & mut self ,
121
+ old_node : & Node ,
122
+ old_filter_result : FilterResult ,
123
+ new_node : & Node ,
124
+ new_filter_result : FilterResult ,
125
+ ) {
126
+ let parent = new_node. filtered_parent ( & filter) ;
127
+ if new_node. role ( ) == Role :: MenuListPopup {
128
+ println ! ( "applying filter" ) ;
129
+ }
130
+ if new_filter_result == FilterResult :: Include {
131
+ if new_node. role ( ) == Role :: MenuListPopup {
132
+ println ! ( "adding node" ) ;
133
+ }
134
+ if old_filter_result == FilterResult :: ExcludeSubtree {
135
+ self . add_subtree ( new_node) ;
136
+ if new_node. role ( ) == Role :: MenuListPopup {
137
+ println ! ( "added node and descendents" ) ;
138
+ }
139
+ } else {
140
+ self . add_node ( new_node) ;
141
+ if new_node. role ( ) == Role :: MenuListPopup {
142
+ println ! ( "added node" ) ;
143
+ }
144
+ if let Some ( parent) = parent {
145
+ if new_node. role ( ) == Role :: MenuListPopup {
146
+ println ! ( "has parent" ) ;
147
+ }
148
+ for child in old_node. filtered_children ( & filter) {
149
+ if new_node. role ( ) == Role :: MenuListPopup {
150
+ println ! ( "{:?}" , child. id( ) ) ;
151
+ }
152
+ self . adapter
153
+ . emit_object_event ( parent. id ( ) , ObjectEvent :: ChildRemoved ( child. id ( ) ) ) ;
154
+ }
155
+ }
156
+ }
157
+
158
+ if let Some ( parent) = parent {
159
+ let position = parent
160
+ . filtered_children ( & filter)
161
+ . position ( |c| c. id ( ) == new_node. id ( ) )
162
+ . unwrap ( ) ;
163
+ self . adapter . emit_object_event (
164
+ parent. id ( ) ,
165
+ ObjectEvent :: ChildAdded ( position, new_node. id ( ) ) ,
166
+ ) ;
167
+ }
168
+ } else if old_filter_result == FilterResult :: Include {
169
+ if new_filter_result == FilterResult :: ExcludeSubtree {
170
+ self . remove_subtree ( old_node) ;
171
+ } else {
172
+ self . remove_node ( old_node) ;
173
+ if let Some ( parent) = parent {
174
+ for ( position, child) in new_node. filtered_children ( & filter) . enumerate ( ) {
175
+ self . adapter . emit_object_event (
176
+ parent. id ( ) ,
177
+ ObjectEvent :: ChildAdded ( position, child. id ( ) ) ,
178
+ ) ;
179
+ }
180
+ }
181
+ }
182
+
183
+ if let Some ( parent) = parent {
184
+ self . adapter
185
+ . emit_object_event ( parent. id ( ) , ObjectEvent :: ChildRemoved ( old_node. id ( ) ) ) ;
186
+ }
187
+ }
188
+ }
189
+
119
190
fn emit_text_change_if_needed_parent ( & mut self , old_node : & Node , new_node : & Node ) {
120
191
if !new_node. supports_text_ranges ( ) || !old_node. supports_text_ranges ( ) {
121
192
return ;
@@ -286,20 +357,11 @@ impl TreeChangeHandler for AdapterChangeHandler<'_> {
286
357
self . emit_text_change_if_needed ( old_node, new_node) ;
287
358
let filter_old = filter ( old_node) ;
288
359
let filter_new = filter ( new_node) ;
360
+ if new_node. role ( ) == Role :: MenuListPopup {
361
+ println ! ( "{:?} {:?}" , filter_old, filter_new) ;
362
+ }
289
363
if filter_new != filter_old {
290
- if filter_new == FilterResult :: Include {
291
- if filter_old == FilterResult :: ExcludeSubtree {
292
- self . add_subtree ( new_node) ;
293
- } else {
294
- self . add_node ( new_node) ;
295
- }
296
- } else if filter_old == FilterResult :: Include {
297
- if filter_new == FilterResult :: ExcludeSubtree {
298
- self . remove_subtree ( old_node) ;
299
- } else {
300
- self . remove_node ( old_node) ;
301
- }
302
- }
364
+ self . apply_filters ( old_node, filter_old, new_node, filter_new) ;
303
365
} else if filter_new == FilterResult :: Include {
304
366
let old_wrapper = NodeWrapper ( old_node) ;
305
367
let new_wrapper = NodeWrapper ( new_node) ;
0 commit comments