Skip to main content

danceinterpreter_rs/ui/config_window/
statics_view.rs

1use crate::dataloading::dataprovider::ItemChange;
2use crate::dataloading::dataprovider::ItemSource;
3use crate::dataloading::staticinfo::StaticInfo;
4use crate::ui::config_window::ConfigWindow;
5use crate::ui::config_window::item_row::build_item_row_container_styled;
6use crate::ui::config_window::search_bar::data_matches_search_query;
7use crate::ui::widget::dynamic_text_input::DynamicTextInput;
8use crate::ui::widgets::buttons::{
9    material_symbol_message_button, material_symbol_message_button_colored,
10};
11use crate::ui::widgets::material_symbol;
12use crate::ui::with_tooltip;
13use crate::{DanceInterpreter, DialogMessage, Message, StaticsMessage};
14use iced::alignment::Vertical;
15use iced::widget::{
16    Column, Row, Scrollable, Space, button, column as col, container, row, scrollable, text,
17};
18use iced::{Alignment, Color, Element, Length};
19
20pub fn build<'a>(
21    config_window: &'a ConfigWindow,
22    dance_interpreter: &'a DanceInterpreter,
23) -> Column<'a, Message> {
24    let trow = container(
25        row![
26            text("Fav").width(Length::Fixed(42.0)),
27            text!("Name").width(Length::Fill),
28            Space::new().width(Length::Fill).height(Length::Shrink),
29            button(row![material_symbol("add", false), text("Add Static")].spacing(5))
30                .on_press(Message::Statics(StaticsMessage::AddBlank))
31                .padding([5, 10])
32                .style(button::primary),
33        ]
34        .align_y(Vertical::Bottom)
35        .spacing(5),
36    )
37    .padding([4, 6])
38    .width(Length::Fill);
39
40    let mut list_column = col!().spacing(5);
41
42    for (i, (name, static_info)) in dance_interpreter.data_provider.statics().iter().enumerate() {
43        let is_match = data_matches_search_query(&config_window.search_query, static_info.into());
44        let static_row = build_static_row(
45            static_info,
46            name.clone(),
47            config_window.theme.extended_palette().primary.weak.color,
48            config_window.color_picker_open.as_ref() == Some(name),
49        );
50        let accent_color = static_info.color;
51        let row_container = build_item_row_container_styled(static_row, is_match, i, accent_color);
52        list_column = list_column.push(row_container);
53    }
54
55    let statics_scrollable: Scrollable<'_, Message> = scrollable(list_column)
56        .width(Length::Fill)
57        .height(Length::Fill)
58        .spacing(5);
59
60    col!(trow, statics_scrollable).spacing(5)
61}
62
63pub fn build_static_row<'a>(
64    static_info: &StaticInfo,
65    name: String,
66    color: impl Into<Color>,
67    color_picker_open: bool,
68) -> Row<'a, Message> {
69    let swatch_color = static_info.color.unwrap_or(Color::TRANSPARENT);
70    let mut name_clone = name.clone();
71    let mut name_clone1 = name.clone();
72
73    let color_swatch = crate::ui::widgets::color_swatch::color_swatch(
74        swatch_color,
75        Message::Statics(StaticsMessage::ToggleColorPicker(name.clone())),
76    );
77
78    let color_element: Element<'a, Message> = if color_picker_open {
79        iced_aw::ColorPicker::new(
80            true,
81            swatch_color,
82            color_swatch,
83            Message::Statics(StaticsMessage::ToggleColorPicker(name.clone())),
84            move |c| Message::Statics(StaticsMessage::UpdateColor(name_clone.clone(), c)),
85        )
86        .on_color_change(move |c| {
87            Message::Statics(StaticsMessage::PreviewColor(name_clone1.clone(), c))
88        })
89        .into()
90    } else {
91        color_swatch
92    };
93
94    name_clone = name.clone();
95    name_clone1 = name.clone();
96
97    row![
98        if static_info.is_favorite {
99            material_symbol_message_button_colored(
100                "star",
101                static_info.is_favorite,
102                Message::Statics(StaticsMessage::ToggleFavorite(name.clone())),
103                color,
104            )
105        } else {
106            material_symbol_message_button(
107                "star",
108                static_info.is_favorite,
109                Message::Statics(StaticsMessage::ToggleFavorite(name.clone())),
110            )
111        },
112        Space::new().width(5),
113        color_element,
114        DynamicTextInput::<'_, Message>::new("Static Name", &static_info.name)
115            .width(Length::Fill)
116            .on_change(move |v| Message::Statics(StaticsMessage::UpdateName(name_clone.clone(), v)))
117            .on_submit(Message::Statics(StaticsMessage::SubmitName(
118                name_clone1.clone()
119            ))),
120        row![
121            Space::new().width(Length::Fill).height(Length::Shrink),
122            with_tooltip(
123                material_symbol_message_button(
124                    "smart_display",
125                    false,
126                    Message::ItemChanged(ItemChange::StaticAbsolute(name.clone()))
127                ),
128                "Show now"
129            ),
130            with_tooltip(
131                material_symbol_message_button(
132                    "delete",
133                    false,
134                    Message::Dialog(DialogMessage::RequestDelete(ItemSource::Static(
135                        name.clone()
136                    )))
137                ),
138                "Delete static"
139            ),
140        ]
141        .spacing(5)
142        .align_y(Alignment::Center)
143        .width(Length::Fill),
144    ]
145    .align_y(Alignment::Center)
146    .spacing(10)
147}