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