danceinterpreter_rs/ui/widgets/
buttons.rs1use 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 .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 .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}