1use crossterm::event::{Event, KeyCode};
2use flux_tui::canvas::Canvas;
3use flux_tui::components::*;
4use flux_tui::tui::Tui;
5use flux_tui::window::*;
6use std::cell::RefCell;
7use std::rc::Rc;
8use vector2d::Vector2D;
9
10fn main() {
11 let control = Rc::new(RefCell::new(Control::default()));
12 let mut tui = Tui::new(control.clone()).unwrap();
13 tui.render().unwrap();
14 while let Ok(()) = tui.handle_next_event() {
15 if !control.borrow().running {
16 return;
17 }
18 tui.render().unwrap();
19 }
20}
21
22
23struct Control {
24 running: bool,
25 uid: WindowUID,
26 dockpanel: Rc<RefCell<DockPanel>>,
27}
28
29impl Default for Control {
30 fn default() -> Self {
31 let label = WindowFactory::create::<Label>();
32 label.borrow_mut().set_text("Lorem ipsum");
33 let label2 = WindowFactory::create::<Label>();
34 label2.borrow_mut().set_text("Bibsum loram");
35 let label3 = WindowFactory::create::<Label>();
36 label3.borrow_mut().set_text("Epsum larel");
37 let label4 = WindowFactory::create::<Label>();
38 label4.borrow_mut().set_text("Ipsel Aarel");
39 let input = WindowFactory::create::<Textbox>();
40
41 let dockpanel = WindowFactory::create::<DockPanel>();
42 {
43 let mut brw = dockpanel.borrow_mut();
44 brw.set_child(DockAlignment::Center, Some(input));
45 brw.set_child(DockAlignment::Top, Some(label));
46 brw.set_child(DockAlignment::Right, Some(label2));
47 brw.set_child(DockAlignment::Left, Some(label3));
48 brw.set_child(DockAlignment::Bottom, Some(label4));
49 brw.set_border(BorderStyle::new(BorderKind::Dashed, None, None));
50 brw.set_inner_border(true);
51 }
52
53 Self {
54 uid: WindowUID::new(),
55 dockpanel,
56 running: true,
57 }
58 }
59}
60
61impl Window for Control {
62 fn render(&self, _: &mut Canvas) {}
63
64 fn handle_event(&mut self, event: &mut WindowEvent) {
65 if let Event::Key(k) = event.raw() {
66 if k.code == KeyCode::Esc {
67 self.running = false;
68 }
69 }
70 }
71
72 fn children(&mut self, mut builder: SubWindowBuilder) -> SubWindows {
73 builder.add_pair(self.dockpanel.clone(), None).ok();
74 builder.build().unwrap()
75 }
76
77 fn focus(&self) -> Option<WindowRef> {
78 Some(self.dockpanel.clone())
79 }
80}
81
82impl HasWindowUID for Control {
83 fn uid(&self) -> WindowUID {
84 self.uid
85 }
86}
87
88impl WindowLayout for Control {
89 fn desired_size(&self, available_size: Vector2D<u16>) -> Vector2D<u16> {
90 available_size / 2
91 }
92}