Skip to main content

dockpanel/
dockpanel.rs

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}