accesskit_consumer/
filters.rs

1// Copyright 2023 The AccessKit Authors. All rights reserved.
2// Licensed under the Apache License, Version 2.0 (found in
3// the LICENSE-APACHE file) or the MIT license (found in
4// the LICENSE-MIT file), at your option.
5
6use accesskit::Role;
7
8use crate::node::Node;
9
10#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
11pub enum FilterResult {
12    Include,
13    ExcludeNode,
14    ExcludeSubtree,
15}
16
17pub fn common_filter(node: &Node) -> FilterResult {
18    if node.is_focused() {
19        return FilterResult::Include;
20    }
21
22    if node.is_hidden() {
23        return FilterResult::ExcludeSubtree;
24    }
25
26    if let Some(parent) = node.parent() {
27        if common_filter(&parent) == FilterResult::ExcludeSubtree {
28            return FilterResult::ExcludeSubtree;
29        }
30    }
31
32    let role = node.role();
33    if role == Role::GenericContainer || role == Role::TextRun {
34        return FilterResult::ExcludeNode;
35    }
36
37    FilterResult::Include
38}
39
40pub fn common_filter_with_root_exception(node: &Node) -> FilterResult {
41    if node.is_root() {
42        return FilterResult::Include;
43    }
44    common_filter(node)
45}