Skip to main content

danceinterpreter_rs/ui/config_window/
top_bar.rs

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