Skip to main content

uzor_core/widgets/panel/
state.rs

1//! Panel state adapter - Contract/Connector for panel interaction state
2
3use std::collections::HashMap;
4
5/// State adapter for panel interaction
6pub 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/// Simple implementation of PanelState for prototyping
18#[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}