Make PlatformOutput::accesskit_update an Option
This commit is contained in:
parent
d14eab6cb0
commit
3109ee9825
3 changed files with 24 additions and 25 deletions
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in a new issue