uzor_core/widgets/dropdown/
state.rs1use std::collections::HashMap;
4
5pub 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#[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}