pixels_graphics_lib/ui/
helpers.rs

1use crate::ui::prelude::*;
2use buffer_graphics_lib::Graphics;
3use rustc_hash::FxHashMap;
4use std::hash::Hash;
5
6pub struct ToggleButtonGroup<Key: Hash + Clone + PartialEq + Eq> {
7    buttons: FxHashMap<Key, ToggleButton>,
8    selected: Key,
9}
10
11impl<Key: Hash + Clone + PartialEq + Eq> ToggleButtonGroup<Key> {
12    pub fn new(id_button_map: Vec<(Key, ToggleButton)>) -> Self {
13        let mut buttons = FxHashMap::default();
14        let first = id_button_map.first().unwrap().0.clone();
15        for (id, button) in id_button_map.into_iter() {
16            buttons.insert(id.clone(), button);
17        }
18        let mut group = Self {
19            buttons,
20            selected: first.clone(),
21        };
22        group.set_selected(first);
23        group
24    }
25}
26
27impl<Key: Hash + Clone + PartialEq + Eq> ToggleButtonGroup<Key> {
28    pub fn on_mouse_click(&mut self, down: Coord, up: Coord) -> Option<Key> {
29        let mut tmp = None;
30        for (idx, button) in &mut self.buttons {
31            if button.on_mouse_click(down, up) {
32                tmp = Some(idx.clone());
33            }
34        }
35        if let Some(key) = &tmp {
36            self.selected = key.clone();
37        }
38        if let Some(id) = &tmp {
39            for (idx, button) in &mut self.buttons {
40                button.set_selected(idx == id);
41            }
42        }
43        tmp
44    }
45
46    pub fn get(&self, key: Key) -> &ToggleButton {
47        &self.buttons[&key]
48    }
49
50    pub fn render(&self, graphics: &mut Graphics, mouse: &MouseData) {
51        for button in self.buttons.values() {
52            button.render(graphics, mouse);
53        }
54    }
55
56    pub fn get_selected(&self) -> &Key {
57        &self.selected
58    }
59
60    pub fn set_selected(&mut self, id: Key) {
61        for (idx, button) in &mut self.buttons {
62            button.set_selected(idx == &id);
63        }
64        self.selected = id;
65    }
66}
67
68pub struct ToggleIconButtonGroup<Key: Hash + Clone + PartialEq + Eq> {
69    buttons: FxHashMap<Key, ToggleIconButton>,
70    selected: Key,
71}
72
73impl<Key: Hash + Clone + PartialEq + Eq> ToggleIconButtonGroup<Key> {
74    pub fn new(id_button_map: Vec<(Key, ToggleIconButton)>) -> Self {
75        let mut buttons = FxHashMap::default();
76        let first = id_button_map.first().unwrap().0.clone();
77        for (id, button) in id_button_map.into_iter() {
78            buttons.insert(id.clone(), button);
79        }
80        let mut group = Self {
81            buttons,
82            selected: first.clone(),
83        };
84        group.set_selected(first);
85        group
86    }
87}
88
89impl<Key: Hash + Clone + PartialEq + Eq> ToggleIconButtonGroup<Key> {
90    pub fn on_mouse_click(&mut self, down: Coord, up: Coord) -> Option<Key> {
91        let mut tmp = None;
92        for (idx, button) in &mut self.buttons {
93            if button.on_mouse_click(down, up) {
94                tmp = Some(idx.clone());
95            }
96        }
97        if let Some(key) = &tmp {
98            self.selected = key.clone();
99        }
100        if let Some(id) = &tmp {
101            for (idx, button) in &mut self.buttons {
102                button.set_selected(idx == id);
103            }
104        }
105        tmp
106    }
107
108    pub fn get(&self, key: Key) -> &ToggleIconButton {
109        &self.buttons[&key]
110    }
111
112    pub fn render(&self, graphics: &mut Graphics, mouse: &MouseData) {
113        for button in self.buttons.values() {
114            button.render(graphics, mouse);
115        }
116    }
117
118    pub fn get_selected(&self) -> &Key {
119        &self.selected
120    }
121
122    pub fn set_selected(&mut self, id: Key) {
123        for (idx, button) in &mut self.buttons {
124            button.set_selected(idx == &id);
125        }
126        self.selected = id;
127    }
128}