fyodor 0.4.0

Double buffered terminal renderer for Rust
Documentation
use crossterm::event::{self, Event, KeyCode, KeyEvent};
use fyodor::{canvas::CanvasLikeExt, frame::Frame, renderer::Renderer};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut renderer = Renderer::new()?;
    let size = (10, 5);

    let mut frame_clip = Frame::new(renderer.get_render_space())
        .with_size(size)
        .with_pos((10, 5));

    let mut frame = Frame::new(renderer.get_render_space())
        .with_size(size)
        .with_pos((10, 20))
        .no_clip();

    loop {
        let event = event::read()?;

        let mut canvas = renderer.canvas();

        renderer.on_event(&event)?;
        match event {
            Event::Key(KeyEvent {
                code: KeyCode::Enter,
                kind,
                ..
            }) if kind != crossterm::event::KeyEventKind::Release => break,
            _ => {}
        }

        canvas.show((0, 0), &"Press Enter to exit");
        canvas.show(
            (0, 1),
            &"Both frame are same size, just offseted and only one is clipped",
        );

        canvas.show((0, 4), &"Clipped frame");
        for x in -10..frame_clip.size.x {
            for y in -5..frame_clip.size.y {
                frame_clip.show((x, y), &"");
            }
        }

        canvas.show((0, 19), &"Unclipped frame");
        for x in -10..frame.size.x {
            for y in -5..frame.size.y {
                frame.show((x, y), &"");
            }
        }

        renderer.render()?;
    }

    Ok(())
}