scroll_and_list/
scroll_and_list.rs1#[path = "support/mod.rs"]
2mod support;
3
4use embedded_graphics::{
5 Drawable,
6 draw_target::DrawTarget,
7 pixelcolor::Rgb565,
8 prelude::{Point, Primitive, Size},
9 primitives::{PrimitiveStyle, Rectangle},
10};
11use faststep::{
12 ListDataSource, ListDelegate, ListRow, ListSelection, ListView, ScrollView, TouchEvent,
13 TouchPhase, ViewEnvironment,
14};
15
16struct DemoDataSource;
17
18impl ListDataSource for DemoDataSource {
19 type ItemId = u8;
20
21 fn item_count(&self) -> usize {
22 4
23 }
24
25 fn item_id(&self, index: usize) -> Self::ItemId {
26 index as u8
27 }
28
29 fn item_height(&self, index: usize) -> u32 {
30 if index == 1 { 64 } else { 48 }
31 }
32}
33
34struct DemoDelegate;
35
36impl ListDelegate<'static, u8> for DemoDelegate {
37 type Message = u8;
38
39 fn draw_row<D>(&self, display: &mut D, row: ListRow<u8>, _env: &ViewEnvironment<'_, 'static>)
40 where
41 D: DrawTarget<Color = Rgb565>,
42 {
43 let fill = if row.state.highlighted {
44 Rgb565::new(24, 52, 28)
45 } else {
46 Rgb565::new(29, 59, 29)
47 };
48 row.item
49 .frame
50 .into_styled(PrimitiveStyle::with_fill(fill))
51 .draw(display)
52 .ok();
53 }
54
55 fn did_select_item(&mut self, selection: ListSelection<u8>) -> Option<Self::Message> {
56 Some(selection.id)
57 }
58}
59
60fn main() {
61 let mut canvas = support::NullCanvas::new(Size::new(320, 240));
62 let viewport = Rectangle::new(Point::new(16, 16), Size::new(180, 160));
63
64 let mut scroll = ScrollView::new();
65 scroll.begin_drag(TouchEvent::new(Point::new(8, 8), TouchPhase::Start, 1));
66 let _ = scroll.drag(
67 TouchEvent::new(Point::new(8, 32), TouchPhase::Move, 2),
68 420,
69 160,
70 );
71 let _ = scroll.end_drag(
72 TouchEvent::new(Point::new(8, 32), TouchPhase::End, 3),
73 420,
74 160,
75 );
76 let _ = scroll.tick(16, 420, 160);
77 let _ = scroll.scroll_bar(viewport, 420);
78
79 let mut list = ListView::new(DemoDataSource, DemoDelegate);
80 let _ = list.handle_touch(
81 TouchEvent::new(Point::new(24, 24), TouchPhase::Start, 10),
82 viewport,
83 );
84 let _ = list.handle_touch(
85 TouchEvent::new(Point::new(24, 60), TouchPhase::Move, 11),
86 viewport,
87 );
88 let _ = list.handle_touch(
89 TouchEvent::new(Point::new(24, 60), TouchPhase::End, 12),
90 viewport,
91 );
92 list.draw(
93 &mut canvas,
94 viewport,
95 &ViewEnvironment {
96 theme: &support::theme(),
97 i18n: &support::i18n(),
98 },
99 );
100}