old school music tracker
1use std::{cell::Cell, rc::Rc};
2
3use crate::{EventQueue, coordinates::CharRect, draw_buffer::DrawBuffer};
4
5use super::{NextWidget, Widget, WidgetResponse, button::Button};
6
7// dont need to store a callback as it gets pushed into the inner button callback
8pub struct ToggleButton<T: Copy + PartialEq> {
9 button: Button,
10
11 variant: T,
12 state: Rc<Cell<T>>,
13}
14
15impl<T: Copy + PartialEq> Widget for ToggleButton<T> {
16 fn draw(&self, draw_buffer: &mut DrawBuffer, selected: bool) {
17 self.button
18 .draw_overwrite_pressed(draw_buffer, selected, self.variant == self.state.get())
19 }
20
21 fn process_input(
22 &mut self,
23 modifiers: &winit::event::Modifiers,
24 key_event: &winit::event::KeyEvent,
25 event: &mut EventQueue<'_>,
26 ) -> WidgetResponse {
27 self.button.process_input(modifiers, key_event, event)
28 }
29
30 #[cfg(feature = "accesskit")]
31 fn build_tree(&self, tree: &mut Vec<(accesskit::NodeId, accesskit::Node)>) {
32 todo!()
33 }
34}
35
36impl<T: Copy + PartialEq + 'static> ToggleButton<T> {
37 pub fn new(
38 text: &'static str,
39 rect: CharRect,
40 next_widget: NextWidget,
41 variant: T,
42 state: Rc<Cell<T>>,
43 ) -> Self {
44 let button = Button::new(
45 text,
46 rect,
47 next_widget,
48 #[cfg(feature = "accesskit")]
49 todo!(),
50 );
51 Self {
52 button,
53 variant,
54 state,
55 }
56 }
57}