Yoda/src/app/browser/window/header/bar/menu.rs
2024-11-09 14:59:58 +02:00

95 lines
3.6 KiB
Rust

mod widget;
use widget::Widget;
use crate::app::browser::action::Action as BrowserAction;
use gtk::{
gio::{self, SimpleAction},
glib::{gformat, GString},
prelude::ActionExt,
MenuButton,
};
use std::rc::Rc;
pub struct Menu {
widget: Rc<Widget>,
}
#[rustfmt::skip] // @TODO template builder?
impl Menu {
pub fn new_rc(
browser_action: Rc<BrowserAction>,
action_page_new: SimpleAction,
action_page_close: SimpleAction,
action_page_close_all: SimpleAction,
action_page_home: SimpleAction,
action_page_history_back: SimpleAction,
action_page_history_forward: SimpleAction,
action_page_reload: SimpleAction,
action_page_pin: SimpleAction,
) -> Rc<Self> {
// Main
let main = gio::Menu::new();
// Main > Page
let main_page = gio::Menu::new();
main_page.append(Some("New"), Some(&detailed_action_name(&action_page_new)));
main_page.append(Some("Reload"), Some(&detailed_action_name(&action_page_reload)));
main_page.append(Some("Pin"), Some(&detailed_action_name(&action_page_pin)));
// Main > Page > Navigation
let main_page_navigation = gio::Menu::new();
main_page_navigation.append(Some("Home"), Some(&detailed_action_name(&action_page_home)));
// Main > Page > Navigation > History
let main_page_navigation_history = gio::Menu::new();
main_page_navigation_history.append(Some("Back"), Some(&detailed_action_name(&action_page_history_back)));
main_page_navigation_history.append(Some("Forward"), Some(&detailed_action_name(&action_page_history_forward)));
main_page_navigation.append_submenu(Some("History"), &main_page_navigation_history);
main_page.append_section(None, &main_page_navigation);
// Main > Page > Close
let main_page_close = gio::Menu::new();
main_page_close.append(Some("Current"), Some(&detailed_action_name(&action_page_close)));
main_page_close.append(Some("All"), Some(&detailed_action_name(&action_page_close_all)));
main_page.append_submenu(Some("Close"), &main_page_close);
main.append_submenu(Some("Page"), &main_page);
// Main > Tool
let main_tool = gio::Menu::new();
{ // Debug
let (group, action, _, _) = crate::action::APP_BROWSER_WIDGET_DEBUG;
main_tool.append(Some("Debug"), Some(&gformat!("{group}.{action}")));
}
main_tool.append(Some("Profile"), Some(&detailed_action_name(browser_action.profile())));
main_tool.append(Some("About"), Some(&detailed_action_name(browser_action.about())));
main.append_submenu(Some("Tool"), &main_tool);
{
// Quit
let (group, action, _, _) = crate::action::APP_BROWSER_WIDGET_CLOSE;
main.append(Some("Quit"), Some(&gformat!("{group}.{action}")));
}
// Result
Rc::new(Self { widget:Widget::new_rc(&main) })
}
// Getters
pub fn gobject(&self) -> &MenuButton {
self.widget.gobject()
}
}
// Private helpers
fn detailed_action_name(action: &SimpleAction) -> GString {
gformat!("win.{}", action.name()) // @TODO find the way to ident parent group
// without application-wide dependencies import
// see also src/app/action.rs
}