use super::super::*;
use super::push_a11y_tree;
impl<A: App> Runtime<A> {
pub(super) fn handle_a11y_event(&mut self, ev: accesskit_winit::Event) {
use accesskit_winit::WindowEvent as AkWinEvent;
let Some(state) = self.state.as_mut() else { return };
match ev.window_event {
AkWinEvent::InitialTreeRequested => {
if state.last_render.is_some() {
push_a11y_tree::<A>(state);
} else {
state.window.request_redraw();
}
}
AkWinEvent::ActionRequested(req) => {
let Some(idx) = crate::a11y::mounted_idx_for(req.target_node) else {
return;
};
let Some(cache) = state.last_render.as_ref() else {
return;
};
let Some(node) = cache.mounted.nodes.get(idx) else {
return;
};
match req.action {
accesskit::Action::Focus => {
let new_focus = node.focusable;
state.focused = new_focus;
let model = state.model.as_ref().expect("model");
if let Some(msg) = A::on_focus(model, new_focus) {
let m = state.model.take().expect("model");
state.model = Some(A::update(m, msg, &self.handle));
}
state.last_render = None;
state.window.request_redraw();
}
accesskit::Action::Click => {
if let Some(msg) = node.on_click.clone() {
let m = state.model.take().expect("model");
state.model = Some(A::update(m, msg, &self.handle));
state.last_render = None;
state.window.request_redraw();
}
}
_ => {
}
}
}
AkWinEvent::AccessibilityDeactivated => {}
}
}
}