1use crossterm::event::{Event, KeyCode};
2use flux_tui::canvas::Canvas;
3use flux_tui::common::*;
4use flux_tui::components::*;
5use flux_tui::tui::Tui;
6use flux_tui::window::*;
7use std::cell::RefCell;
8use std::rc::Rc;
9use vector2d::Vector2D;
10
11fn main() {
12 let control = Rc::new(RefCell::new(Control::default()));
13 let mut tui = Tui::new(control.clone()).unwrap();
14 tui.render().unwrap();
15 while let Ok(()) = tui.handle_next_event() {
16 if !control.borrow().running {
17 return;
18 }
19 tui.render().unwrap();
20 }
21}
22
23
24struct Control {
25 running: bool,
26 uid: WindowUID,
27 stackpanel: Rc<RefCell<Stackpanel>>,
28}
29
30impl Window for Control {
31 fn render(&self, _: &mut Canvas) {}
32
33 fn handle_event(&mut self, event: &mut WindowEvent) {
34 if let Event::Key(k) = event.raw() {
35 if k.code == KeyCode::Esc {
36 self.running = false;
37 }
38 }
39 }
40
41 fn children(&mut self, mut builder: SubWindowBuilder) -> SubWindows {
42 builder.add_pair(self.stackpanel.clone(), None).ok();
43 builder.build().unwrap()
44 }
45
46 fn focus(&self) -> Option<WindowRef> {
47 Some(self.stackpanel.clone())
48 }
49}
50
51impl Default for Control {
52 fn default() -> Self {
53 let label = WindowFactory::create::<Label>();
54 label
55 .borrow_mut()
56 .set_text("Please enter a valid number (x ∈ ℕ):");
57 let button = WindowFactory::create::<Button>();
58 button.borrow_mut().set_text("Press to increment:");
59 button.borrow_mut().set_border(BorderKind::Solid.into());
60 let mut cb: Combobox<u8> = Combobox::default();
61 for v in [1, 2, 4] {
62 cb.add_item(DisplayValue::new(v, format!("Increment by {}", v)));
63 }
64 let cb = Rc::new(RefCell::new(cb));
65 let combobox = cb.clone();
66 let numeric = WindowFactory::create::<Numeric>();
67 numeric.borrow_mut().set_base(Radix::Hexadecimal);
68 numeric.borrow_mut().set_min_range(8);
69 numeric.borrow_mut().set_max_range(64);
70 numeric.borrow_mut().set_focus_color(Some(Color::Cyan));
71 let nc = numeric.clone();
72 combobox
73 .borrow_mut()
74 .set_selection_changed_callback(move |cb| {
75 let mut brw = nc.borrow_mut();
76 brw.set_stepcount(*cb.get_value().unwrap().value())
77 });
78
79 let stackpanel = WindowFactory::create::<Stackpanel>();
80 stackpanel.borrow_mut().set_border(BorderKind::Solid.into());
81 stackpanel.borrow_mut().add_item(label);
82 stackpanel.borrow_mut().add_item(numeric);
83 stackpanel.borrow_mut().add_item(cb);
84
85 Self {
86 uid: WindowUID::new(),
87 stackpanel,
88 running: true,
89 }
90 }
91}
92
93impl HasWindowUID for Control {
94 fn uid(&self) -> WindowUID {
95 self.uid
96 }
97}
98
99impl WindowLayout for Control {
100 fn desired_size(&self, available_size: Vector2D<u16>) -> Vector2D<u16> {
101 Vector2D::new(
102 Percent::from_int(32).multiply(available_size.x),
103 Percent::from_int(80).multiply(available_size.y),
104 )
105 }
106}