YAMLabyrinth skeleton v0.0.1
This commit is contained in:
59
src/tui.rs
Normal file
59
src/tui.rs
Normal file
@@ -0,0 +1,59 @@
|
||||
use anyhow::Result;
|
||||
use crossterm::event::{self, Event, KeyCode};
|
||||
use crossterm::execute;
|
||||
use crossterm::terminal::{
|
||||
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
|
||||
};
|
||||
use ratatui::backend::CrosstermBackend;
|
||||
use ratatui::widgets::{Block, Borders, Paragraph};
|
||||
use ratatui::Terminal;
|
||||
use std::io::{stdout, Stdout};
|
||||
|
||||
pub fn run() -> Result<()> {
|
||||
install_panic_hook();
|
||||
let mut terminal = enter()?;
|
||||
let result = main_loop(&mut terminal);
|
||||
leave()?;
|
||||
result
|
||||
}
|
||||
|
||||
fn install_panic_hook() {
|
||||
let prev = std::panic::take_hook();
|
||||
std::panic::set_hook(Box::new(move |info| {
|
||||
let _ = leave();
|
||||
prev(info);
|
||||
}));
|
||||
}
|
||||
|
||||
fn enter() -> Result<Terminal<CrosstermBackend<Stdout>>> {
|
||||
enable_raw_mode()?;
|
||||
execute!(stdout(), EnterAlternateScreen)?;
|
||||
Ok(Terminal::new(CrosstermBackend::new(stdout()))?)
|
||||
}
|
||||
|
||||
fn leave() -> Result<()> {
|
||||
disable_raw_mode()?;
|
||||
execute!(stdout(), LeaveAlternateScreen)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn main_loop(terminal: &mut Terminal<CrosstermBackend<Stdout>>) -> Result<()> {
|
||||
loop {
|
||||
terminal.draw(|frame| {
|
||||
let block = Block::default()
|
||||
.borders(Borders::ALL)
|
||||
.title(" YAMLabyrinth ");
|
||||
let body = Paragraph::new(
|
||||
"Welcome to the YAML labyrinth.\n\nPress [q] to flee.",
|
||||
)
|
||||
.block(block);
|
||||
frame.render_widget(body, frame.size());
|
||||
})?;
|
||||
|
||||
if let Event::Key(key) = event::read()? {
|
||||
if key.code == KeyCode::Char('q') {
|
||||
return Ok(());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user