#[cfg(target_os = "macos")]
pub fn install() -> muda::Menu {
use crate::shortcuts::MENU_LAYOUT;
use muda::{Menu, Submenu};
let menu = Menu::new();
for section in MENU_LAYOUT {
let submenu = Submenu::new(section.title, true);
for &item in section.items {
let _ = submenu.append(&predefined(item));
}
let _ = menu.append(&submenu);
}
menu.init_for_nsapp();
menu
}
#[cfg(target_os = "macos")]
fn predefined(item: crate::shortcuts::MenuItem) -> muda::PredefinedMenuItem {
use crate::shortcuts::MenuItem;
use muda::{AboutMetadata, PredefinedMenuItem};
match item {
MenuItem::About => PredefinedMenuItem::about(
None,
Some(AboutMetadata {
name: Some("TinyView".to_owned()),
version: Some(env!("CARGO_PKG_VERSION").to_owned()),
..Default::default()
}),
),
MenuItem::Hide => PredefinedMenuItem::hide(None),
MenuItem::HideOthers => PredefinedMenuItem::hide_others(None),
MenuItem::ShowAll => PredefinedMenuItem::show_all(None),
MenuItem::Quit => PredefinedMenuItem::quit(None),
MenuItem::Cut => PredefinedMenuItem::cut(None),
MenuItem::Copy => PredefinedMenuItem::copy(None),
MenuItem::Paste => PredefinedMenuItem::paste(None),
MenuItem::SelectAll => PredefinedMenuItem::select_all(None),
MenuItem::Fullscreen => PredefinedMenuItem::fullscreen(None),
MenuItem::Minimize => PredefinedMenuItem::minimize(None),
MenuItem::CloseWindow => PredefinedMenuItem::close_window(None),
MenuItem::Separator => PredefinedMenuItem::separator(),
}
}
#[cfg(all(test, target_os = "macos"))]
mod tests {
use super::predefined;
use crate::shortcuts::{MenuItem, MENU_LAYOUT};
#[test]
fn each_item_maps_to_the_expected_action() {
let cases = [
(MenuItem::About, "About"),
(MenuItem::Hide, "Hide"),
(MenuItem::HideOthers, "Hide Others"),
(MenuItem::ShowAll, "Show All"),
(MenuItem::Quit, "Quit"),
(MenuItem::Cut, "Cut"),
(MenuItem::Copy, "Copy"),
(MenuItem::Paste, "Paste"),
(MenuItem::SelectAll, "Select All"),
(MenuItem::Fullscreen, "Full Screen"),
(MenuItem::Minimize, "Minimize"),
(MenuItem::CloseWindow, "Close"),
];
for (item, expected) in cases {
let text = predefined(item).text();
assert!(
text.contains(expected),
"{item:?} mapped to an item labeled {text:?}; expected it to contain {expected:?}"
);
}
}
#[test]
fn builds_every_layout_item() {
for section in MENU_LAYOUT {
for &item in section.items {
let _ = predefined(item);
}
}
}
#[test]
fn separator_has_empty_label() {
assert!(predefined(MenuItem::Separator).text().is_empty());
}
}
#[cfg(not(target_os = "macos"))]
pub struct MenuGuard;
#[cfg(not(target_os = "macos"))]
pub fn install() -> MenuGuard {
MenuGuard
}