extern crate gettextrs;
extern crate ncurseswwin;
use std::{time, process::exit};
use anyhow::{Result, Error};
use gettextrs::{setlocale, LocaleCategory};
use ncurseswwin::{*, extend::*};
fn main() {
if let Err(source) = main_routine() {
if let Some(err) = source.downcast_ref::<NCurseswWinError>() {
match err {
NCurseswWinError::Panic { message } => eprintln!("panic: {}", message),
_ => eprintln!("error: {}", err)
}
} else {
eprintln!("error: {}", source);
}
source.chain().skip(1).for_each(|cause| eprintln!("cause: {}", cause));
exit(1);
}
exit(0);
}
fn main_routine() -> Result<()> {
setlocale(LocaleCategory::LcAll, "");
ncursesw_entry(|stdscr| {
set_input_mode(InputMode::Character)?;
set_echo(false)?;
set_newline(false)?;
intrflush(false)?;
cursor_set(CursorType::Invisible)?;
start_color()?;
use_default_colors()?;
border_set_test(stdscr)
})
}
fn border_set_test(stdscr: &Window) -> Result<()> {
let color_pair = ColorPair::default();
let attrs = Attributes::default();
let initial_size = stdscr.size()?;
let inner_size = Size { lines: initial_size.lines - 2, columns: initial_size.columns - 2 };
let inner_origin = Origin { y: 1, x: 1 };
let inner_window = stdscr.subwin(inner_size, inner_origin)?;
let mut origin = Origin { y: 1, x: 1 };
inner_window.mvaddstr(origin, "If the doors of perception were cleansed every thing would appear to man as it is: Infinite.")?;
origin.y += 1;
inner_window.mvaddstr(origin, "For man has closed himself up, till he sees all things thro' narrow chinks of his cavern.")?;
origin = Origin { y: origin.y + 2, x: 1 };
let box_drawing_types: [BoxDrawingType; 14] = [BoxDrawingType::Ascii,
BoxDrawingType::Light(BoxDrawingTypeDetail::Normal),
BoxDrawingType::Light(BoxDrawingTypeDetail::LeftDash),
BoxDrawingType::Light(BoxDrawingTypeDetail::RightDash),
BoxDrawingType::Light(BoxDrawingTypeDetail::DoubleDash),
BoxDrawingType::Light(BoxDrawingTypeDetail::TripleDash),
BoxDrawingType::Light(BoxDrawingTypeDetail::QuadrupleDash),
BoxDrawingType::Heavy(BoxDrawingTypeDetail::Normal),
BoxDrawingType::Heavy(BoxDrawingTypeDetail::LeftDash),
BoxDrawingType::Heavy(BoxDrawingTypeDetail::RightDash),
BoxDrawingType::Heavy(BoxDrawingTypeDetail::DoubleDash),
BoxDrawingType::Heavy(BoxDrawingTypeDetail::TripleDash),
BoxDrawingType::Heavy(BoxDrawingTypeDetail::QuadrupleDash),
BoxDrawingType::Double];
for &box_drawing_type in &box_drawing_types {
let left_side = complex_box_graphic(box_drawing_type, BoxDrawingGraphic::LeftVerticalLine, &attrs, &color_pair)?;
let right_side = complex_box_graphic(box_drawing_type, BoxDrawingGraphic::RightVerticalLine, &attrs, &color_pair)?;
let top_side = complex_box_graphic(box_drawing_type, BoxDrawingGraphic::UpperHorizontalLine, &attrs, &color_pair)?;
let bottom_side = complex_box_graphic(box_drawing_type, BoxDrawingGraphic::LowerHorizontalLine, &attrs, &color_pair)?;
let upper_left = complex_box_graphic(box_drawing_type, BoxDrawingGraphic::UpperLeftCorner, &attrs, &color_pair)?;
let upper_right = complex_box_graphic(box_drawing_type, BoxDrawingGraphic::UpperRightCorner, &attrs, &color_pair)?;
let lower_left = complex_box_graphic(box_drawing_type, BoxDrawingGraphic::LowerLeftCorner, &attrs, &color_pair)?;
let lower_right = complex_box_graphic(box_drawing_type, BoxDrawingGraphic::LowerRightCorner, &attrs, &color_pair)?;
stdscr.border_set(left_side, right_side, top_side, bottom_side, upper_left, upper_right, lower_left, lower_right)?;
inner_window.set_cursor(origin)?;
inner_window.clrtoeol()?;
inner_window.border_set(left_side, right_side, top_side, bottom_side, upper_left, upper_right, lower_left, lower_right)?;
inner_window.mvaddstr(origin, &format!("box drawing type {:?}", box_drawing_type))?;
stdscr.refresh()?;
if let Some(char_result) = inner_window.getch_nonblocking(Some(time::Duration::new(5, 0)))? {
match char_result {
CharacterResult::Key(key_binding) => if key_binding == KeyBinding::ResizeEvent {
return Err(Error::new(NCurseswError::KeyResize));
},
CharacterResult::Character(character) => if character.to_ascii_lowercase() == 'q' {
break;
}
}
}
}
Ok(())
}