pixels-graphics-lib 0.22.1

Simple pixel graphics and GUI library
Documentation
use anyhow::Result;
use buffer_graphics_lib::prelude::*;
use pixels_graphics_lib::prelude::SceneUpdateResult::*;
use pixels_graphics_lib::prelude::*;
use pixels_graphics_lib::ui::prelude::TextFilter::Numbers;
use pixels_graphics_lib::ui::prelude::*;
use pixels_graphics_lib::ui::text_field::TextFilter::All;
use winit::keyboard::KeyCode;

const WIDTH: usize = 280;
const HEIGHT: usize = 240;

fn main() -> Result<()> {
    let switcher: SceneSwitcher<SceneResult, SceneName> = |_, _, _| {};
    let options = Options::default();
    let test = LayoutTest::new(&options.style);
    run_scenes(
        WIDTH,
        HEIGHT,
        "Layout Tester",
        None,
        switcher,
        test,
        options,
        empty_pre_post(),
    )?;
    Ok(())
}

#[derive(Debug, Clone, PartialEq)]
enum SceneName {}

#[derive(Debug, Clone, PartialEq)]
enum SceneResult {}

pub struct LayoutTest {
    row_layout: RowLayout,
    column_layout: ColumnLayout,
    button: Button,
    icon_button: IconButton,
    toggle_button: ToggleButton,
    toggle_icon_button: ToggleIconButton,
    text_field: TextField,
    column: Button,
    row: Button,
    spacing: TextField,
    padding: TextField,
    lefttop: Button,
    center: Button,
    rightbottom: Button,
}

impl LayoutTest {
    pub fn new(style: &UiStyle) -> Box<Self> {
        let button = Button::new((50, 50), "Button", None, &style.button);
        let toggle_button = ToggleButton::new((50, 50), "Button", None, &style.toggle_button);
        let icon_button = IconButton::new(
            (50, 50),
            "Icon",
            Positioning::RightBottom,
            IndexedImage::from_file_contents(include_bytes!("resources/icon.ici"))
                .unwrap()
                .0,
            &style.icon_button,
        );
        let toggle_icon_button = ToggleIconButton::new(
            (50, 50),
            "Toggle Icon",
            Positioning::Center,
            IndexedImage::from_file_contents(include_bytes!("resources/icon.ici"))
                .unwrap()
                .0,
            &style.toggle_icon_button,
        );
        let mut column = Button::new((0, 0), "Column", None, &style.button);
        let mut row = Button::new((0, 0), "Row", None, &style.button);
        let mut lefttop = Button::new((0, 0), "Left/Top", None, &style.button);
        let mut center = Button::new((0, 0), "Center", None, &style.button);
        let mut rightbottom = Button::new((0, 0), "Right/Bottom", None, &style.button);
        let text_field = TextField::new(
            (50, 50),
            10,
            PixelFont::Standard6x7,
            (None, None),
            "",
            &[All],
            &style.text_field,
        );
        let mut spacing = TextField::new(
            (0, 0),
            4,
            PixelFont::Standard6x7,
            (None, None),
            "0",
            &[Numbers],
            &style.text_field,
        );
        let mut padding = TextField::new(
            (0, 0),
            4,
            PixelFont::Standard6x7,
            (None, None),
            "0",
            &[Numbers],
            &style.text_field,
        );
        let row_layout = RowLayout::new_bounded(Rect::new_with_size((8, 50), 100, 100));
        let column_layout = ColumnLayout::new_bounded(Rect::new_with_size((8, 50), 100, 100));

        let temp_layout = RowLayout::new(
            8,
            8,
            Rect::new_with_size((0, 6), WIDTH, 20),
            RowGravity::Center,
        );
        temp_layout.layout(&mut [&mut row, &mut column, &mut spacing, &mut padding]);

        let temp_layout = RowLayout::new(
            8,
            8,
            Rect::new_with_size((0, 20), WIDTH, 30),
            RowGravity::Center,
        );
        temp_layout.layout(&mut [&mut lefttop, &mut center, &mut rightbottom]);

        Box::new(Self {
            row_layout,
            column_layout,
            button,
            icon_button,
            toggle_button,
            toggle_icon_button,
            text_field,
            column,
            row,
            spacing,
            padding,
            lefttop,
            center,
            rightbottom,
        })
    }
}

impl Scene<SceneResult, SceneName> for LayoutTest {
    fn render(&self, graphics: &mut Graphics, mouse: &MouseData, _: &FxHashSet<KeyCode>) {
        graphics.clear(BLUE);
        self.button.render(graphics, mouse);
        self.toggle_button.render(graphics, mouse);
        self.icon_button.render(graphics, mouse);
        self.toggle_icon_button.render(graphics, mouse);
        self.text_field.render(graphics, mouse);
        self.spacing.render(graphics, mouse);
        self.padding.render(graphics, mouse);
        self.row.render(graphics, mouse);
        self.column.render(graphics, mouse);
        self.lefttop.render(graphics, mouse);
        self.center.render(graphics, mouse);
        self.rightbottom.render(graphics, mouse);
    }

    fn on_key_up(&mut self, key: KeyCode, _: &MouseData, held: &FxHashSet<KeyCode>) {
        self.text_field.on_key_press(key, held);
        self.padding.on_key_press(key, held);
        self.spacing.on_key_press(key, held);
    }

    fn on_mouse_click(
        &mut self,
        down_at: Coord,
        mouse: &MouseData,
        _: MouseButton,
        _: &FxHashSet<KeyCode>,
    ) {
        self.text_field.on_mouse_click(down_at, mouse.xy);
        self.spacing.on_mouse_click(down_at, mouse.xy);
        self.padding.on_mouse_click(down_at, mouse.xy);
        if self.row.on_mouse_click(down_at, mouse.xy) {
            self.row_layout.padding = self.padding.content().parse::<usize>().unwrap_or_default();
            self.row_layout.spacing = self.spacing.content().parse::<usize>().unwrap_or_default();
            self.row_layout.layout(&mut [
                &mut self.button,
                &mut self.toggle_button,
                &mut self.text_field,
                &mut self.icon_button,
                &mut self.toggle_icon_button,
            ]);
        }
        if self.column.on_mouse_click(down_at, mouse.xy) {
            self.column_layout.padding =
                self.padding.content().parse::<usize>().unwrap_or_default();
            self.column_layout.spacing =
                self.spacing.content().parse::<usize>().unwrap_or_default();
            self.column_layout.layout(&mut [
                &mut self.button,
                &mut self.toggle_button,
                &mut self.text_field,
                &mut self.icon_button,
                &mut self.toggle_icon_button,
            ]);
        }
        if self.lefttop.on_mouse_click(down_at, mouse.xy) {
            self.column_layout.gravity = ColumnGravity::Left;
            self.row_layout.gravity = RowGravity::Top;
        }
        if self.center.on_mouse_click(down_at, mouse.xy) {
            self.column_layout.gravity = ColumnGravity::Center;
            self.row_layout.gravity = RowGravity::Center;
        }
        if self.rightbottom.on_mouse_click(down_at, mouse.xy) {
            self.column_layout.gravity = ColumnGravity::Right;
            self.row_layout.gravity = RowGravity::Bottom;
        }
    }

    fn update(
        &mut self,
        timing: &Timing,
        _: &MouseData,
        _: &FxHashSet<KeyCode>,
        _: &Window,
    ) -> SceneUpdateResult<SceneResult, SceneName> {
        self.text_field.update(timing);
        self.spacing.update(timing);
        self.padding.update(timing);
        Nothing
    }

    fn resuming(&mut self, _: Option<SceneResult>) {}
}