use crate::menu::Menu;
#[cfg(feature = "a11y")]
struct PopupActions;
#[cfg(feature = "a11y")]
impl accesskit::ActionHandler for PopupActions {
fn do_action(&mut self, _request: accesskit::ActionRequest) {}
}
#[cfg(feature = "a11y")]
struct PopupActivation {
menu: Menu,
}
#[cfg(feature = "a11y")]
impl accesskit::ActivationHandler for PopupActivation {
fn request_initial_tree(&mut self) -> Option<accesskit::TreeUpdate> {
let tree = crate::a11y::build_tree(&self.menu);
Some(crate::a11y::accesskit::tree_update(&tree, None))
}
}
#[cfg(feature = "a11y")]
struct PopupDeactivation;
#[cfg(feature = "a11y")]
impl accesskit::DeactivationHandler for PopupDeactivation {
fn deactivate_accessibility(&mut self) {}
}
pub(super) struct PopupA11y {
#[cfg(feature = "a11y")]
adapter: accesskit_unix::Adapter,
#[cfg(feature = "a11y")]
menu: Menu,
#[cfg(not(feature = "a11y"))]
_private: (),
}
impl PopupA11y {
#[cfg(feature = "a11y")]
pub(super) fn attach(menu: &Menu) -> Option<Self> {
let adapter = accesskit_unix::Adapter::new(
PopupActivation { menu: menu.clone() },
PopupActions,
PopupDeactivation,
);
Some(PopupA11y {
adapter,
menu: menu.clone(),
})
}
#[cfg(not(feature = "a11y"))]
pub(super) fn attach(menu: &Menu) -> Option<Self> {
let _ = menu;
None
}
pub(super) fn focus_row(&mut self, top: Option<usize>) {
#[cfg(feature = "a11y")]
{
let menu = self.menu.clone();
self.adapter.update_if_active(move || {
let tree = crate::a11y::build_tree(&menu);
let focus = crate::keynav::MenuFocus {
top,
flyout: Vec::new(),
};
let fid = crate::a11y::focused_id(&tree, &focus);
crate::a11y::accesskit::tree_update(&tree, fid)
});
}
#[cfg(not(feature = "a11y"))]
{
let _ = top;
}
}
pub(super) fn set_focused(&mut self, focused: bool) {
#[cfg(feature = "a11y")]
{
self.adapter.update_window_focus_state(focused);
}
#[cfg(not(feature = "a11y"))]
{
let _ = focused;
}
}
}