Skip to content

Commit 7453714

Browse files
committed
fix: Raise events when adding or removing nodes due to filtering on Unix
1 parent daf5faf commit 7453714

File tree

2 files changed

+67
-29
lines changed

2 files changed

+67
-29
lines changed

platforms/atspi-common/src/adapter.rs

Lines changed: 54 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,59 @@ 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_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+
119172
fn emit_text_change_if_needed_parent(&mut self, old_node: &Node, new_node: &Node) {
120173
if !new_node.supports_text_ranges() || !old_node.supports_text_ranges() {
121174
return;
@@ -287,19 +340,7 @@ impl TreeChangeHandler for AdapterChangeHandler<'_> {
287340
let filter_old = filter(old_node);
288341
let filter_new = filter(new_node);
289342
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);
303344
} else if filter_new == FilterResult::Include {
304345
let old_wrapper = NodeWrapper(old_node);
305346
let new_wrapper = NodeWrapper(new_node);

platforms/atspi-common/src/node.rs

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,6 @@ impl NodeWrapper<'_> {
4747
self.0.description()
4848
}
4949

50-
pub(crate) fn parent_id(&self) -> Option<NodeId> {
51-
self.0.parent_id()
52-
}
53-
5450
pub(crate) fn id(&self) -> NodeId {
5551
self.0.id()
5652
}
@@ -540,17 +536,7 @@ impl NodeWrapper<'_> {
540536
)),
541537
);
542538
}
543-
let parent_id = self.parent_id();
544-
if parent_id != old.parent_id() {
545-
let parent = self
546-
.0
547-
.filtered_parent(&filter)
548-
.map_or(NodeIdOrRoot::Root, |node| NodeIdOrRoot::Node(node.id()));
549-
adapter.emit_object_event(
550-
self.id(),
551-
ObjectEvent::PropertyChanged(Property::Parent(parent)),
552-
);
553-
}
539+
self.notify_parent_change(adapter, old);
554540
let role = self.role();
555541
if role != old.role() {
556542
adapter.emit_object_event(
@@ -568,6 +554,17 @@ impl NodeWrapper<'_> {
568554
}
569555
}
570556

557+
pub(crate) fn notify_parent_change(&self, adapter: &Adapter, old: &NodeWrapper) {
558+
let parent = self.0.filtered_parent(&filter);
559+
if parent.map(|p| p.id()) != old.0.filtered_parent(&filter).map(|p| p.id()) {
560+
let parent = parent.map_or(NodeIdOrRoot::Root, |node| NodeIdOrRoot::Node(node.id()));
561+
adapter.emit_object_event(
562+
self.id(),
563+
ObjectEvent::PropertyChanged(Property::Parent(parent)),
564+
);
565+
}
566+
}
567+
571568
fn notify_bounds_changes(
572569
&self,
573570
window_bounds: &WindowBounds,
@@ -581,7 +578,7 @@ impl NodeWrapper<'_> {
581578
}
582579
}
583580

584-
fn notify_children_changes(&self, adapter: &Adapter, old: &NodeWrapper<'_>) {
581+
pub(crate) fn notify_children_changes(&self, adapter: &Adapter, old: &NodeWrapper<'_>) {
585582
let old_filtered_children = old.filtered_child_ids().collect::<Vec<NodeId>>();
586583
let new_filtered_children = self.filtered_child_ids().collect::<Vec<NodeId>>();
587584
for (index, child) in new_filtered_children.iter().enumerate() {

0 commit comments

Comments
 (0)