switchable edn example

This commit is contained in:
🪞👃🪞 2025-01-05 16:51:26 +01:00
parent 4ae31bbba0
commit ce4574ed78
8 changed files with 105 additions and 21 deletions

View file

@ -1,27 +1,45 @@
use tek_tui::{*, tek_layout::{*, tek_engine::*}};
use tek_edn::*;
use std::sync::{Arc, RwLock};
use crossterm::event::{*, KeyCode::*};
const EDN: &'static str = include_str!("edn01.edn");
const EDN: &'static [&'static str] = &[
include_str!("edn01.edn"),
include_str!("edn02.edn"),
];
fn main () -> Usually<()> {
let state = Arc::new(RwLock::new(Example));
let state = Arc::new(RwLock::new(Example(0)));
Tui::new().unwrap().run(&state)?;
Ok(())
}
pub struct Example;
pub struct Example(usize);
impl EdnLayout<Tui> for &Example {
impl EdnViewData<Tui> for &Example {
fn get_content <'a> (&'a self, sym: &'a str) -> RenderBox<'a, Tui> {
Box::new(Thunk::new(move||if sym == ":hello-world" { "Hello world!" } else { "" }))
Box::new(Thunk::new(move||match sym {
":hello-world" => "Hello world!",
":hello" => "Hello",
":world" => "world",
_ => ""
}))
}
}
impl Content<Tui> for Example {
fn content (&self) -> impl Render<Tui> {
EdnView::new(self, EDN).unwrap()
EdnView::new(self, EDN[self.0]).unwrap()
}
}
impl Handle<Tui> for Example {}
impl Handle<Tui> for Example {
fn handle (&mut self, input: &TuiIn) -> Perhaps<bool> {
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))
}
}