uzor_core/widgets/slider/
state.rs1use std::collections::HashMap;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
7pub enum SliderHandle {
8 Single,
10 Min,
12 Max,
14}
15
16pub 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#[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}