pub use super::render::register_input_coordinator_context_menu;
use super::state::ContextMenuState;
use crate::types::Rect;
pub fn handle_context_menu_dismiss(
state: &ContextMenuState,
click_pos: (f64, f64),
menu_rect: Rect,
) -> bool {
if !state.is_open {
return false;
}
!menu_rect.contains(click_pos.0, click_pos.1)
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ContextMenuKey {
ArrowDown,
ArrowUp,
Enter,
Esc,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ContextMenuKeyResult {
Close,
Activate(usize),
Hovered(usize),
None,
}
pub fn handle_context_menu_keyboard(
state: &mut ContextMenuState,
key: ContextMenuKey,
enabled_count: usize,
) -> ContextMenuKeyResult {
match key {
ContextMenuKey::Esc => {
state.close();
ContextMenuKeyResult::Close
}
ContextMenuKey::Enter => {
match state.hovered_index {
Some(idx) => ContextMenuKeyResult::Activate(idx),
None => ContextMenuKeyResult::None,
}
}
ContextMenuKey::ArrowDown => {
if enabled_count == 0 {
return ContextMenuKeyResult::None;
}
let next = match state.hovered_index {
None => 0,
Some(cur) => (cur + 1).min(enabled_count.saturating_sub(1)),
};
state.hovered_index = Some(next);
ContextMenuKeyResult::Hovered(next)
}
ContextMenuKey::ArrowUp => {
if enabled_count == 0 {
return ContextMenuKeyResult::None;
}
let next = match state.hovered_index {
None => enabled_count.saturating_sub(1),
Some(cur) => cur.saturating_sub(1),
};
state.hovered_index = Some(next);
ContextMenuKeyResult::Hovered(next)
}
}
}