altar 0.1.0

A TUI library in the style of SwiftUI
Documentation
use super::*;

pub trait SyncTerminalApp {
    fn render(&self) -> impl View;
    fn update(&mut self, event: KeyEvent);
    fn handle_exit(&mut self) -> Option<impl View> {
        None as Option<EmptyView>
    }
}

pub trait SyncTerminalAppExt: SyncTerminalApp {
    fn run(&mut self, use_full_screen: bool) {
        let mut renderer = create_renderer(use_full_screen);
        let _guard = RawModeGuard::new(use_full_screen);

        loop {
            renderer.render(&self.render());
            let event = crossterm::event::read().unwrap();
            match event {
                CrosstermEvent::Key(KeyEvent {
                    code: KeyCode::Char('c' | 'd'),
                    modifiers: KeyModifiers::CONTROL,
                    ..
                }) => break,
                CrosstermEvent::Mouse(MouseEvent { kind, .. }) => match kind {
                    MouseEventKind::ScrollDown => {
                        self.update(KeyEvent::new(KeyCode::Down, KeyModifiers::NONE))
                    }
                    MouseEventKind::ScrollUp => {
                        self.update(KeyEvent::new(KeyCode::Up, KeyModifiers::NONE))
                    }
                    _ => {}
                },
                CrosstermEvent::Resize(width, height) => {
                    renderer.resize(width, height);
                }
                CrosstermEvent::Key(event) => {
                    self.update(event);
                }
                _ => {}
            }
        }

        if let Some(view) = self.handle_exit() {
            renderer.render(&view);
        }
        renderer.move_cursor_to_bottom_of_current_view();
    }
}

impl<T: SyncTerminalApp> SyncTerminalAppExt for T {}