prehnite/app/window/main_window/
menubar.rs1use 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}