Skip to main content

demo/
demo.rs

1// SPDX-License-Identifier: MIT
2//! Minimal rlvgl-ui style demo.
3//!
4//! Builds a style using tokens from a Material-like theme.
5//!
6//! This demo intentionally exercises the legacy `rlvgl_ui` style surface
7//! (`StyleBuilder`/`Style`), deprecated in LPAR-07 in favour of the
8//! `core::style_cascade` cascade but kept compiling for compatibility.
9#![allow(deprecated)]
10
11#[cfg(feature = "view")]
12use rlvgl_ui::view;
13use rlvgl_ui::{
14    Alert, Badge, Bar, BarMode, Button, ButtonMatrix, Calendar, Checkbox, ColorScheme,
15    ComponentSize, Divider, DividerOrientation, Drawer, Heading, Icon, IconButton, Input, Led,
16    List, Modal, OnClick, Progress, Radio, RectProps, Select, Spacer, Spinner, StyleBuilder,
17    StyleProps, Switch, TabBarPos, Table, Tabs, Tag, Text, Textarea, Theme, ThemedPartsProps,
18    Toast, VStack, Variant, rect,
19};
20
21fn main() {
22    let theme = Theme::material_light();
23    let style = StyleBuilder::new()
24        .bg(theme.tokens.colors.primary)
25        .radius(theme.tokens.radii.md)
26        .build();
27
28    let new_components = (
29        Progress::new(theme.control_rect(0, 0, 90, ComponentSize::Sm), 0, 100)
30            .with_value(64)
31            .themed(
32                &theme,
33                ColorScheme::Primary,
34                Variant::Subtle,
35                ComponentSize::Md,
36            )
37            .opacity(220),
38        Select::new(theme.control_rect(0, 10, 90, ComponentSize::Sm).height(64))
39            .with_options(&["One", "Two", "Three"])
40            .with_selected_index(1)
41            .themed(
42                &theme,
43                ColorScheme::Info,
44                Variant::Outline,
45                ComponentSize::Sm,
46            )
47            .on_change(|idx, text| println!("select: {idx} {text}")),
48        Tabs::new(rect(0, 80, 120, 80), TabBarPos::Top)
49            .tab("Main")
50            .tab("Settings")
51            .themed(
52                &theme,
53                ColorScheme::Primary,
54                Variant::Solid,
55                ComponentSize::Md,
56            ),
57        ButtonMatrix::new(
58            theme
59                .control_rect(0, 170, 120, ComponentSize::Md)
60                .height(48),
61        )
62        .with_map(&["A", "B", "\n", "C", "D"])
63        .themed(
64            &theme,
65            ColorScheme::Neutral,
66            Variant::Outline,
67            ComponentSize::Md,
68        )
69        .on_activate(|id, text| println!("button matrix: {:?} {text}", id)),
70        Bar::new(theme.control_rect(0, 224, 90, ComponentSize::Xs), 0, 100)
71            .with_value(32)
72            .with_mode(BarMode::Normal)
73            .themed(
74                &theme,
75                ColorScheme::Success,
76                Variant::Subtle,
77                ComponentSize::Sm,
78            ),
79        Led::new(
80            theme
81                .origin_control_rect(12, ComponentSize::Xs)
82                .at(0, 240)
83                .size(12, 12),
84        )
85        .themed(
86            &theme,
87            ColorScheme::Success,
88            Variant::Solid,
89            ComponentSize::Xs,
90        )
91        .brightness(180),
92        Spinner::new(theme.origin_control_rect(24, ComponentSize::Md).at(20, 236))
93            .animation(30, 100)
94            .themed(
95                &theme,
96                ColorScheme::Primary,
97                Variant::Ghost,
98                ComponentSize::Md,
99            ),
100        List::new(
101            theme
102                .control_rect(0, 270, 100, ComponentSize::Sm)
103                .height(48),
104        )
105        .with_items(&["Alpha", "Beta", "Gamma"])
106        .themed(
107            &theme,
108            ColorScheme::Neutral,
109            Variant::Subtle,
110            ComponentSize::Sm,
111        ),
112        Divider::new(rect(0, 328, 100, 8), DividerOrientation::Horizontal).themed(
113            &theme,
114            ColorScheme::Neutral,
115            Variant::Outline,
116            ComponentSize::Sm,
117        ),
118        Spacer::height(theme.component_size(ComponentSize::Md).gap),
119        Table::new(rect(0, 342, 120, 48)).themed_parts(
120            &theme,
121            ColorScheme::Info,
122            Variant::Subtle,
123            ComponentSize::Sm,
124        ),
125        Calendar::new(rect(0, 396, 140, 96)).themed_parts(
126            &theme,
127            ColorScheme::Primary,
128            Variant::Outline,
129            ComponentSize::Sm,
130        ),
131    );
132
133    let layout = {
134        #[cfg(feature = "view")]
135        {
136            view! { VStack::new(90)
137            .child(20, |rect| Heading::new("Demo", rect))
138            .child(20, |rect| Text::new("Hello", rect))
139            .child(30, |rect| {
140                Button::new("Tap", rect)
141                    .icon("save")
142                    .on_click(|_| println!("clicked"))
143            })
144            .child(30, |rect| {
145                IconButton::new("edit", rect)
146                    .on_click(|_| println!("edit"))
147            })
148            .child(20, |rect| {
149                Checkbox::new("Accept", rect).on_change(|v| println!("checkbox: {v}"))
150            })
151            .child(20, |rect| {
152                Switch::new(rect).on_change(|v| println!("switch: {v}"))
153            })
154            .child(20, |rect| {
155                Radio::new("Option", rect).on_change(|v| println!("radio: {v}"))
156            })
157            .child(20, |rect| { Badge::new("NEW", rect) })
158            .child(20, |rect| {
159                Tag::new("rust", rect).on_remove(|| println!("tag removed"))
160            })
161            .child(30, |rect| { Alert::new("Saved", rect) })
162            .child(20, |rect| {
163                Input::new("Name", rect).on_change(|v| println!("input: {v}"))
164            })
165            .child(40, |rect| {
166                Textarea::new("Multiline", rect).on_change(|v| println!("textarea: {v}"))
167            })
168            .child(30, |rect| Modal::new("Modal", rect))
169            .child(30, |rect| Drawer::new("Menu", rect))
170            .child(30, |rect| Toast::new("Saved", rect)) }
171        }
172        #[cfg(not(feature = "view"))]
173        {
174            VStack::new(90)
175                .child(20, |rect| Heading::new("Demo", rect))
176                .child(20, |rect| Text::new("Hello", rect))
177                .child(30, |rect| {
178                    Button::new("Tap", rect)
179                        .icon("save")
180                        .on_click(|_| println!("clicked"))
181                })
182                .child(30, |rect| {
183                    IconButton::new("edit", rect).on_click(|_| println!("edit"))
184                })
185                .child(20, |rect| {
186                    Checkbox::new("Accept", rect).on_change(|v| println!("checkbox: {v}"))
187                })
188                .child(20, |rect| {
189                    Switch::new(rect).on_change(|v| println!("switch: {v}"))
190                })
191                .child(20, |rect| {
192                    Radio::new("Option", rect).on_change(|v| println!("radio: {v}"))
193                })
194                .child(20, |rect| Badge::new("NEW", rect))
195                .child(20, |rect| {
196                    Tag::new("rust", rect).on_remove(|| println!("tag removed"))
197                })
198                .child(30, |rect| Alert::new("Saved", rect))
199                .child(20, |rect| {
200                    Input::new("Name", rect).on_change(|v| println!("input: {v}"))
201                })
202                .child(40, |rect| {
203                    Textarea::new("Multiline", rect).on_change(|v| println!("textarea: {v}"))
204                })
205                .child(30, |rect| Modal::new("Modal", rect))
206                .child(30, |rect| Drawer::new("Menu", rect))
207                .child(30, |rect| Toast::new("Saved", rect))
208        }
209    };
210
211    let _ = (style, new_components, layout);
212}