@@ -116,6 +116,59 @@ 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_filter_result == FilterResult :: Include {
128
+ if old_filter_result == FilterResult :: ExcludeSubtree {
129
+ self . add_subtree ( new_node) ;
130
+ } else {
131
+ self . add_node ( new_node) ;
132
+ if let Some ( parent) = parent {
133
+ for child in old_node. filtered_children ( & filter) {
134
+ self . adapter
135
+ . emit_object_event ( parent. id ( ) , ObjectEvent :: ChildRemoved ( child. id ( ) ) ) ;
136
+ }
137
+ }
138
+ }
139
+
140
+ if let Some ( parent) = parent {
141
+ let position = parent
142
+ . filtered_children ( & filter)
143
+ . position ( |c| c. id ( ) == new_node. id ( ) )
144
+ . unwrap ( ) ;
145
+ self . adapter . emit_object_event (
146
+ parent. id ( ) ,
147
+ ObjectEvent :: ChildAdded ( position, new_node. id ( ) ) ,
148
+ ) ;
149
+ }
150
+ } else if old_filter_result == FilterResult :: Include {
151
+ if new_filter_result == FilterResult :: ExcludeSubtree {
152
+ self . remove_subtree ( old_node) ;
153
+ } else {
154
+ self . remove_node ( old_node) ;
155
+ if let Some ( parent) = parent {
156
+ for ( position, child) in new_node. filtered_children ( & filter) . enumerate ( ) {
157
+ self . adapter . emit_object_event (
158
+ parent. id ( ) ,
159
+ ObjectEvent :: ChildAdded ( position, child. id ( ) ) ,
160
+ ) ;
161
+ }
162
+ }
163
+ }
164
+
165
+ if let Some ( parent) = parent {
166
+ self . adapter
167
+ . emit_object_event ( parent. id ( ) , ObjectEvent :: ChildRemoved ( old_node. id ( ) ) ) ;
168
+ }
169
+ }
170
+ }
171
+
119
172
fn emit_text_change_if_needed_parent ( & mut self , old_node : & Node , new_node : & Node ) {
120
173
if !new_node. supports_text_ranges ( ) || !old_node. supports_text_ranges ( ) {
121
174
return ;
@@ -287,19 +340,7 @@ impl TreeChangeHandler for AdapterChangeHandler<'_> {
287
340
let filter_old = filter ( old_node) ;
288
341
let filter_new = filter ( new_node) ;
289
342
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
- }
343
+ self . apply_filters ( old_node, filter_old, new_node, filter_new) ;
303
344
} else if filter_new == FilterResult :: Include {
304
345
let old_wrapper = NodeWrapper ( old_node) ;
305
346
let new_wrapper = NodeWrapper ( new_node) ;
0 commit comments