checkline 1.1.3

checkline: checkbox line picker for stdin line input
use cursive::view::{Nameable, Resizable, Selector};

pub fn initialize(c: &mut cursive::Cursive) -> usize  {
    initialize_keys(c);
    initialize_theme(c);
    let row_count = load_rows(c);
    row_count
}

pub fn initialize_keys(c: &mut cursive::Cursive) {
    c.add_global_callback(cursive::event::Key::Esc, |c| c.quit());
}

pub fn initialize_theme(c: &mut cursive::Cursive) {
    let mut theme = c.current_theme().clone();
    theme.shadow = false;
    theme.borders = cursive::theme::BorderStyle::None;
    theme.palette[cursive::theme::PaletteColor::Background] = cursive::theme::Color::Rgb(std::u8::MIN, std::u8::MIN, std::u8::MIN);
    theme.palette[cursive::theme::PaletteColor::View] = cursive::theme::Color::Rgb(std::u8::MAX, std::u8::MAX, std::u8::MAX);
    c.set_theme(theme);
}

pub fn load_rows(c: &mut cursive::Cursive) -> usize {
    let mut row_index: usize = 0;
    let mut grid = cursive::views::LinearLayout::vertical();
    for line in std::io::stdin().lines() {
        let line = line.expect("line");
        if line.len() > 0 {
            grid.add_child(load_row(&line, row_index).full_width());
            row_index += 1;
        }
    }
    c.add_fullscreen_layer(grid.with_name("grid").full_screen());
    row_index
}

pub fn load_row(line_str: &str, row_index: usize) ->  cursive::views::LinearLayout {
    let mut row = cursive::views::LinearLayout::horizontal();
    let checkbox = cursive::views::Checkbox::new();
    let text_view = cursive::views::TextView::new(line_str.to_owned());
    row.add_child(checkbox.with_name(format!("row_{}_checkbox", row_index)));
    row.add_child(cursive::views::DummyView);
    row.add_child(text_view.with_name(format!("row_{}_text_view", row_index)).full_width());
    row
}

pub fn print_output(c: &mut cursive::Cursive, row_count: usize) {
    let mut output = String::new();
    let mut checked: bool;
    for row_index in 0..row_count {
        checked = false;
        c.call_on(&Selector::Name(&format!("row_{}_checkbox", row_index)), |checkbox: &mut cursive::views::Checkbox| {
            checked = checkbox.is_checked();
        });
        if checked {
            c.call_on(&Selector::Name(&format!("row_{}_text_view", row_index)), |text_view: &mut cursive::views::TextView| {
                output.push_str(&format!("{}\n", text_view.get_content().source()));
            });
        }
    }
    if output.len() == 0 { output = String::from("\n"); }
    print!("{}", output);
}