pub struct A11yTree { /* private fields */ }Expand description
Builds and diffs accesskit TreeUpdates from an A11yNode tree.
The struct stores the flat map of nodes (by NodeId) after a build, so
subsequent calls to A11yTree::diff can compute minimal deltas.
The content-hash map (hashes) stores the OxiUI-side hash of each node at
the time of the last build_and_store call. A11yTree::diff uses these
hashes instead of format!("{:?}", node) string comparison, which avoids
the overhead of serializing accesskit::Node (which doesn’t impl PartialEq).
Implementations§
Source§impl A11yTree
impl A11yTree
Sourcepub fn build(root: &A11yNode) -> TreeUpdate
pub fn build(root: &A11yNode) -> TreeUpdate
Walk root and its descendants depth-first, producing a TreeUpdate
that describes the full tree.
Also stores the snapshot internally so future diff calls can
compute minimal deltas.
Sourcepub fn build_and_store(&mut self, root: &A11yNode) -> TreeUpdate
pub fn build_and_store(&mut self, root: &A11yNode) -> TreeUpdate
Build the full tree and store the snapshot for later diffing.
Returns a TreeUpdate identical to A11yTree::build.
In addition to the AccessKit snapshot, this method collects the
OxiUI-side content hash of every node and stores it in self.hashes.
A11yTree::diff uses these hashes for efficient change detection.
Sourcepub fn set_focus(&mut self, id: Option<NodeId>)
pub fn set_focus(&mut self, id: Option<NodeId>)
Set the currently-focused node.
Pass None to clear the focus (the adapter will typically move focus
back to the root).
Sourcepub fn focus_update(&self) -> TreeUpdate
pub fn focus_update(&self) -> TreeUpdate
Produce a minimal TreeUpdate that only updates the focus field.
Useful when only focus has changed and no node properties have changed.
Sourcepub fn announce(&mut self, text: &str, urgency: LiveSetting) -> NodeId
pub fn announce(&mut self, text: &str, urgency: LiveSetting) -> NodeId
Insert a transient live-region announcement node.
Creates a synthetic accesskit::Role::Status node carrying text
as its value, with the live-region politeness derived from urgency.
The node is appended to the internal snapshot; the caller is responsible
for removing it on the next tick (by calling build_and_store with a
tree that doesn’t include this id).
Returns the newly-allocated NodeId so the caller can track it.
Sourcepub fn diff(old: &A11yTree, new_tree: &A11yTree) -> TreeUpdate
pub fn diff(old: &A11yTree, new_tree: &A11yTree) -> TreeUpdate
Compute a minimal TreeUpdate delta from old to new_tree.
Only nodes whose content has changed (or that are brand-new) are
included in the returned nodes list. Nodes that were removed are
handled implicitly by AccessKit: when the parent’s children list no
longer references a node, the platform adapter orphans it.
Change detection uses the OxiUI-side content hashes stored in
self.hashes rather than format!("{:?}", accesskit::Node) string
comparison. This is both faster and correct: accesskit::Node does not
implement PartialEq, so the Debug-string approach was a pragmatic
workaround. The hash approach is O(1) per node after the initial build.
The returned update’s focus is taken from new_tree.focus.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for A11yTree
impl RefUnwindSafe for A11yTree
impl Send for A11yTree
impl Sync for A11yTree
impl Unpin for A11yTree
impl UnsafeUnpin for A11yTree
impl UnwindSafe for A11yTree
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more