Skip to content

Commit 612e5cb

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

File tree

2 files changed

+88
-29
lines changed

2 files changed

+88
-29
lines changed

platforms/atspi-common/src/adapter.rs

Lines changed: 75 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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);

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)