#terminal #events #bevy #rendering #term #terminal-plugins

bevy_term

Easy terminal event handling and rendering with Bevy!

1 unstable release

0.15.0 Dec 5, 2024

#901 in Game dev

Download history 116/week @ 2024-12-02 23/week @ 2024-12-09

139 downloads per month

AGPL-3.0

81KB
84 lines

Bevy Term

Easy terminal event handling and rendering with Bevy!


bevy_term_counter screenshot

Description

This crate primarily provides the TerminalPlugin for Bevy. It allows for easily rendering to the terminal and handling terminal events.

Features

  • Work In Progress
  • ...

Usage

Check out the examples directory!

Add the TerminalPlugin
fn main() -> AppExit {
    App::new()
        .add_plugins(TerminalPlugin)
        // ...
        .run()
}
Register a system for rendering to the terminal
fn main() -> AppExit {
    App::new()
        .add_systems(PostUpdate, render)
        // ...
        .run()
}

fn render(mut terminal: ResMut<Terminal>) {
    terminal
        .0
        .draw(|frame| {
            let chunks = Layout::default()
                .direction(Direction::Vertical)
                .constraints([Constraint::Percentage(49), Constraint::Min(1)].as_ref())
                .split(frame.area());

            frame.render_widget(
                Paragraph::new("Hellow World!\nPress `ESC` or `C-d` to exit.")
                    .alignment(Alignment::Center),
                chunks[1],
            );
        })
        .unwrap();
}
(Optional) Register a system for handling terminal events
fn main() -> AppExit {
    App::new()
        .add_systems(PreUpdate, handler)
        // ...
        .run()
}

fn handler(
    mut terminal_events: EventReader<bevy_term::Event>,
    mut tui_state: ResMut<bevy_term::State>,
) {
    for terminal_event in terminal_events.read() {
        if let Event::Key(key_event) = terminal_event.0 {
            if key_event.code == KeyCode::Esc {
                *tui_state = bevy_term::State::Exit
            }
        }
    }
}

Dependencies

~16–27MB
~398K SLoC