hecto/src/editor.rs

78 lines
1.9 KiB
Rust

use crate::Terminal;
use termion::event::Key;
const VERSION: &str = env!("CARGO_PKG_VERSION");
pub struct Editor {
should_quit: bool,
terminal: Terminal,
}
impl Editor {
pub fn run(&mut self) {
loop {
if let Err(error) = self.refresh_screen() {
die(error);
}
if self.should_quit {
break;
}
if let Err(error) = self.process_keypress() {
die(error);
}
}
}
pub fn default() -> Self {
Self {
should_quit: false,
terminal: Terminal::default().expect("Failed to initialize terminal"),
}
}
fn refresh_screen(&self) -> Result<(), std::io::Error> {
Terminal::cursor_hide();
Terminal::cursor_position(0, 0);
if self.should_quit {
Terminal::clear_screen();
println!("Goodbye.\r");
} else {
self.draw_rows();
Terminal::cursor_position(0, 0);
}
Terminal::cursor_show();
Terminal::flush()
}
fn process_keypress(&mut self) -> Result<(), std::io::Error> {
let pressed_key = Terminal::read_key()?;
match pressed_key {
Key::Ctrl('q') => self.should_quit = true,
_ => (),
}
Ok(())
}
fn draw_rows(&self) {
let height = self.terminal.size().height;
for row in 0..height - 1 {
Terminal::clear_current_line();
if row == height / 3 {
let welcome_message = format!("Hecto editor -- version {}", VERSION);
let width = std::cmp::min(self.terminal.size() as usize, welcome_message.len());
println!("{}\r", &welcome_message[..width]);
} else {
println!("~\r");
}
}
}
}
fn die(e: std::io::Error) {
Terminal::clear_screen();
panic!(e);
}