Skip to main content

stackpanel/
stackpanel.rs

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}