use ncursesw::{*, menu::*};
fn main() {
if let Err(source) = menu_routine() {
eprintln!("error: {}", source);
}
}
fn menu_routine() -> Result<(), NCurseswError> {
initscr()?;
cbreak()?;
noecho()?;
curs_set(CursorType::Invisible)?;
keypad(stdscr(), true)?;
let mut items = vec![new_item("Choice 1", "Choice 1 description")?,
new_item("Choice 2", "Choice 2 description")?,
new_item("Choice 3", "Choice 3 description")?,
new_item("Choice 4", "Choice 4 description")?,
new_item("Exit", "Exit description")?];
let my_menu = new_menu(&mut items)?;
let menu_opts = MenuOptions::default().set_show_description(true);
menu_opts_off(Some(my_menu), menu_opts)?;
let my_menu_win = newwin(Size { lines: 9, columns: 18 }, Origin { y: 4, x: 4 })?;
keypad(my_menu_win, true)?;
set_menu_win(Some(my_menu), Some(my_menu_win))?;
let my_menu_win_der_win = derwin(my_menu_win, Size { lines: 5, columns: 0 }, Origin { y: 2, x: 2 })?;
set_menu_sub(Some(my_menu), Some(my_menu_win_der_win))?;
set_menu_mark(Some(my_menu), " * ")?;
r#box(my_menu_win, ChtypeChar::from(0), ChtypeChar::from(0))?;
let mut origin = Origin { y: LINES() - 3, x: 0 };
mvaddstr(origin, "Press <Enter> to see the option selected")?;
origin.y += 1;
mvaddstr(origin, "F1 to exit")?;
refresh()?;
post_menu(my_menu)?;
wrefresh(my_menu_win)?;
loop {
match getch()? {
CharacterResult::Key(KeyBinding::FunctionKey(1)) => {
break
},
CharacterResult::Key(KeyBinding::UpArrow) => {
if let Err(source) = menu_driver(my_menu, MenuRequest::UpItem) {
if source != request_denied_error() {
return Err(NCurseswError::from(source))
}
}
},
CharacterResult::Key(KeyBinding::DownArrow) => {
if let Err(source) = menu_driver(my_menu, MenuRequest::DownItem) {
if source != request_denied_error() {
return Err(NCurseswError::from(source))
}
}
},
CharacterResult::Character('\n') => { origin = Origin { y: 20, x: 0 };
r#move(origin)?;
clrtoeol()?;
mvaddstr(origin, format!("Item selected is : {}", item_name(current_item(my_menu)?)?))?;
pos_menu_cursor(my_menu)?;
},
_ => { }
};
wrefresh(my_menu_win)?;
}
unpost_menu(my_menu)?;
free_menu(my_menu)?;
delwin(my_menu_win_der_win)?;
delwin(my_menu_win)?;
for item in items.iter().rev() {
free_item(*item)?;
}
endwin()
}
fn request_denied_error() -> NCurseswMenuError {
NCurseswMenuError::RequestDenied { func: "menu_driver".to_string() }
}