danceinterpreter_rs/ui/config_window/
top_bar.rs1use crate::ui::config_window::ConfigWindow;
2use crate::ui::config_window::sidebar::SidebarMessage;
3use crate::ui::widgets::buttons::{
4 label_message_button_fill, label_message_button_fill_opt, label_message_button_shrink,
5 material_symbol_sized_message_button,
6};
7use crate::ui::widgets::labeled_message_checkbox;
8use crate::ui::with_tooltip;
9use crate::{
10 DanceInterpreter, DialogMessage, Message, SearchMessage, SongWindowMessage, StaticsMessage,
11};
12use iced::alignment::Vertical;
13use iced::border::Radius;
14use iced::widget::space::horizontal;
15use iced::widget::{Space, Stack, pick_list, row, stack, text};
16use iced::{Border, Length, Renderer, Theme};
17use iced_aw::style::Status;
18use iced_aw::style::menu_bar::primary;
19use iced_aw::{Menu, menu, menu_bar, menu_items, number_input};
20
21pub fn build<'a>(
22 config_window: &'a ConfigWindow,
23 dance_interpreter: &'a DanceInterpreter,
24) -> Stack<'a, Message, Theme, Renderer> {
25 let menu_tpl = |items| Menu::new(items).max_width(160.0).offset(15.0).spacing(5.0);
26 let menu_tpl_wide = |items| Menu::new(items).max_width(256.0).offset(15.0).spacing(5.0);
27
28 #[rustfmt::skip]
29 let mb = menu_bar!
30 (
31 (
32 label_message_button_shrink("File", Message::Noop),
33 menu_tpl(
34 menu_items!(
35 (label_message_button_fill("Open Playlist File", Message::OpenPlaylist)),
36 (label_message_button_fill("Exit", Message::WindowClosed(config_window.id))),
37 )
38 )
39 .spacing(5.0)
40 ),
41 (
42 label_message_button_shrink("Edit", Message::Noop),
43 menu_tpl_wide(
44 menu_items!(
45 (labeled_message_checkbox("Autoscroll", config_window.enable_autoscroll, Message::EnableAutoscroll)),
46 (labeled_message_checkbox(
47 "Follow system theme",
48 config_window.follow_system_theme,
49 Message::EnableFollowSystemTheme
50 )),
51 (labeled_message_checkbox(
52 "Search",
53 config_window.search_visible,
54 |_| Message::Search(SearchMessage::Toggle)
55 )),
56 (row![
57 text("Theme").width(Length::Shrink),
58 Space::new().width(Length::Fill),
59 pick_list(
60 Theme::ALL,
61 Some(config_window.theme.clone()),
62 Message::SetConfigTheme
63 )
64 ]
65 .align_y(Vertical::Center)
66 .spacing(5.0)
67 .width(Length::Fill)),
68 (label_message_button_fill("Reload Statics", Message::Statics(StaticsMessage::Reload))),
69 (label_message_button_fill(format!("Add blank {}", if config_window.is_statics_view {"static"} else {"song"}), Message::AddBlankEntry)),
70 (label_message_button_fill("Undo Delete (Ctrl+Z)", Message::Dialog(DialogMessage::UndoDelete))),
71 )
72 )
73 .spacing(5.0)
74 ),
75 (
76 label_message_button_shrink("SongWindow", Message::Noop),
77 menu_tpl(
78 menu_items!(
79 (row![
80 text("Scale").width(Length::Fill),
81 number_input(&dance_interpreter.song_window.scale, 0.5..=3.0 , |val| Message::SongWindow(SongWindowMessage::ChangeScale(val)))
82 .step(0.1)
83 .width(Length::Fill)
84 ].align_y(Vertical::Center)
85 .spacing(5.0)
86 .width(Length::Fill)),
87 (labeled_message_checkbox("Show Thumbnails", dance_interpreter.song_window.enable_image, |v| Message::SongWindow(SongWindowMessage::EnableImage(v)))),
88 (labeled_message_checkbox("Show Next Dance", dance_interpreter.song_window.enable_next_dance, |v| Message::SongWindow(SongWindowMessage::EnableNextDance(v)))),
89 )
90 )
91 .spacing(5.0)
92 )
93 )
94 .spacing(5.0)
95 .draw_path(menu::DrawPath::Backdrop)
96 .style(|theme:&Theme, status: Status | menu::Style{
97 path_border: Border{
98 radius: Radius::new(6.0),
99 ..Default::default()
100 },
101 ..primary(theme, status)
102 });
103
104 let playlist_button = label_message_button_fill_opt(
105 "Playlist",
106 if config_window.is_statics_view {
107 Some(Message::ToggleStaticsView)
108 } else {
109 None
110 },
111 )
112 .width(Length::Shrink);
113
114 let statics_button = label_message_button_fill_opt(
115 "Statics",
116 if !config_window.is_statics_view {
117 Some(Message::ToggleStaticsView)
118 } else {
119 None
120 },
121 )
122 .width(Length::Shrink);
123
124 let view_buttons = row![
125 Space::new().width(Length::Fill),
126 with_tooltip(playlist_button, "Show Playlist"),
127 with_tooltip(statics_button, "Show Statics"),
128 Space::new().width(Length::Fill)
129 ]
130 .width(Length::Fill)
131 .spacing(5);
132
133 let sidebar_button = with_tooltip(
134 material_symbol_sized_message_button(
135 if config_window.sidebar.state.value() {
136 "right_panel_close"
137 } else {
138 "right_panel_open"
139 },
140 false,
141 20.0,
142 Message::Sidebar(SidebarMessage::Toggle),
143 )
144 .padding([0, 4]),
145 if config_window.sidebar.state.value() {
146 "Collapse Traktor Panel"
147 } else {
148 "Expand Traktor Panel"
149 },
150 );
151
152 stack![
153 row![mb, horizontal()].width(Length::Fill),
154 row![horizontal(), view_buttons, horizontal()].width(Length::Fill),
155 row![horizontal(), sidebar_button].width(Length::Fill)
156 ]
157 .width(Length::Fill)
158}