Skip to main content

uzor_core/widgets/dropdown/
state.rs

1//! Dropdown state adapter - Contract/Connector for dropdown interaction state
2
3use std::collections::HashMap;
4
5/// State adapter for dropdown interaction
6pub trait DropdownState {
7    fn is_open(&self, dropdown_id: &str) -> bool;
8    fn is_item_hovered(&self, dropdown_id: &str, item_index: usize) -> bool;
9    fn set_open(&mut self, dropdown_id: &str, open: bool);
10    fn set_item_hovered(&mut self, dropdown_id: &str, item_index: Option<usize>);
11}
12
13/// Simple implementation of DropdownState for prototyping
14#[derive(Clone, Debug, Default)]
15pub struct SimpleDropdownState {
16    pub open_state: HashMap<String, bool>,
17    pub hovered_items: HashMap<String, Option<usize>>,
18}
19
20impl SimpleDropdownState {
21    pub fn new() -> Self {
22        Self {
23            open_state: HashMap::new(),
24            hovered_items: HashMap::new(),
25        }
26    }
27
28    pub fn close_all(&mut self) {
29        for (_, open) in self.open_state.iter_mut() {
30            *open = false;
31        }
32    }
33
34    pub fn clear_all_hovers(&mut self) {
35        for (_, hover) in self.hovered_items.iter_mut() {
36            *hover = None;
37        }
38    }
39}
40
41impl DropdownState for SimpleDropdownState {
42    fn is_open(&self, dropdown_id: &str) -> bool {
43        self.open_state.get(dropdown_id).copied().unwrap_or(false)
44    }
45
46    fn is_item_hovered(&self, dropdown_id: &str, item_index: usize) -> bool {
47        self.hovered_items
48            .get(dropdown_id)
49            .map(|idx| *idx == Some(item_index))
50            .unwrap_or(false)
51    }
52
53    fn set_open(&mut self, dropdown_id: &str, open: bool) {
54        self.open_state.insert(dropdown_id.to_string(), open);
55    }
56
57    fn set_item_hovered(&mut self, dropdown_id: &str, item_index: Option<usize>) {
58        self.hovered_items.insert(dropdown_id.to_string(), item_index);
59    }
60}