glerminal 0.3.0

A lightweight OpenGL terminal
Documentation
use glerminal::menu_systems::{
    Checkbox, CheckboxGroup, Dialog, Filter, FocusSelection, GrowthDirection, Menu, MenuList,
    MenuPosition, TextInput, TextItem, Window,
};
use glerminal::{MouseButton, TerminalBuilder, TextBuffer, TextStyle, VirtualKeyCode};

fn main() {
    let terminal = TerminalBuilder::new()
        .with_title("Simple window")
        .with_dimensions((1280, 720))
        .build();
    let mut text_buffer;
    match TextBuffer::create(&terminal, (80, 24)) {
        Ok(buffer) => text_buffer = buffer,
        Err(error) => panic!(format!("Failed to initialize text buffer: {}", error)),
    }

    let filter = Filter::empty_filter()
        .with_basic_latin_characters()
        .with_basic_numerals()
        .with_latin_1_supplement()
        .with_latin_extended_a()
        .with_basic_special_symbols();

    let mut text_label = TextItem::new("FPS: -").with_max_width(40);

    let mut text_input = TextInput::new(None, None)
        .with_prefix("Test your might: ")
        .with_filter(filter.clone())
        .with_character_limit(10)
        .with_focused_style(TextStyle {
            fg_color: [0.2, 0.2, 0.2, 1.0],
            bg_color: [0.2, 0.8, 0.2, 1.0],
            ..Default::default()
        });

    let mut text_input_2 = TextInput::new(10, 10)
        .with_prefix("Test 2: [")
        .with_suffix("]")
        .with_filter(filter.clone())
        .with_focused_style(TextStyle {
            fg_color: [0.8, 0.8, 0.8, 1.0],
            bg_color: [0.8, 0.2, 0.2, 1.0],
            ..Default::default()
        })
        .with_caret(0.0);

    let mut checkbox =
        Checkbox::new("Thing 1: ").with_mouse_button_press_inputs(vec![MouseButton::Left]);
    let mut checkbox_2 =
        Checkbox::new("Thing 2: ").with_mouse_button_press_inputs(vec![MouseButton::Left]);
    let mut checkbox_3 =
        Checkbox::new("Thing 3: ").with_mouse_button_press_inputs(vec![MouseButton::Left]);

    let mut button = TextItem::new("Test button!")
        .with_is_button(true)
        .with_mouse_button_press_inputs(vec![MouseButton::Left]);

    let mut menu = Menu::new()
        .with_pos((5, 5))
        .with_focus(true)
        .with_growth_direction(GrowthDirection::Down)
        .with_focus_selection(FocusSelection::MouseAndKeyboard(None, None));

    let mut checkbox_group = CheckboxGroup::new().with_force_one_checked(Some(0));

    let mut dialog = Dialog::new(30, 3, 3).with_text(
        "Hello! This is a test text with some stuff, this is supposed to test the dialog window. Testwordlongerthan30charactersfortest",
    ).with_up_buttons(vec!(VirtualKeyCode::O)).with_down_buttons(vec!(VirtualKeyCode::L));

    let test_window = Window::new(70, 20)
        .with_pos((1, 1))
        .with_title("Hello, World!")
        .with_horizontal_split(5);
    test_window.set_limits(&mut text_buffer);

    let mut frames = 0;
    let mut timer = 0.0;
    let mut button_presses = 0;

    while terminal.refresh() {
        timer += terminal.delta_time();
        frames += 1;
        if timer > 1.0 {
            timer -= 1.0;
            text_label.set_text(format!(
                "FPS: {}, delta_time (ms): {:.6}",
                frames,
                terminal.delta_time() * 1000 as f32
            ));
            frames = 0;
        }

        let events = terminal.get_current_events();

        let mut dirty = menu.update(
            &events,
            terminal.delta_time(),
            &text_buffer,
            &mut MenuList::new()
                .with_item(&mut text_label, None)
                .with_item(&mut text_input, MenuPosition::RelativeToLast(0, 1))
                .with_item(&mut text_input_2, None)
                .with_item(&mut checkbox, None)
                .with_item(&mut checkbox_2, None)
                .with_item(&mut checkbox_3, None)
                .with_item(&mut button, None)
                .with_item(&mut dialog, MenuPosition::RelativeToLast(0, 1)),
        );

        checkbox_group.update(&mut [&mut checkbox, &mut checkbox_2, &mut checkbox_3]);

        if button.was_just_pressed() || text_input_2.was_just_pressed() {
            button_presses += 1;
            dirty = true;
        }

        if dirty {
            text_buffer.clear();

            test_window.draw(&mut text_buffer);
            menu.draw(&mut text_buffer);

            text_buffer.cursor.style = TextStyle {
                fg_color: [0.8, 0.8, 0.8, 1.0],
                bg_color: [0.0, 0.0, 0.0, 0.0],
                ..Default::default()
            };
            text_buffer.cursor.move_to(42, 15);
            text_buffer.write(format!(
                "Text: {} {}",
                text_input.get_text(),
                text_input_2.get_text()
            ));
            text_buffer.cursor.move_to(43, 16);
            text_buffer.write(format!("Button presses: {}", button_presses));
            text_buffer.cursor.move_to(43, 17);
            text_buffer.write(format!("Checked: {:?}", checkbox_group.get_selection_idx()));

            terminal.flush(&mut text_buffer);
        }

        terminal.draw(&text_buffer);
    }
}