Skip to main content

uzor_core/widgets/slider/
state.rs

1//! Slider state adapter - Contract/Connector for slider interaction state
2
3use std::collections::HashMap;
4
5/// Which handle of a slider (for state tracking)
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
7pub enum SliderHandle {
8    /// Single handle for SliderType::Single
9    Single,
10    /// Minimum/left handle for SliderType::Dual
11    Min,
12    /// Maximum/right handle for SliderType::Dual
13    Max,
14}
15
16/// State adapter for slider interaction
17pub trait SliderState {
18    fn is_dragging(&self, slider_id: &str, handle: SliderHandle) -> bool;
19    fn is_hovered(&self, slider_id: &str, handle: SliderHandle) -> bool;
20    fn set_dragging(&mut self, slider_id: &str, handle: SliderHandle, dragging: bool);
21    fn set_hovered(&mut self, slider_id: &str, handle: SliderHandle, hovered: bool);
22}
23
24/// Simple implementation of SliderState for prototyping
25#[derive(Clone, Debug, Default)]
26pub struct SimpleSliderState {
27    dragging: HashMap<(String, SliderHandle), bool>,
28    hovered: HashMap<(String, SliderHandle), bool>,
29}
30
31impl SimpleSliderState {
32    pub fn new() -> Self {
33        Self {
34            dragging: HashMap::new(),
35            hovered: HashMap::new(),
36        }
37    }
38}
39
40impl SliderState for SimpleSliderState {
41    fn is_dragging(&self, slider_id: &str, handle: SliderHandle) -> bool {
42        self.dragging
43            .get(&(slider_id.to_string(), handle))
44            .copied()
45            .unwrap_or(false)
46    }
47
48    fn is_hovered(&self, slider_id: &str, handle: SliderHandle) -> bool {
49        self.hovered
50            .get(&(slider_id.to_string(), handle))
51            .copied()
52            .unwrap_or(false)
53    }
54
55    fn set_dragging(&mut self, slider_id: &str, handle: SliderHandle, dragging: bool) {
56        if dragging {
57            self.dragging.insert((slider_id.to_string(), handle), true);
58        } else {
59            self.dragging.remove(&(slider_id.to_string(), handle));
60        }
61    }
62
63    fn set_hovered(&mut self, slider_id: &str, handle: SliderHandle, hovered: bool) {
64        if hovered {
65            self.hovered.insert((slider_id.to_string(), handle), true);
66        } else {
67            self.hovered.remove(&(slider_id.to_string(), handle));
68        }
69    }
70}