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
}
}