lv-tui 0.4.0

A reactive TUI framework for Rust
Documentation
use lv_tui::prelude::*;
use lv_tui::Component;
use lv_tui::widgets::{Column, Label};

#[derive(Component)]
struct Counter {
    #[reactive(paint)]
    count: i32,
}

impl Counter {
fn new() -> Self {
        Self { count: 0 }
    }
}

impl Component for Counter {
fn render(&self, cx: &mut RenderCx) {
        cx.line(format!("count: {}", self.count()));
    }
fn event(&mut self, event: &Event, cx: &mut EventCx) {
        if cx.phase() != lv_tui::event::EventPhase::Target { return; }
        if event.is_key(Key::Char('+')) {
            self.update_count(cx, |n| *n += 1);
        }
        if event.is_key(Key::Char('q')) {
            cx.quit();
        }
    }
}

fn main() -> lv_tui::Result<()> {
    let inner = Column::new()
        .padding(1)
        .gap(0)
        .child(Label::new("  inner column"))
        .child(Label::new("  another label"))
        .child(Counter::new());

    App::new(
        Column::new()
            .padding(1)
            .gap(1)
            .child(Label::new("=== Nested Component Tree ==="))
            .child(inner)
            .child(Label::new("press + to increment, q to quit")),
    )
    .run()
}