scrollviewer/
scrollviewer.rs1use 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}