rustty_oxide/
stdbutton.rs1use rustty::{Attr, CellAccessor, Size, HasSize};
2
3use core::{
4 Alignable,
5 HorizontalAlign,
6 VerticalAlign,
7 Widget,
8 Painter,
9 Frame,
10 Button,
11 ButtonResult,
12 find_accel_char_index
13};
14
15pub struct StdButton {
37 frame: Frame,
38 accel: char,
39 result: ButtonResult,
40 text: String
41}
42
43impl StdButton {
44 pub fn new(text: &str, accel: char, result: ButtonResult) -> StdButton {
58 let s = format!("< {} >", text);
59 let width = s.chars().count();
60 let mut button =
61 StdButton { frame: Frame::new(width, 1),
62 accel: accel.to_lowercase().next().unwrap_or(accel),
63 result: result,
64 text: s };
65 button.frame.printline(0, 0, &button.text[..]);
66 match find_accel_char_index(text, button.accel) {
67 Some(i) => {
68 button.frame.get_mut(i+2, 0).unwrap().set_attrs(Attr::Bold);
69 },
70 None => (),
71 }
72 button
73 }
74}
75
76impl Button for StdButton {
77 fn accel(&self) -> char {
78 self.accel
79 }
80
81 fn result(&self) -> ButtonResult {
82 self.result
83 }
84}
85
86impl Widget for StdButton {
87 fn draw(&mut self, parent: &mut CellAccessor) {
88 self.frame.draw_into(parent);
89 }
90
91 fn pack(&mut self, parent: &HasSize, halign: HorizontalAlign, valign: VerticalAlign,
92 margin: (usize,usize)) {
93 self.frame.align(parent, halign, valign, margin);
94 }
95
96 fn draw_box(&mut self) {
97 self.frame.draw_box();
98 }
99
100 fn resize(&mut self, new_size: Size) {
101 self.frame.resize(new_size);
102 }
103
104 fn frame(&self) -> &Frame {
105 &self.frame
106 }
107
108 fn frame_mut(&mut self) -> &mut Frame {
109 &mut self.frame
110 }
111}
112