pub use super::render::register_input_coordinator_context_menu;
use super::render::register_context_manager_context_menu;
use super::settings::ContextMenuSettings;
use super::state::ContextMenuState;
use super::types::{ContextMenuRenderKind, ContextMenuView};
use crate::docking::panels::DockPanel;
use crate::input::LayerId;
use crate::layout::LayoutManager;
use crate::render::RenderContext;
use crate::types::{Rect, WidgetId};
pub fn register_layout_manager_context_menu<P: DockPanel>(
layout: &mut LayoutManager<P>,
render: &mut dyn RenderContext,
slot_id: &str,
id: impl Into<WidgetId>,
state: &mut ContextMenuState,
view: &mut ContextMenuView<'_>,
settings: &ContextMenuSettings,
kind: &ContextMenuRenderKind<'_>,
layer: &LayerId,
) -> Option<WidgetId> {
let _rect: Rect = layout.rect_for_overlay(slot_id)?;
Some(register_context_manager_context_menu(
layout.ctx_mut(), render, id, state, view, settings, kind, layer,
))
}
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)
}
}
}