uzor_core/widgets/panel/
state.rs1use std::collections::HashMap;
4
5pub trait PanelState {
7 fn is_open(&self, panel_id: &str) -> bool;
8 fn is_hidden(&self, panel_id: &str) -> bool;
9 fn is_dragging(&self, panel_id: &str) -> bool;
10 fn size(&self, panel_id: &str) -> f64;
11 fn set_open(&mut self, panel_id: &str, open: bool);
12 fn set_hidden(&mut self, panel_id: &str, hidden: bool);
13 fn set_dragging(&mut self, panel_id: &str, dragging: bool);
14 fn set_size(&mut self, panel_id: &str, size: f64);
15}
16
17#[derive(Clone, Debug, Default)]
19pub struct SimplePanelState {
20 pub open: HashMap<String, bool>,
21 pub hidden: HashMap<String, bool>,
22 pub dragging: Option<String>,
23 pub sizes: HashMap<String, f64>,
24}
25
26impl SimplePanelState {
27 pub fn new() -> Self {
28 Self {
29 open: HashMap::new(),
30 hidden: HashMap::new(),
31 dragging: None,
32 sizes: HashMap::new(),
33 }
34 }
35
36 pub fn with_open(panel_ids: &[&str]) -> Self {
37 let mut state = Self::new();
38 for id in panel_ids {
39 state.open.insert((*id).to_string(), true);
40 }
41 state
42 }
43}
44
45impl PanelState for SimplePanelState {
46 fn is_open(&self, panel_id: &str) -> bool {
47 *self.open.get(panel_id).unwrap_or(&false)
48 }
49
50 fn is_hidden(&self, panel_id: &str) -> bool {
51 *self.hidden.get(panel_id).unwrap_or(&false)
52 }
53
54 fn is_dragging(&self, panel_id: &str) -> bool {
55 self.dragging.as_deref() == Some(panel_id)
56 }
57
58 fn size(&self, panel_id: &str) -> f64 {
59 *self.sizes.get(panel_id).unwrap_or(&250.0)
60 }
61
62 fn set_open(&mut self, panel_id: &str, open: bool) {
63 self.open.insert(panel_id.to_string(), open);
64 }
65
66 fn set_hidden(&mut self, panel_id: &str, hidden: bool) {
67 self.hidden.insert(panel_id.to_string(), hidden);
68 }
69
70 fn set_dragging(&mut self, panel_id: &str, dragging: bool) {
71 if dragging {
72 self.dragging = Some(panel_id.to_string());
73 } else if self.dragging.as_deref() == Some(panel_id) {
74 self.dragging = None;
75 }
76 }
77
78 fn set_size(&mut self, panel_id: &str, size: f64) {
79 self.sizes.insert(panel_id.to_string(), size);
80 }
81}