faststep 0.1.0

UIKit-inspired embedded UI framework built on embedded-graphics
Documentation
use embedded_graphics::{
    geometry::Size,
    image::{ImageRaw, ImageRawBE},
    mock_display::MockDisplay,
    pixelcolor::Rgb565,
    prelude::{Point, RgbColor},
    primitives::Rectangle,
};

use faststep::{
    EdgeInsets, ImageAlignment, ImageView, ImageViewStyle, RichTextView, ScrollView, TextAlignment,
    TextRunStyle, TextSpan, TextVerticalAlignment, TextView, TextViewStyle, TextWrap, TouchEvent,
    TouchPhase,
};

#[test]
fn scroll_indicator_stays_hidden_until_scrolling_starts() {
    let viewport = Rectangle::new(Point::zero(), Size::new(120, 80));
    let mut scroll = ScrollView::new();

    scroll.begin_drag(TouchEvent::new(Point::new(12, 12), TouchPhase::Start, 1));
    assert!(scroll.scroll_bar(viewport, 320).is_none());
    assert!(!scroll.tick(16, 320, viewport.size.height));
    assert!(scroll.scroll_bar(viewport, 320).is_none());

    assert!(scroll.drag(
        TouchEvent::new(Point::new(12, 28), TouchPhase::Move, 2),
        320,
        viewport.size.height,
    ));
    assert!(scroll.scroll_bar(viewport, 320).is_some());
}

#[test]
fn image_view_draws_centered_image() {
    let image_data = [
        0xF8, 0x00, 0x07, 0xE0, //
        0x07, 0xE0, 0xF8, 0x00, //
    ];
    let image: ImageRawBE<Rgb565> = ImageRaw::new(&image_data, 2);
    let mut display: MockDisplay<Rgb565> = MockDisplay::new();

    ImageView::new(Rectangle::new(Point::new(4, 4), Size::new(24, 24)), &image)
        .with_style(
            ImageViewStyle::new()
                .with_alignment(ImageAlignment::Center)
                .with_insets(EdgeInsets::all(2)),
        )
        .draw(&mut display);

    assert_ne!(display.affected_area().size, Size::zero());
}

#[test]
fn text_views_draw_single_and_multiline_content() {
    let mut single: MockDisplay<Rgb565> = MockDisplay::new();
    TextView::new(
        Rectangle::new(Point::zero(), Size::new(120, 28)),
        "Status OK",
        TextRunStyle::body(Rgb565::BLACK),
    )
    .with_view_style(
        TextViewStyle::new()
            .with_alignment(TextAlignment::Center)
            .with_vertical_alignment(TextVerticalAlignment::Center),
    )
    .draw(&mut single);
    assert_ne!(single.affected_area().size, Size::zero());

    let spans = [
        TextSpan::new("Device ", TextRunStyle::body(Rgb565::BLACK)),
        TextSpan::new("Online", TextRunStyle::body_strong(Rgb565::GREEN)),
        TextSpan::new("\nReady for use", TextRunStyle::caption(Rgb565::BLUE)),
    ];
    let mut rich: MockDisplay<Rgb565> = MockDisplay::new();
    RichTextView::new(Rectangle::new(Point::new(0, 0), Size::new(140, 64)), &spans)
        .with_view_style(
            TextViewStyle::new()
                .with_wrap(TextWrap::Multiline)
                .with_insets(EdgeInsets::all(4)),
        )
        .draw(&mut rich);
    assert_ne!(rich.affected_area().size, Size::zero());
}