use tek_tui::{*, tek_layout::{*, tek_engine::*}}; use tek_edn::*; use std::sync::{Arc, RwLock}; use crossterm::event::{*, KeyCode::*}; const EDN: &'static [&'static str] = &[ include_str!("edn01.edn"), include_str!("edn02.edn"), ]; fn main () -> Usually<()> { let state = Arc::new(RwLock::new(Example(0))); Tui::new().unwrap().run(&state)?; Ok(()) } pub struct Example(usize); impl EdnViewData for &Example { fn get_content <'a> (&'a self, sym: EdnItem<&'a str>) -> RenderBox<'a, TuiOut> { Box::new(Thunk::new(move||match sym { EdnItem::Sym(":hello-world") => "Hello world!", EdnItem::Sym(":hello") => "Hello", EdnItem::Sym(":world") => "world", _ => "" })) } } impl Content for Example { fn content (&self) -> impl Render { Bsp::a( Push::xy(1, 1, Align::n(format!("Example {}/{}:", self.0 + 1, EDN.len()))), EdnView::from_source(self, EDN[self.0]) ) } } impl Handle for Example { fn handle (&mut self, input: &TuiIn) -> Perhaps { match input.event() { kpat!(Right) => self.0 = (self.0 + 1) % EDN.len(), kpat!(Left) => self.0 = if self.0 > 0 { self.0 - 1 } else { EDN.len() - 1 }, _ => return Ok(None) } Ok(Some(true)) } }