#[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(),
},
);
}