old school music tracker
at dev 57 lines 1.5 kB view raw
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}