pub struct Textarea { /* private fields */ }Expand description
Multi-line editable textarea (WID-00 §5–§8).
Identical edit model to Input except Enter inserts a newline
(an ordinary edit) instead of submitting, and rendering draws each
'\n'-split line separately.
Implementations§
Source§impl Textarea
impl Textarea
Sourcepub fn new(text: &str, bounds: Rect) -> Self
pub fn new(text: &str, bounds: Rect) -> Self
Create a new textarea with the provided text and bounds.
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 textarea (FONT-00 §5); resolves to
FONT_6X10 when unset.
Sourcepub fn on_change<F: FnMut(&str) + 'static>(self, handler: F) -> Self
pub fn on_change<F: FnMut(&str) + 'static>(self, handler: F) -> Self
Register a change handler invoked after every successful edit
and on Self::set_text.
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 active(self, active: bool) -> Self
pub fn active(self, active: bool) -> Self
Set whether this textarea consumes key events and return the widget.
Sourcepub fn with_accept<F: Fn(char) -> bool + 'static>(self, accept: F) -> Self
pub fn with_accept<F: Fn(char) -> bool + 'static>(self, accept: F) -> Self
Restrict insertions to characters accepted by accept
(newlines from Enter are exempt; WID-00 §8.2).
Sourcepub fn with_max_len(self, max: usize) -> Self
pub fn with_max_len(self, max: usize) -> Self
Cap the buffer at max characters (newlines count).
Sourcepub fn with_char_metrics(self, char_width: i32, line_height: i32) -> Self
pub fn with_char_metrics(self, char_width: i32, line_height: i32) -> Self
Override the nominal char metrics used for caret geometry and line pitch (WID-00 §6.3).
Sourcepub fn set_active(&mut self, active: bool)
pub fn set_active(&mut self, active: bool)
Toggle key consumption (WID-00 §7.1).
Trait Implementations§
Source§impl StyleProps for Textarea
impl StyleProps for Textarea
Source§fn style_mut(&mut self) -> &mut Style
fn style_mut(&mut self) -> &mut Style
Source§fn with_style(self, style: Style) -> Self
fn with_style(self, style: Style) -> Self
Source§fn border_color(self, color: Color) -> Self
fn border_color(self, color: Color) -> Self
Source§fn border_width(self, width: u8) -> Self
fn border_width(self, width: u8) -> Self
Source§impl Widget for Textarea
impl Widget for Textarea
Source§fn widget_font_mut(&mut self) -> Option<&mut WidgetFont>
fn widget_font_mut(&mut self) -> Option<&mut WidgetFont>
Source§fn handle_event(&mut self, event: &Event) -> bool
fn handle_event(&mut self, event: &Event) -> bool
true if it was consumed. Read moreSource§fn clear_region(&mut self) -> Option<Rect>
fn clear_region(&mut self) -> Option<Rect>
None. Read more