faststep 0.1.0

UIKit-inspired embedded UI framework built on embedded-graphics
Documentation
#[path = "support/mod.rs"]
mod support;

use embedded_graphics::{
    Drawable,
    draw_target::DrawTarget,
    pixelcolor::Rgb565,
    prelude::{Point, Primitive, Size},
    primitives::{PrimitiveStyle, Rectangle},
};
use faststep::{
    ListDataSource, ListDelegate, ListRow, ListSelection, ListView, ScrollView, TouchEvent,
    TouchPhase, ViewEnvironment,
};

struct DemoDataSource;

impl ListDataSource for DemoDataSource {
    type ItemId = u8;

    fn item_count(&self) -> usize {
        4
    }

    fn item_id(&self, index: usize) -> Self::ItemId {
        index as u8
    }

    fn item_height(&self, index: usize) -> u32 {
        if index == 1 { 64 } else { 48 }
    }
}

struct DemoDelegate;

impl ListDelegate<'static, u8> for DemoDelegate {
    type Message = u8;

    fn draw_row<D>(&self, display: &mut D, row: ListRow<u8>, _env: &ViewEnvironment<'_, 'static>)
    where
        D: DrawTarget<Color = Rgb565>,
    {
        let fill = if row.state.highlighted {
            Rgb565::new(24, 52, 28)
        } else {
            Rgb565::new(29, 59, 29)
        };
        row.item
            .frame
            .into_styled(PrimitiveStyle::with_fill(fill))
            .draw(display)
            .ok();
    }

    fn did_select_item(&mut self, selection: ListSelection<u8>) -> Option<Self::Message> {
        Some(selection.id)
    }
}

fn main() {
    let mut canvas = support::NullCanvas::new(Size::new(320, 240));
    let viewport = Rectangle::new(Point::new(16, 16), Size::new(180, 160));

    let mut scroll = ScrollView::new();
    scroll.begin_drag(TouchEvent::new(Point::new(8, 8), TouchPhase::Start, 1));
    let _ = scroll.drag(
        TouchEvent::new(Point::new(8, 32), TouchPhase::Move, 2),
        420,
        160,
    );
    let _ = scroll.end_drag(
        TouchEvent::new(Point::new(8, 32), TouchPhase::End, 3),
        420,
        160,
    );
    let _ = scroll.tick(16, 420, 160);
    let _ = scroll.scroll_bar(viewport, 420);

    let mut list = ListView::new(DemoDataSource, DemoDelegate);
    let _ = list.handle_touch(
        TouchEvent::new(Point::new(24, 24), TouchPhase::Start, 10),
        viewport,
    );
    let _ = list.handle_touch(
        TouchEvent::new(Point::new(24, 60), TouchPhase::Move, 11),
        viewport,
    );
    let _ = list.handle_touch(
        TouchEvent::new(Point::new(24, 60), TouchPhase::End, 12),
        viewport,
    );
    list.draw(
        &mut canvas,
        viewport,
        &ViewEnvironment {
            theme: &support::theme(),
            i18n: &support::i18n(),
        },
    );
}