@@ -116,6 +116,77 @@ impl<'a> AdapterChangeHandler<'a> {
116116 self . remove_node ( node) ;
117117 }
118118
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+
119190 fn emit_text_change_if_needed_parent ( & mut self , old_node : & Node , new_node : & Node ) {
120191 if !new_node. supports_text_ranges ( ) || !old_node. supports_text_ranges ( ) {
121192 return ;
@@ -286,20 +357,11 @@ impl TreeChangeHandler for AdapterChangeHandler<'_> {
286357 self . emit_text_change_if_needed ( old_node, new_node) ;
287358 let filter_old = filter ( old_node) ;
288359 let filter_new = filter ( new_node) ;
360+ if new_node. role ( ) == Role :: MenuListPopup {
361+ println ! ( "{:?} {:?}" , filter_old, filter_new) ;
362+ }
289363 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) ;
303365 } else if filter_new == FilterResult :: Include {
304366 let old_wrapper = NodeWrapper ( old_node) ;
305367 let new_wrapper = NodeWrapper ( new_node) ;
0 commit comments