danceinterpreter_rs/ui/widgets/
mod.rs1use crate::Message;
2use crate::ui::widget::dynamic_text_input::DynamicTextInput;
3use iced::advanced::text::Shaping;
4use iced::widget::{Column, Text, checkbox, column as col, radio, text, toggler};
5use iced::{Color, Font, Length, Pixels, Renderer, Theme};
6
7pub mod buttons;
8pub mod color_swatch;
9pub fn labeled_message_checkbox(
10 label: &'_ str,
11 checked: bool,
12 message: fn(bool) -> Message,
13) -> checkbox::Checkbox<'_, Message> {
14 checkbox(checked)
15 .label(label)
16 .on_toggle(message)
17 .width(Length::Fill)
18 }
20
21pub fn labeled_message_toggler(
22 label: &'_ str,
23 checked: bool,
24 message: fn(bool) -> Message,
25) -> toggler::Toggler<'_, Message> {
26 toggler(checked)
27 .label(label)
28 .on_toggle(message)
29 .width(Length::Fill)
30}
31
32#[allow(dead_code)]
33pub fn labeled_message_radio<T: Copy + Eq>(
34 label: &'_ str,
35 value: T,
36 selection: T,
37 message: fn(T) -> Message,
38) -> radio::Radio<'_, Message> {
39 radio(label, value, Some(selection), message).width(Length::Fill)
40 }
42
43#[allow(dead_code)]
44pub fn labeled_message_checkbox_opt(
45 label: &'_ str,
46 checked: bool,
47 message: Option<fn(bool) -> Message>,
48) -> checkbox::Checkbox<'_, Message> {
49 if let Some(message) = message {
50 labeled_message_checkbox(label, checked, message)
51 } else {
52 checkbox(checked).label(label).width(Length::Fill)
53 }
55}
56
57#[allow(dead_code)]
58pub fn labeled_dynamic_text_input<'a>(
59 label: &'a str,
60 placeholder: &'a str,
61 value: &'a str,
62 message: fn(String) -> Message,
63 submit_message: Option<Message>,
64) -> Column<'a, Message> {
65 let mut input = DynamicTextInput::<Message>::new(placeholder, value)
66 .width(Length::Fill)
67 .on_change(message);
68
69 if let Some(submit_message) = submit_message {
70 input = input.on_submit(submit_message);
71 }
72
73 col!(text(label).width(Length::Fill), input,).width(Length::Fill)
74}
75
76pub fn material_symbol_colored(
77 id: &'_ str,
78 filled: bool,
79 color: impl Into<Color>,
80) -> Text<'_, Theme, Renderer> {
81 material_symbol(id, filled).color(color)
82}
83
84pub fn material_symbol_sized(
85 id: &'_ str,
86 filled: bool,
87 size: impl Into<Pixels>,
88) -> Text<'_, Theme, Renderer> {
89 material_symbol(id, filled).size(size)
90}
91
92pub fn material_symbol(id: &'_ str, filled: bool) -> Text<'_, Theme, Renderer> {
93 let font_name = if filled {
94 "Material Icons"
95 } else {
96 "Material Symbols Outlined"
97 };
98
99 Text::new(id)
100 .font(Font::with_name(font_name))
101 .shaping(Shaping::Advanced)
102 .width(Length::Shrink)
103}