use turbo_vision::core::event::KB_ALT_X;
use turbo_vision::prelude::*;
use turbo_vision::core::menu_data::{Menu, MenuItem};
use turbo_vision::views::menu_bar::{MenuBar, SubMenu};
use turbo_vision::views::msgbox::message_box_ok;
use turbo_vision::views::status_line::{StatusItem, StatusLine};
const CMD_ABOUT: u16 = 100;
fn main() -> turbo_vision::core::error::Result<()> {
let mut app = Application::new()?;
let status_line = setup_status_line(&app);
app.set_status_line(status_line);
let menu_bar = setup_menu_bar(&app);
app.set_menu_bar(menu_bar);
run_event_loop(&mut app);
Ok(())
}
fn setup_status_line(app: &Application) -> StatusLine {
let (w, h) = app.terminal.size();
StatusLine::new(Rect::new(0, h as i16 - 1, w as i16, h as i16), vec![StatusItem::new("~Alt-X~ Exit", KB_ALT_X, CM_QUIT)])
}
fn setup_menu_bar(app: &Application) -> MenuBar {
let file_menu_items = vec![
MenuItem::with_shortcut("~O~pen...", CM_OPEN, 0, "Ctrl+O", 0),
MenuItem::separator(),
MenuItem::with_shortcut("E~x~it", CM_QUIT, 0, "Alt+X", 0),
];
let file_menu = SubMenu::new("~F~ile", Menu::from_items(file_menu_items));
let help_menu_items = vec![
MenuItem::with_shortcut("~A~bout", CMD_ABOUT, 0, "F1", 0), ];
let help_menu = SubMenu::new("~H~elp", Menu::from_items(help_menu_items));
let (w, _) = app.terminal.size();
let mut menu_bar = MenuBar::new(Rect::new(0, 0, w as i16, 1));
menu_bar.add_submenu(file_menu);
menu_bar.add_submenu(help_menu);
menu_bar
}
fn run_event_loop(app: &mut Application) {
app.running = true;
while app.running {
redraw_screen(app);
if let Ok(Some(mut event)) = app.terminal.poll_event(std::time::Duration::from_millis(50)) {
if let Some(ref mut menu_bar) = app.menu_bar {
menu_bar.handle_event(&mut event);
}
if let Some(ref mut status_line) = app.status_line {
status_line.handle_event(&mut event);
}
if event.what == EventType::Command {
redraw_screen(app);
handle_command(app, event.command);
}
}
}
}
fn handle_command(app: &mut Application, command: u16) {
match command {
CM_QUIT => {
app.running = false;
}
CM_OPEN => {
message_box_ok(app, "Open...");
}
CMD_ABOUT => {
message_box_ok(app, "About...");
}
_ => {}
}
}
fn redraw_screen(app: &mut Application) {
app.desktop.draw(&mut app.terminal);
if let Some(ref mut menu_bar) = app.menu_bar {
menu_bar.draw(&mut app.terminal);
}
if let Some(ref mut status_line) = app.status_line {
status_line.draw(&mut app.terminal);
}
let _ = app.terminal.flush();
}