pub struct Table {
pub style: Style,
pub cell_bg_color: Color,
pub selected_color: Color,
pub text_color: Color,
pub grid_color: Color,
/* private fields */
}Expand description
LVGL-parity table widget.
Stores cells as a flat row-major Vec; column widths as a Vec<i32>.
Row heights are computed dynamically from the cell content using the
LPAR-08 shared wrap_greedy_ltr measurement.
Fields§
§style: StyleBackground and outer border style.
cell_bg_color: ColorColor for cell background and grid lines.
selected_color: ColorColor for the selected cell background.
text_color: ColorText color.
grid_color: ColorGrid line color.
Implementations§
Source§impl Table
impl Table
Sourcepub fn new(bounds: Rect) -> Table
pub fn new(bounds: Rect) -> Table
Create an empty table at bounds with 0 rows and 0 columns.
Examples found in repository?
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}Sourcepub fn set_font(&mut self, font: &'static dyn FontMetrics)
pub fn set_font(&mut self, font: &'static dyn FontMetrics)
Assign the font used to render this widget (FONT-00 §5); resolves to
FONT_6X10 when unset.
Sourcepub fn column_count(&self) -> usize
pub fn column_count(&self) -> usize
Return the number of columns.
Sourcepub fn set_row_count(&mut self, rows: usize)
pub fn set_row_count(&mut self, rows: usize)
Set the number of rows, extending or truncating the cell vector.
Sourcepub fn set_column_count(&mut self, cols: usize)
pub fn set_column_count(&mut self, cols: usize)
Set the number of columns, extending or truncating; preserves existing cell content where indices overlap.
Sourcepub fn set_cell_value(&mut self, row: usize, col: usize, text: &str)
pub fn set_cell_value(&mut self, row: usize, col: usize, text: &str)
Set the text value of a cell.
Out-of-bounds indices are silently ignored (matching LVGL behavior).
Sourcepub fn cell_value(&self, row: usize, col: usize) -> Option<&str>
pub fn cell_value(&self, row: usize, col: usize) -> Option<&str>
Return the text value of a cell, or None if empty or out of bounds.
Sourcepub fn set_cell_ctrl(&mut self, row: usize, col: usize, ctrl: CellCtrl)
pub fn set_cell_ctrl(&mut self, row: usize, col: usize, ctrl: CellCtrl)
Set control flags for a cell.
Sourcepub fn set_cell_align(&mut self, row: usize, col: usize, align: CellAlign)
pub fn set_cell_align(&mut self, row: usize, col: usize, align: CellAlign)
Set horizontal alignment for a cell.
Sourcepub fn set_column_width(&mut self, col: usize, width: i32)
pub fn set_column_width(&mut self, col: usize, width: i32)
Set the pixel width of column col.
A width of 0 means “auto” — the column participates in the remaining
width distribution.
Sourcepub fn column_width(&self, col: usize) -> i32
pub fn column_width(&self, col: usize) -> i32
Return the stored column width (0 = auto).
Sourcepub fn set_selected_cell(&mut self, row: usize, col: usize)
pub fn set_selected_cell(&mut self, row: usize, col: usize)
Set the selected cell. Out-of-bounds is silently ignored.
Sourcepub fn selected_cell(&self) -> Option<(usize, usize)>
pub fn selected_cell(&self) -> Option<(usize, usize)>
Return the selected cell (row, col), or None if nothing is selected.
Move selection to the next cell (right then down; wraps at the last cell to the first).
Wire to ObjectEvent::Key(Key::ArrowRight) or Key::Tab in a node handler.
Move selection to the previous cell (left then up; wraps at the first cell to the last).
Wire to ObjectEvent::Key(Key::ArrowLeft) or Key::BackTab.
Move selection one row up.
Wire to ObjectEvent::Key(Key::ArrowUp) in a node handler.
Move selection one row down.
Wire to ObjectEvent::Key(Key::ArrowDown) in a node handler.
Sourcepub fn activate_selected(&mut self)
pub fn activate_selected(&mut self)
Activate the selected cell and record it in the poll slot.
Wire to ObjectEvent::Key(Key::Enter) in a node handler.
Sourcepub fn last_activated(&mut self) -> Option<(usize, usize)>
pub fn last_activated(&mut self) -> Option<(usize, usize)>
Drain the activation poll slot.