Skip to content

Commit 29584d4

Browse files
authored
fix: Destroy nodes that become filtered out on macOS (#569)
1 parent 217f0a3 commit 29584d4

File tree

1 file changed

+25
-6
lines changed

1 file changed

+25
-6
lines changed

platforms/macos/src/event.rs

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use hashbrown::HashSet;
99
use objc2::runtime::{AnyObject, ProtocolObject};
1010
use objc2_app_kit::*;
1111
use objc2_foundation::{NSMutableDictionary, NSNumber, NSString};
12-
use std::rc::Rc;
12+
use std::{collections::VecDeque, rc::Rc};
1313

1414
use crate::{
1515
context::Context,
@@ -158,6 +158,19 @@ impl EventGenerator {
158158
QueuedEvents::new(self.context, self.events)
159159
}
160160

161+
fn remove_subtree(&mut self, node: &Node) {
162+
let mut to_remove = VecDeque::new();
163+
to_remove.push_back(*node);
164+
165+
while let Some(node) = to_remove.pop_front() {
166+
for child in node.filtered_children(&filter) {
167+
to_remove.push_back(child);
168+
}
169+
170+
self.events.push(QueuedEvent::NodeDestroyed(node.id()));
171+
}
172+
}
173+
161174
fn insert_text_change_if_needed_parent(&mut self, node: Node) {
162175
if !node.supports_text_ranges() {
163176
return;
@@ -230,11 +243,17 @@ impl TreeChangeHandler for EventGenerator {
230243
if old_node.raw_value() != new_node.raw_value() {
231244
self.insert_text_change_if_needed(new_node);
232245
}
233-
let old_node_was_filtered_out = filter(old_node) != FilterResult::Include;
234-
if filter(new_node) != FilterResult::Include {
235-
if !old_node_was_filtered_out && old_node.is_selected() == Some(true) {
246+
let old_filter_result = filter(old_node);
247+
let new_filter_result = filter(new_node);
248+
if new_filter_result != FilterResult::Include {
249+
if old_filter_result == FilterResult::Include && old_node.is_selected() == Some(true) {
236250
self.enqueue_selected_rows_change_if_needed(old_node);
237251
}
252+
if new_filter_result == FilterResult::ExcludeSubtree {
253+
self.remove_subtree(old_node);
254+
} else {
255+
self.events.push(QueuedEvent::NodeDestroyed(new_node.id()));
256+
}
238257
return;
239258
}
240259
let node_id = new_node.id();
@@ -280,13 +299,13 @@ impl TreeChangeHandler for EventGenerator {
280299
&& new_node.live() != Live::Off
281300
&& (new_node.value() != old_node.value()
282301
|| new_node.live() != old_node.live()
283-
|| old_node_was_filtered_out)
302+
|| old_filter_result != FilterResult::Include)
284303
{
285304
self.events
286305
.push(QueuedEvent::live_region_announcement(new_node));
287306
}
288307
if new_node.is_selected() != old_node.is_selected()
289-
|| (old_node_was_filtered_out && new_node.is_selected() == Some(true))
308+
|| (old_filter_result != FilterResult::Include && new_node.is_selected() == Some(true))
290309
{
291310
self.enqueue_selected_rows_change_if_needed(new_node);
292311
}

0 commit comments

Comments
 (0)