faststep 0.1.0

UIKit-inspired embedded UI framework built on embedded-graphics
Documentation
use embedded_graphics::{prelude::Point, primitives::Rectangle};
use faststep::{
    AppRedraw, FsTheme, I18n, Localized, TouchEvent, TouchPhase, UiApp, ViewDelegate, ViewResponse,
};

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
enum ViewId {
    Home,
    Detail,
}

struct TestDelegate;

impl<'a> ViewDelegate<'a, ViewId> for TestDelegate {
    fn title(&self, view: ViewId) -> Localized<'a> {
        match view {
            ViewId::Home => Localized::new("home.title", "Home"),
            ViewId::Detail => Localized::new("detail.title", "Detail"),
        }
    }

    fn draw_view<D>(
        &self,
        _view: ViewId,
        _display: &mut D,
        _frame: Rectangle,
        _theme: &FsTheme,
        _i18n: &I18n<'a>,
    ) where
        D: embedded_graphics::draw_target::DrawTarget<
                Color = embedded_graphics::pixelcolor::Rgb565,
            >,
    {
    }

    fn handle_view_touch(
        &mut self,
        view: ViewId,
        touch: TouchEvent,
        _frame: Rectangle,
        _theme: &FsTheme,
        _i18n: &I18n<'a>,
    ) -> ViewResponse<ViewId> {
        if touch.phase != TouchPhase::End {
            return ViewResponse::none();
        }

        match view {
            ViewId::Home => ViewResponse::push(ViewId::Detail),
            ViewId::Detail => ViewResponse::pop(),
        }
    }
}

#[test]
fn ui_app_uses_explicit_root_and_navigation_responses() {
    let bounds = Rectangle::new(
        Point::zero(),
        embedded_graphics::geometry::Size::new(320, 240),
    );
    let mut app = UiApp::<ViewId, TestDelegate, 4>::new(
        ViewId::Home,
        TestDelegate,
        FsTheme::default(),
        I18n::new("en", "en", &[]),
    );

    assert_eq!(app.active_view(), ViewId::Home);
    assert_eq!(
        app.handle_touch(
            TouchEvent::new(Point::new(12, 12), TouchPhase::End, 1),
            bounds
        ),
        AppRedraw::StackMotion
    );
    assert_eq!(app.active_view(), ViewId::Detail);
}