Make PlatformOutput::accesskit_update an Option

This commit is contained in:
Matt Campbell 2022-11-30 07:09:03 -06:00
parent d14eab6cb0
commit 3109ee9825
3 changed files with 24 additions and 25 deletions

View file

@ -657,7 +657,9 @@ impl State {
#[cfg(feature = "accesskit")] #[cfg(feature = "accesskit")]
if let Some(accesskit) = self.accesskit.as_ref() { if let Some(accesskit) = self.accesskit.as_ref() {
accesskit.update_if_active(|| accesskit_update); if let Some(update) = accesskit_update {
accesskit.update_if_active(|| update);
}
} }
} }

View file

@ -111,21 +111,23 @@ impl ContextImpl {
#[cfg(feature = "accesskit")] #[cfg(feature = "accesskit")]
if self.was_accesskit_activated { if self.was_accesskit_activated {
let nodes = &mut self.output.accesskit_update.nodes; assert!(self.output.accesskit_update.is_none());
assert!(nodes.is_empty());
let id = crate::accesskit_root_id(); let id = crate::accesskit_root_id();
let accesskit_id = id.accesskit_id(); let accesskit_id = id.accesskit_id();
let node = accesskit::Node { let node = Arc::new(accesskit::Node {
role: accesskit::Role::Window, role: accesskit::Role::Window,
transform: Some( transform: Some(
accesskit::kurbo::Affine::scale(self.input.pixels_per_point().into()).into(), accesskit::kurbo::Affine::scale(self.input.pixels_per_point().into()).into(),
), ),
..Default::default() ..Default::default()
}; });
nodes.push((accesskit_id, Arc::new(node))); let nodes = vec![(accesskit_id, node)];
self.frame_state.accesskit_nodes.insert(id, nodes.len() - 1); self.frame_state.accesskit_nodes.insert(id, nodes.len() - 1);
assert!(self.output.accesskit_update.tree.is_none()); self.output.accesskit_update = Some(accesskit::TreeUpdate {
self.output.accesskit_update.tree = Some(accesskit::Tree::new(accesskit_id)); nodes,
tree: Some(accesskit::Tree::new(accesskit_id)),
focus: None,
});
} }
} }
@ -155,13 +157,6 @@ impl ContextImpl {
} }
} }
#[cfg(feature = "accesskit")]
fn is_accesskit_active_this_frame(&self) -> bool {
// AccessKit is active this frame if a root node was created in
// `ContextImpl::begin_frame_mut`.
!self.output.accesskit_update.nodes.is_empty()
}
#[cfg(feature = "accesskit")] #[cfg(feature = "accesskit")]
fn mutate_accesskit_node( fn mutate_accesskit_node(
&mut self, &mut self,
@ -169,10 +164,14 @@ impl ContextImpl {
parent_id: Option<Id>, parent_id: Option<Id>,
f: impl FnOnce(&mut accesskit::Node), f: impl FnOnce(&mut accesskit::Node),
) { ) {
if !self.is_accesskit_active_this_frame() { let update = match &mut self.output.accesskit_update {
return; Some(update) => update,
} None => {
let nodes = &mut self.output.accesskit_update.nodes; return;
}
};
let nodes = &mut update.nodes;
let node_map = &mut self.frame_state.accesskit_nodes; let node_map = &mut self.frame_state.accesskit_nodes;
let index = node_map.get(&id).copied().unwrap_or_else(|| { let index = node_map.get(&id).copied().unwrap_or_else(|| {
let accesskit_id = id.accesskit_id(); let accesskit_id = id.accesskit_id();
@ -1057,11 +1056,9 @@ impl Context {
let mut platform_output: PlatformOutput = std::mem::take(&mut self.output()); let mut platform_output: PlatformOutput = std::mem::take(&mut self.output());
#[cfg(feature = "accesskit")] #[cfg(feature = "accesskit")]
// We have to duplicate the logic of `is_accesskit_active_this_frame`, if let Some(accesskit_update) = &mut platform_output.accesskit_update {
// because we just took the output.
if !platform_output.accesskit_update.nodes.is_empty() {
let has_focus = self.input().raw.has_focus; let has_focus = self.input().raw.has_focus;
platform_output.accesskit_update.focus = has_focus.then(|| { accesskit_update.focus = has_focus.then(|| {
let focus_id = self.memory().interaction.focus.id; let focus_id = self.memory().interaction.focus.id;
focus_id.map_or_else( focus_id.map_or_else(
|| crate::accesskit_root_id().accesskit_id(), || crate::accesskit_root_id().accesskit_id(),
@ -1607,7 +1604,7 @@ impl Context {
/// Returns whether AccessKit is active for the current frame. /// Returns whether AccessKit is active for the current frame.
#[cfg(feature = "accesskit")] #[cfg(feature = "accesskit")]
pub fn is_accesskit_active(&self) -> bool { pub fn is_accesskit_active(&self) -> bool {
self.read().is_accesskit_active_this_frame() self.output().accesskit_update.is_some()
} }
/// Indicates that AccessKit has been activated and egui should generate /// Indicates that AccessKit has been activated and egui should generate

View file

@ -87,7 +87,7 @@ pub struct PlatformOutput {
pub text_cursor_pos: Option<crate::Pos2>, pub text_cursor_pos: Option<crate::Pos2>,
#[cfg(feature = "accesskit")] #[cfg(feature = "accesskit")]
pub accesskit_update: accesskit::TreeUpdate, pub accesskit_update: Option<accesskit::TreeUpdate>,
} }
impl PlatformOutput { impl PlatformOutput {