pixels_graphics_lib/ui/
helpers.rs1use 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}