Skip to main content

danceinterpreter_rs/ui/widgets/
mod.rs

1use 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    //.style(checkbox::secondary)
19}
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    //.style(checkbox::secondary)
41}
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        //.style(checkbox::secondary)
54    }
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}