embedded-gui 0.2.3

no_std GUI and HUD primitives for embedded-graphics displays
Documentation
use embedded_graphics_core::{
    draw_target::DrawTarget,
    geometry::Size,
    pixelcolor::{Rgb565, RgbColor},
};
use embedded_graphics_simulator::{
    OutputSettingsBuilder, SimulatorDisplay, SimulatorEvent, Window, sdl2::Keycode,
};
use embedded_gui::prelude::*;

const W: u32 = 160;
const H: u32 = 96;

fn main() {
    let mut display = SimulatorDisplay::<Rgb565>::new(Size::new(W, H));
    let settings = OutputSettingsBuilder::new().scale(4).build();
    let mut window = Window::new("embedded-gui animation + dirty regions", &settings);

    display.clear(Rgb565::BLACK).unwrap();

    let mut gui = GuiContext::<12, 16, 12>::new(Rect::new(0, 0, W, H));
    gui.add_panel(Rect::new(4, 4, 152, 88), Style::panel())
        .unwrap();
    gui.add_label(
        Rect::new(10, 10, 136, 10),
        "ANIMATION + DIRTY",
        Style::label(),
    )
    .unwrap();
    let progress = gui
        .add_progress_bar(Rect::new(10, 30, 120, 10), 0.0, Style::progress())
        .unwrap();
    let percent = gui
        .add_value_label(Rect::new(10, 48, 72, 12), "PCT", 0, Style::panel())
        .unwrap();
    let dirty_count = gui
        .add_value_label(Rect::new(10, 66, 72, 12), "DIRTY", 0, Style::panel())
        .unwrap();
    gui.add_label(
        Rect::new(88, 48, 58, 28),
        "ONLY\nDIRTY\nWIDGETS",
        Style::label(),
    )
    .unwrap();

    gui.render(&mut display).unwrap();
    gui.clear_dirty();

    let mut tween = Animation::new(0.0, 1.0, 900, Easing::InOutSine)
        .with_repeat_mode(RepeatMode::PingPong)
        .with_repeat_count(None);

    'running: loop {
        tween.tick(16);

        let value = tween.value();
        gui.set_progress(progress, value).unwrap();
        gui.set_value_label(percent, (value * 100.0) as i32)
            .unwrap();
        gui.set_value_label(dirty_count, gui.dirty_regions().len() as i32)
            .unwrap();
        gui.render_dirty(&mut display).unwrap();
        gui.clear_dirty();

        window.update(&display);
        for event in window.events() {
            match event {
                SimulatorEvent::Quit => break 'running,
                SimulatorEvent::KeyDown {
                    keycode: Keycode::Escape,
                    ..
                } => break 'running,
                _ => {}
            }
        }

        std::thread::sleep(std::time::Duration::from_millis(16));
    }
}