flux-tui 0.4.4

Fast and lightweight Terminal UI drawing library
Documentation
use crossterm::event::{Event, KeyCode};
use flux_tui::canvas::Canvas;
use flux_tui::common::Color;
use flux_tui::components::*;
use flux_tui::tui::Tui;
use flux_tui::window::*;
use std::cell::RefCell;
use std::rc::Rc;
use vector2d::Vector2D;

fn main() {
	let control = Rc::new(RefCell::new(Control::default()));
	let mut tui = Tui::new(control.clone()).unwrap();
	tui.render().unwrap();
	while let Ok(()) = tui.handle_next_event() {
		if !control.borrow().running {
			return;
		}
		tui.render().unwrap();
	}
}


struct Control {
	running: bool,
	uid: WindowUID,
	tabview: Rc<RefCell<TabView>>,
}

impl Default for Control {
	fn default() -> Self {
		let label = WindowFactory::create::<Label>();
		label.borrow_mut().set_text("Lorem ipsum");
		let label2 = WindowFactory::create::<Label>();
		label2.borrow_mut().set_text("Bibsum loram");
		let label3 = WindowFactory::create::<Label>();
		label3.borrow_mut().set_text("Epsum larel");
		let label4 = WindowFactory::create::<Label>();
		label4.borrow_mut().set_text("Ipsel Aarel");

		let tabview = WindowFactory::create::<TabView>();
		{
			let mut brw = tabview.borrow_mut();
			brw.enable_tab_enumeration();
			brw.set_highlight_fg_color(Some(Color::Grey));
			brw.set_highlight_bg_color(Some(Color::Blue));
			brw.add_item(Tab::new("WIP Tab Number. 1", label));
			brw.add_item(Tab::new("WIP Tab Number. 2", label2));
			brw.add_item(Tab::new("WIP Tab Number. 3", label3));
			brw.add_item(Tab::new("WIP Tab Number. 4", label4));
		}

		Self {
			uid: WindowUID::new(),
			tabview,
			running: true,
		}
	}
}

impl Window for Control {
	fn render(&self, _: &mut Canvas) {}

	fn handle_event(&mut self, event: &mut WindowEvent) {
		if let Event::Key(k) = event.raw() {
			if k.code == KeyCode::Esc {
				self.running = false;
			}
		}
	}

	fn children(&mut self, mut builder: SubWindowBuilder) -> SubWindows {
		builder.add_pair(self.tabview.clone(), None).ok();
		builder.build().unwrap()
	}

	fn focus(&self) -> Option<WindowRef> {
		Some(self.tabview.clone())
	}
}

impl HasWindowUID for Control {
	fn uid(&self) -> WindowUID {
		self.uid
	}
}

impl WindowLayout for Control {
	fn desired_size(&self, available_size: Vector2D<u16>) -> Vector2D<u16> {
		available_size / 2
	}
}