orbital_base_components/overlay/anchored/
config.rs1use 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 pub show_delay_ms: u64,
18 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}