1use crate::overlay;
3use crate::widget;
4use crate::{Element, Length, Pixels};
5
6use std::borrow::Cow;
7use std::ops::RangeInclusive;
8
9#[macro_export]
13macro_rules! column {
14 () => (
15 $crate::widget::Column::new()
16 );
17 ($($x:expr),+ $(,)?) => (
18 $crate::widget::Column::with_children(vec![$($crate::Element::from($x)),+])
19 );
20}
21
22#[macro_export]
26macro_rules! row {
27 () => (
28 $crate::widget::Row::new()
29 );
30 ($($x:expr),+ $(,)?) => (
31 $crate::widget::Row::with_children(vec![$($crate::Element::from($x)),+])
32 );
33}
34
35pub fn container<'a, Message, Renderer>(
39 content: impl Into<Element<'a, Message, Renderer>>,
40) -> widget::Container<'a, Message, Renderer>
41where
42 Renderer: crate::Renderer,
43 Renderer::Theme: widget::container::StyleSheet,
44{
45 widget::Container::new(content)
46}
47
48pub fn column<Message, Renderer>(
52 children: Vec<Element<'_, Message, Renderer>>,
53) -> widget::Column<'_, Message, Renderer> {
54 widget::Column::with_children(children)
55}
56
57pub fn row<Message, Renderer>(
61 children: Vec<Element<'_, Message, Renderer>>,
62) -> widget::Row<'_, Message, Renderer> {
63 widget::Row::with_children(children)
64}
65
66pub fn scrollable<'a, Message, Renderer>(
70 content: impl Into<Element<'a, Message, Renderer>>,
71) -> widget::Scrollable<'a, Message, Renderer>
72where
73 Renderer: crate::Renderer,
74 Renderer::Theme: widget::scrollable::StyleSheet,
75{
76 widget::Scrollable::new(content)
77}
78
79pub fn button<'a, Message, Renderer>(
83 content: impl Into<Element<'a, Message, Renderer>>,
84) -> widget::Button<'a, Message, Renderer>
85where
86 Renderer: crate::Renderer,
87 Renderer::Theme: widget::button::StyleSheet,
88 <Renderer::Theme as widget::button::StyleSheet>::Style: Default,
89{
90 widget::Button::new(content)
91}
92
93pub fn tooltip<'a, Message, Renderer>(
98 content: impl Into<Element<'a, Message, Renderer>>,
99 tooltip: impl ToString,
100 position: widget::tooltip::Position,
101) -> widget::Tooltip<'a, Message, Renderer>
102where
103 Renderer: crate::text::Renderer,
104 Renderer::Theme: widget::container::StyleSheet + widget::text::StyleSheet,
105{
106 widget::Tooltip::new(content, tooltip.to_string(), position)
107}
108
109pub fn text<'a, Renderer>(text: impl ToString) -> widget::Text<'a, Renderer>
113where
114 Renderer: crate::text::Renderer,
115 Renderer::Theme: widget::text::StyleSheet,
116{
117 widget::Text::new(text.to_string())
118}
119
120pub fn checkbox<'a, Message, Renderer>(
124 label: impl Into<String>,
125 is_checked: bool,
126 f: impl Fn(bool) -> Message + 'a,
127) -> widget::Checkbox<'a, Message, Renderer>
128where
129 Renderer: crate::text::Renderer,
130 Renderer::Theme: widget::checkbox::StyleSheet + widget::text::StyleSheet,
131{
132 widget::Checkbox::new(label, is_checked, f)
133}
134
135pub fn radio<Message, Renderer, V>(
139 label: impl Into<String>,
140 value: V,
141 selected: Option<V>,
142 on_click: impl FnOnce(V) -> Message,
143) -> widget::Radio<Message, Renderer>
144where
145 Message: Clone,
146 Renderer: crate::text::Renderer,
147 Renderer::Theme: widget::radio::StyleSheet,
148 V: Copy + Eq,
149{
150 widget::Radio::new(label, value, selected, on_click)
151}
152
153pub fn toggler<'a, Message, Renderer>(
157 label: impl Into<Option<String>>,
158 is_checked: bool,
159 f: impl Fn(bool) -> Message + 'a,
160) -> widget::Toggler<'a, Message, Renderer>
161where
162 Renderer: crate::text::Renderer,
163 Renderer::Theme: widget::toggler::StyleSheet,
164{
165 widget::Toggler::new(label, is_checked, f)
166}
167
168pub fn text_input<'a, Message, Renderer>(
172 placeholder: &str,
173 value: &str,
174) -> widget::TextInput<'a, Message, Renderer>
175where
176 Message: Clone,
177 Renderer: crate::text::Renderer,
178 Renderer::Theme: widget::text_input::StyleSheet,
179{
180 widget::TextInput::new(placeholder, value)
181}
182
183pub fn slider<'a, T, Message, Renderer>(
187 range: std::ops::RangeInclusive<T>,
188 value: T,
189 on_change: impl Fn(T) -> Message + 'a,
190) -> widget::Slider<'a, T, Message, Renderer>
191where
192 T: Copy + From<u8> + std::cmp::PartialOrd,
193 Message: Clone,
194 Renderer: crate::Renderer,
195 Renderer::Theme: widget::slider::StyleSheet,
196{
197 widget::Slider::new(range, value, on_change)
198}
199
200pub fn vertical_slider<'a, T, Message, Renderer>(
204 range: std::ops::RangeInclusive<T>,
205 value: T,
206 on_change: impl Fn(T) -> Message + 'a,
207) -> widget::VerticalSlider<'a, T, Message, Renderer>
208where
209 T: Copy + From<u8> + std::cmp::PartialOrd,
210 Message: Clone,
211 Renderer: crate::Renderer,
212 Renderer::Theme: widget::slider::StyleSheet,
213{
214 widget::VerticalSlider::new(range, value, on_change)
215}
216
217pub fn pick_list<'a, Message, Renderer, T>(
221 options: impl Into<Cow<'a, [T]>>,
222 selected: Option<T>,
223 on_selected: impl Fn(T) -> Message + 'a,
224) -> widget::PickList<'a, T, Message, Renderer>
225where
226 T: ToString + Eq + 'static,
227 [T]: ToOwned<Owned = Vec<T>>,
228 Renderer: crate::text::Renderer,
229 Renderer::Theme: widget::pick_list::StyleSheet
230 + widget::scrollable::StyleSheet
231 + overlay::menu::StyleSheet
232 + widget::container::StyleSheet,
233 <Renderer::Theme as overlay::menu::StyleSheet>::Style:
234 From<<Renderer::Theme as widget::pick_list::StyleSheet>::Style>,
235{
236 widget::PickList::new(options, selected, on_selected)
237}
238
239pub fn image<Handle>(handle: impl Into<Handle>) -> widget::Image<Handle> {
243 widget::Image::new(handle.into())
244}
245
246pub fn horizontal_space(width: impl Into<Length>) -> widget::Space {
250 widget::Space::with_width(width)
251}
252
253pub fn vertical_space(height: impl Into<Length>) -> widget::Space {
257 widget::Space::with_height(height)
258}
259
260pub fn horizontal_rule<Renderer>(
264 height: impl Into<Pixels>,
265) -> widget::Rule<Renderer>
266where
267 Renderer: crate::Renderer,
268 Renderer::Theme: widget::rule::StyleSheet,
269{
270 widget::Rule::horizontal(height)
271}
272
273pub fn vertical_rule<Renderer>(
277 width: impl Into<Pixels>,
278) -> widget::Rule<Renderer>
279where
280 Renderer: crate::Renderer,
281 Renderer::Theme: widget::rule::StyleSheet,
282{
283 widget::Rule::vertical(width)
284}
285
286pub fn progress_bar<Renderer>(
294 range: RangeInclusive<f32>,
295 value: f32,
296) -> widget::ProgressBar<Renderer>
297where
298 Renderer: crate::Renderer,
299 Renderer::Theme: widget::progress_bar::StyleSheet,
300{
301 widget::ProgressBar::new(range, value)
302}
303
304pub fn svg<Renderer>(
309 handle: impl Into<widget::svg::Handle>,
310) -> widget::Svg<Renderer>
311where
312 Renderer: crate::svg::Renderer,
313 Renderer::Theme: widget::svg::StyleSheet,
314{
315 widget::Svg::new(handle)
316}
317
318pub fn mouse_area<'a, Message, Renderer>(
320 widget: impl Into<Element<'a, Message, Renderer>>,
321) -> widget::MouseArea<'a, Message, Renderer>
322where
323 Renderer: crate::Renderer,
324{
325 widget::MouseArea::new(widget)
326}