Something went wrong. Try again.
This repository has no description
Something went wrong. Try again.
3.9 kB · 137 lines
Rust
at main
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138use winit::keyboard::{Key, NamedKey};
use crate::{ EventQueue, coordinates::{CharPosition, CharRect}, draw_buffer::DrawBuffer,};
use super::{NextWidget, Widget, WidgetResponse};
pub struct Button { text: &'static str, rect: CharRect, pressed: bool, next_widget: NextWidget, #[cfg(feature = "accesskit")] node_id: accesskit::NodeId,}
impl Widget for Button { fn draw(&self, buffer: &mut DrawBuffer, selected: bool) { self.draw_overwrite_pressed(buffer, selected, false); }
fn process_input( &mut self, modifiers: &winit::event::Modifiers, key_event: &winit::event::KeyEvent, _: &mut EventQueue<'_>, ) -> WidgetResponse { if key_event.logical_key == Key::Named(NamedKey::Space) || key_event.logical_key == Key::Named(NamedKey::Enter) { if !key_event.repeat { if key_event.state.is_pressed() { self.pressed = true; return WidgetResponse::None; } else { let pressed = self.pressed; self.pressed = false;
return WidgetResponse::RequestRedraw(pressed); } } // if focus is changed stop being pressed } else { return self.next_widget.process_key_event(key_event, modifiers); } WidgetResponse::None }
#[cfg(feature = "accesskit")] fn build_tree(&self, tree: &mut Vec<(accesskit::NodeId, accesskit::Node)>) { use accesskit::{Node, Role};
let mut node = Node::new(Role::Button); node.set_label(self.text); tree.push((self.node_id, node)); }}
impl Button { const TOPLEFT_COLOR: u8 = 3; const BOTRIGHT_COLOR: u8 = 1;
pub fn new( text: &'static str, rect: CharRect, next_widget: NextWidget, #[cfg(feature = "accesskit")] node_id: accesskit::NodeId, ) -> Self { // is 3 rows high, because bot and top are inclusive assert!( rect.bot() - rect.top() >= 2, "buttons needs to be at least 3 rows high" ); Button { text, rect, pressed: false, next_widget, #[cfg(feature = "accesskit")] node_id, } }
/// pressed = argument || self.pressed pub fn draw_overwrite_pressed(&self, buffer: &mut DrawBuffer, selected: bool, pressed: bool) { // let string_offset = { // let half_string = self.text.len() / 2; // if self.text.len() % 2 == 0 { // half_string - 1 // } else { // half_string // } // };
// fill behind the text buffer.draw_rect( DrawBuffer::BACKGROUND_COLOR, CharRect::new( self.rect.top() + 1, self.rect.bot() - 1, self.rect.left() + 1, self.rect.right() - 1, ), );
let box_colors = match pressed || self.pressed { true => (Self::BOTRIGHT_COLOR, Self::TOPLEFT_COLOR), false => (Self::TOPLEFT_COLOR, Self::BOTRIGHT_COLOR), };
buffer.draw_in_box( self.rect, DrawBuffer::BACKGROUND_COLOR, box_colors.0, box_colors.1, 1, );
let text_color = match selected { true => 11, false => 0, }; buffer.draw_string( self.text, CharPosition::new( // ((self.rect.right() - self.rect.left()) / 2 + self.rect.left()) - string_offset, self.rect.left() + 2, (self.rect.bot() - self.rect.top()) / 2 + self.rect.top(), ), text_color, DrawBuffer::BACKGROUND_COLOR, ) }}