Skip to main content

scrollviewer/
scrollviewer.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	scrollviewer: Rc<RefCell<ScrollViewer>>,
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				event.handled = true;
38			}
39		}
40	}
41
42	fn children(&mut self, mut builder: SubWindowBuilder) -> SubWindows {
43		builder.add_pair(self.scrollviewer.clone(), None).ok();
44		builder.build().unwrap()
45	}
46
47	fn focus(&self) -> Option<WindowRef> {
48		Some(self.scrollviewer.clone())
49	}
50}
51
52impl Default for Control {
53	fn default() -> Self {
54		let values = [
55			"Tomatoes",
56			"Tofu",
57			"Flatbread",
58			"Olive oil",
59			"Salt",
60			"Oregano",
61			"Butter",
62		];
63
64		let scrollviewer = WindowFactory::create::<ScrollViewer>();
65		scrollviewer
66			.borrow_mut()
67			.set_border(BorderStyle::new(BorderKind::Solid, None, None));
68		let stackpanel = WindowFactory::create::<Stackpanel>();
69		for v in values {
70			let cbx = WindowFactory::create::<TextCheckbox>();
71			cbx.borrow_mut().set_text(v);
72			stackpanel.borrow_mut().add_item(cbx);
73		}
74		ScrollViewer::set_content(
75			&scrollviewer,
76			Some(&(stackpanel as Rc<RefCell<dyn Scrollable>>)),
77		);
78
79		Self {
80			uid: WindowUID::new(),
81			scrollviewer,
82			running: true,
83		}
84	}
85}
86
87impl HasWindowUID for Control {
88	fn uid(&self) -> WindowUID {
89		self.uid
90	}
91}
92
93impl WindowLayout for Control {
94	fn desired_size(&self, available_size: Vector2D<u16>) -> Vector2D<u16> {
95		Vector2D::new(
96			Percent::from_int(32).multiply(available_size.x),
97			Percent::from_int(80).multiply(available_size.y),
98		)
99	}
100}