Skip to main content

orbital_base_components/overlay/anchored/
config.rs

1use crate::overlay::{
2    appearance::OverlayAppearance, arrow::OverlayArrowMode, panel::OverlayPanelSize,
3    placement::Placement, trigger::OverlayTriggerType, visibility::HOVER_HIDE_DELAY_MS,
4};
5use orbital_motion::MotionSlot;
6
7#[derive(Debug, Clone, Copy)]
8pub struct AnchoredOverlayConfig {
9    pub trigger_type: OverlayTriggerType,
10    pub placement: Placement,
11    pub appearance: OverlayAppearance,
12    pub arrow: OverlayArrowMode,
13    pub auto_height: bool,
14    pub panel_size: Option<OverlayPanelSize>,
15    pub motion: MotionSlot,
16    /// Milliseconds before a hover overlay opens (`0` = immediate).
17    pub show_delay_ms: u64,
18    /// Milliseconds before a hover overlay closes after pointer leave.
19    pub hide_delay_ms: u64,
20}
21
22impl Default for AnchoredOverlayConfig {
23    fn default() -> Self {
24        Self {
25            trigger_type: OverlayTriggerType::Hover,
26            placement: Placement::Top,
27            appearance: OverlayAppearance::Default,
28            arrow: OverlayArrowMode::None,
29            auto_height: false,
30            panel_size: None,
31            motion: None,
32            show_delay_ms: 0,
33            hide_delay_ms: HOVER_HIDE_DELAY_MS,
34        }
35    }
36}
37
38pub struct TooltipVariant;
39
40impl TooltipVariant {
41    pub fn config() -> AnchoredOverlayConfig {
42        AnchoredOverlayConfig {
43            trigger_type: OverlayTriggerType::Hover,
44            placement: Placement::Top,
45            appearance: OverlayAppearance::Normal,
46            arrow: OverlayArrowMode::Tooltip,
47            auto_height: false,
48            panel_size: None,
49            motion: None,
50            show_delay_ms: 0,
51            hide_delay_ms: HOVER_HIDE_DELAY_MS,
52        }
53    }
54}
55
56pub struct PopoverVariant;
57
58impl PopoverVariant {
59    pub fn config() -> AnchoredOverlayConfig {
60        AnchoredOverlayConfig {
61            trigger_type: OverlayTriggerType::Hover,
62            placement: Placement::Top,
63            appearance: OverlayAppearance::Default,
64            arrow: OverlayArrowMode::Popover,
65            auto_height: false,
66            panel_size: Some(OverlayPanelSize::Medium),
67            motion: None,
68            show_delay_ms: 0,
69            hide_delay_ms: HOVER_HIDE_DELAY_MS,
70        }
71    }
72}
73
74pub struct MenuVariant;
75
76impl MenuVariant {
77    pub fn config() -> AnchoredOverlayConfig {
78        AnchoredOverlayConfig {
79            trigger_type: OverlayTriggerType::Click,
80            placement: Placement::Bottom,
81            appearance: OverlayAppearance::Default,
82            arrow: OverlayArrowMode::None,
83            auto_height: true,
84            panel_size: None,
85            motion: None,
86            show_delay_ms: 0,
87            hide_delay_ms: HOVER_HIDE_DELAY_MS,
88        }
89    }
90}
91
92#[cfg(test)]
93mod tests {
94    use super::*;
95
96    #[test]
97    fn tooltip_variant_is_hover_with_arrow() {
98        let config = TooltipVariant::config();
99        assert_eq!(config.trigger_type, OverlayTriggerType::Hover);
100        assert_eq!(config.arrow, OverlayArrowMode::Tooltip);
101    }
102
103    #[test]
104    fn menu_variant_is_click_with_auto_height() {
105        let config = MenuVariant::config();
106        assert_eq!(config.trigger_type, OverlayTriggerType::Click);
107        assert!(config.auto_height);
108        assert_eq!(config.arrow, OverlayArrowMode::None);
109    }
110
111    #[test]
112    fn popover_variant_has_panel_size() {
113        let config = PopoverVariant::config();
114        assert_eq!(config.arrow, OverlayArrowMode::Popover);
115        assert_eq!(config.panel_size, Some(OverlayPanelSize::Medium));
116    }
117}