prehnite/app/window/main_window/
menubar.rs

1use crate::app::button;
2use crate::app::i18n_w;
3use crate::app::window::main_window::page::MainWindowPageId;
4use crate::app::window::main_window::{BookOpenerMessage, MainWindow, MainWindowMessage};
5use crate::app::Border;
6use crate::app::Radius;
7use iced::{widget, Element, Length, Task};
8use iced_aw::menu::Item;
9use iced_aw::menu_items;
10use iced_aw::{menu, menu_bar};
11use prehnite_core::db::close_book_or_log;
12
13#[derive(Clone, Debug)]
14pub enum MenuType {
15    File,
16    Show,
17    Help,
18}
19
20#[derive(Clone, Debug)]
21pub enum MenuBarMessage {
22    MenuBtnPressed(MenuType),
23    NewFile,
24    OpenFile,
25    CloseFile,
26    OpenSettings,
27    OpenBackgroundInfoEditor,
28    OpenBibliographyEditor,
29    OpenVersionInfoWindow,
30    Exit,
31    OpenLicenseInfoWindow,
32}
33
34macro_rules! menu_button_maybe {
35    ($i18n_id:expr, $message:expr) => {
36        button(i18n_w($i18n_id).size(12))
37            .style(button::text)
38            .width(150.0f32)
39            .on_press_maybe($message)
40    };
41}
42
43macro_rules! menu_button {
44    ($i18n_id:expr, $message:expr) => {
45        menu_button_maybe!($i18n_id, Some($message))
46    };
47}
48macro_rules! top_level_menu_button {
49    ($i18n_id:expr, $message:expr) => {
50        button(i18n_w($i18n_id).size(12))
51            .style(button::text)
52            .on_press($message)
53    };
54}
55
56pub fn menubar<'a>(is_book_opened: bool) -> Element<'a, MenuBarMessage> {
57    let file_menu: Item<MenuBarMessage, _, _> = Item::with_menu(
58        top_level_menu_button!("file", MenuBarMessage::MenuBtnPressed(MenuType::File)),
59        menu!(
60            (menu_button!("new-file", MenuBarMessage::NewFile)),
61            (menu_button!("open-file", MenuBarMessage::OpenFile)),
62            (menu_button_maybe!(
63                "close-file",
64                is_book_opened.then_some(MenuBarMessage::CloseFile)
65            )),
66            (widget::rule::horizontal(1)),
67            (menu_button!("settings", MenuBarMessage::OpenSettings)),
68            (widget::rule::horizontal(1)),
69            (menu_button!("exit", MenuBarMessage::Exit)),
70        )
71        .max_width(180.0f32),
72    );
73    let show_menu: Item<MenuBarMessage, _, _> = Item::with_menu(
74        top_level_menu_button!("show", MenuBarMessage::MenuBtnPressed(MenuType::Show)),
75        menu!(
76            (menu_button!(
77                "background-info-editor",
78                MenuBarMessage::OpenBackgroundInfoEditor
79            )),
80            (menu_button!(
81                "bibliography-editor",
82                MenuBarMessage::OpenBibliographyEditor
83            )),
84        )
85        .max_width(180.0f32),
86    );
87    let help_menu: Item<MenuBarMessage, _, _> = Item::with_menu(
88        top_level_menu_button!("help", MenuBarMessage::MenuBtnPressed(MenuType::Help)),
89        menu!(
90            (menu_button!("version-info", MenuBarMessage::OpenVersionInfoWindow)),
91            (menu_button!("license-info", MenuBarMessage::OpenLicenseInfoWindow))
92        )
93        .max_width(180.0f32),
94    );
95    let menu_bar = menu_bar![file_menu, show_menu, help_menu]
96        .style(|t, s| {
97            let style = menu::primary(t, s);
98            menu::Style {
99                menu_border: Border {
100                    radius: Radius::new(0),
101                    ..style.menu_border
102                },
103                ..style
104            }
105        })
106        .close_on_item_click_global(true);
107    widget::column![menu_bar, widget::rule::horizontal(1)]
108        .width(Length::Fill)
109        .into()
110}
111
112pub fn menubar_handler(
113    main_window: &mut MainWindow,
114    msg: MenuBarMessage,
115) -> Task<MainWindowMessage> {
116    match msg {
117        MenuBarMessage::MenuBtnPressed(_) => {}
118        MenuBarMessage::NewFile => {
119            return Task::done(MainWindowMessage::BookOpener(BookOpenerMessage::New));
120        }
121        MenuBarMessage::OpenFile => {
122            return Task::done(MainWindowMessage::BookOpener(BookOpenerMessage::Open));
123        }
124        MenuBarMessage::CloseFile => {
125            main_window.is_book_opened = false;
126            return Task::future(async {
127                close_book_or_log().await;
128                MainWindowMessage::ChangePage(MainWindowPageId::BookNotOpened)
129            });
130        }
131        MenuBarMessage::OpenSettings => return Task::done(MainWindowMessage::OpenSettingWindow),
132        MenuBarMessage::OpenBackgroundInfoEditor => {
133            return Task::done(MainWindowMessage::OpenBackgroundInfoEditorWindow);
134        }
135        MenuBarMessage::OpenBibliographyEditor => {
136            return Task::done(MainWindowMessage::OpenBibliographyEditorWindow);
137        }
138        MenuBarMessage::OpenVersionInfoWindow => {
139            return Task::done(MainWindowMessage::OpenVersionInfoWindow);
140        }
141        MenuBarMessage::Exit => return iced::exit(),
142        MenuBarMessage::OpenLicenseInfoWindow => {
143            return Task::done(MainWindowMessage::OpenLicenseInfoWindow);
144        }
145    }
146    Task::none()
147}