danceinterpreter_rs/ui/config_window/
statics_view.rs1use 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}