embedded-gui 0.1.0

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 = 220;
const H: u32 = 120;

fn main() {
    let mut display = SimulatorDisplay::<Rgb565>::new(Size::new(W, H));
    let settings = OutputSettingsBuilder::new().scale(4).build();
    let mut window = Window::new("state surface showcase", &settings);
    let mut gui = GuiContext::<8, 16, 8>::new(Rect::new(0, 0, W, H));

    let surface = gui
        .add_state_surface(
            Rect::new(8, 8, 204, 104),
            SurfaceState::Loading,
            "NETWORK",
            "Connecting to companion service...",
            Some("Retry"),
            Style::panel(),
        )
        .unwrap();

    let mut elapsed_ms = 0u32;
    let mut state_idx = 0usize;
    let states = [
        SurfaceState::Loading,
        SurfaceState::Empty,
        SurfaceState::Error,
        SurfaceState::Offline,
        SurfaceState::Ready,
    ];
    let messages = [
        "Connecting to companion service...",
        "No data available yet.",
        "Sync failed. Try again.",
        "Watch is in offline mode.",
        "Everything looks good.",
    ];

    'running: loop {
        elapsed_ms = elapsed_ms.wrapping_add(16);
        gui.tick_state_surface(surface, 16, 0.8).unwrap();

        if elapsed_ms % 1500 == 0 {
            state_idx = (state_idx + 1) % states.len();
            gui.set_state_surface_state(surface, states[state_idx])
                .unwrap();
            gui.set_state_surface_message(surface, messages[state_idx])
                .unwrap();
            let action = if matches!(states[state_idx], SurfaceState::Ready | SurfaceState::Empty) {
                None
            } else {
                Some("Retry")
            };
            gui.set_state_surface_action(surface, action).unwrap();
        }

        display.clear(Rgb565::BLACK).unwrap();
        gui.render(&mut display).unwrap();
        window.update(&display);

        for event in window.events() {
            match event {
                SimulatorEvent::Quit => break 'running,
                SimulatorEvent::KeyDown { keycode, .. } => match keycode {
                    Keycode::Escape => break 'running,
                    Keycode::Space => {
                        state_idx = (state_idx + 1) % states.len();
                        gui.set_state_surface_state(surface, states[state_idx])
                            .unwrap();
                        gui.set_state_surface_message(surface, messages[state_idx])
                            .unwrap();
                    }
                    _ => {}
                },
                _ => {}
            }
        }

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