Skip to main content

danceinterpreter_rs/ui/widgets/
buttons.rs

1use crate::Message;
2use crate::ui::widgets::{material_symbol, material_symbol_colored, material_symbol_sized};
3use iced::alignment::Vertical;
4use iced::widget::{Button, button, row, text};
5use iced::{Alignment, Color, Length, Pixels, Renderer, Theme};
6use iced_aw::iced_aw_font;
7
8pub fn label_message_button<'a>(
9    label: impl text::IntoFragment<'a>,
10    message: Message,
11) -> Button<'a, Message> {
12    button(text(label).align_y(Vertical::Center))
13        .padding([4, 8])
14        .style(button::secondary)
15        .on_press(message)
16}
17
18pub fn label_message_button_fill<'a>(
19    label: impl text::IntoFragment<'a>,
20    message: Message,
21) -> Button<'a, Message> {
22    label_message_button(label, message).width(Length::Fill)
23}
24
25pub fn label_message_button_shrink<'a>(
26    label: impl text::IntoFragment<'a>,
27    message: Message,
28) -> Button<'a, Message> {
29    label_message_button(label, message).width(Length::Shrink)
30}
31
32fn label_message_button_opt(label: &'_ str, message: Option<Message>) -> Button<'_, Message> {
33    if let Some(message) = message {
34        label_message_button(label, message)
35    } else {
36        button(text(label).align_y(Vertical::Center))
37            .padding([4, 8])
38            .style(button::primary)
39    }
40}
41
42pub fn label_message_button_fill_opt(
43    label: &'_ str,
44    message: Option<Message>,
45) -> Button<'_, Message> {
46    label_message_button_opt(label, message).width(Length::Fill)
47}
48
49pub fn material_symbol_message_button_colored(
50    icon_id: &'_ str,
51    filled: bool,
52    message: Message,
53    color: impl Into<Color>,
54) -> Button<'_, Message> {
55    button(material_symbol_colored(icon_id, filled, color))
56        //.padding([4, 8])
57        .style(button::secondary)
58        .on_press(message)
59        .width(Length::Shrink)
60}
61
62pub fn material_symbol_message_button(
63    icon_id: &'_ str,
64    filled: bool,
65    message: Message,
66) -> Button<'_, Message> {
67    button(material_symbol(icon_id, filled))
68        //.padding([4, 8])
69        .style(button::secondary)
70        .on_press(message)
71        .width(Length::Shrink)
72}
73
74pub fn material_symbol_sized_message_button(
75    icon_id: &'_ str,
76    filled: bool,
77    size: impl Into<Pixels>,
78    message: Message,
79) -> Button<'_, Message> {
80    button(material_symbol_sized(icon_id, filled, size))
81        .style(button::secondary)
82        .on_press(message)
83        .width(Length::Shrink)
84}
85
86#[allow(dead_code)]
87pub fn submenu_button(label: &'_ str) -> Button<'_, Message, Theme, Renderer> {
88    button(
89        row![
90            text(label).width(Length::Fill).align_y(Vertical::Center),
91            iced_aw_font::right_open()
92                .width(Length::Shrink)
93                .align_y(Vertical::Center),
94        ]
95        .align_y(Alignment::Center),
96    )
97    .padding([4, 8])
98    .style(button::text)
99    .on_press(Message::Noop)
100    .width(Length::Fill)
101}