Skip to main content

danceinterpreter_rs/ui/config_window/
top_bar.rs

1use 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}