Skip to main content

scroll_and_list/
scroll_and_list.rs

1#[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}