use muda::{Menu, MenuEvent, MenuItem, PredefinedMenuItem, Submenu, accelerator::Accelerator}; use muda::accelerator::{Code, Modifiers}; pub struct AppMenu { #[allow(dead_code)] pub menu: Menu, } pub enum MenuAction { NewNote, Open, Save, SaveAs, Quit, Undo, Redo, Bold, Italic, InsertTable, Evaluate, LiveMode, EditorMode, ViewMode, ZoomIn, ZoomOut, ZoomReset, Find, Settings, ExportCrate, } impl AppMenu { pub fn new() -> Self { let menu = Menu::new(); let file = Submenu::new("File", true); file.append(&MenuItem::with_id("new", "New Note", true, Some(Accelerator::new(Some(Modifiers::CONTROL), Code::KeyN)))).ok(); file.append(&MenuItem::with_id("open", "Open...", true, Some(Accelerator::new(Some(Modifiers::CONTROL), Code::KeyO)))).ok(); file.append(&PredefinedMenuItem::separator()).ok(); file.append(&MenuItem::with_id("save", "Save", true, Some(Accelerator::new(Some(Modifiers::CONTROL), Code::KeyS)))).ok(); file.append(&MenuItem::with_id("save_as", "Save As...", true, Some(Accelerator::new(Some(Modifiers::CONTROL | Modifiers::SHIFT), Code::KeyS)))).ok(); file.append(&PredefinedMenuItem::separator()).ok(); file.append(&MenuItem::with_id("export_crate", "Export as Rust Library", true, Some(Accelerator::new(Some(Modifiers::CONTROL | Modifiers::SHIFT), Code::KeyE)))).ok(); file.append(&PredefinedMenuItem::separator()).ok(); file.append(&MenuItem::with_id("quit", "Quit", true, Some(Accelerator::new(Some(Modifiers::CONTROL), Code::KeyQ)))).ok(); let edit = Submenu::new("Edit", true); edit.append(&MenuItem::with_id("undo", "Undo", true, Some(Accelerator::new(Some(Modifiers::CONTROL), Code::KeyZ)))).ok(); edit.append(&MenuItem::with_id("redo", "Redo", true, Some(Accelerator::new(Some(Modifiers::CONTROL | Modifiers::SHIFT), Code::KeyZ)))).ok(); edit.append(&PredefinedMenuItem::separator()).ok(); edit.append(&PredefinedMenuItem::cut(None)).ok(); edit.append(&PredefinedMenuItem::copy(None)).ok(); edit.append(&PredefinedMenuItem::paste(None)).ok(); edit.append(&PredefinedMenuItem::select_all(None)).ok(); edit.append(&PredefinedMenuItem::separator()).ok(); edit.append(&MenuItem::with_id("find", "Find...", true, Some(Accelerator::new(Some(Modifiers::CONTROL), Code::KeyF)))).ok(); edit.append(&PredefinedMenuItem::separator()).ok(); edit.append(&MenuItem::with_id("settings", "Settings...", true, Some(Accelerator::new(Some(Modifiers::CONTROL), Code::Comma)))).ok(); edit.append(&PredefinedMenuItem::separator()).ok(); edit.append(&MenuItem::with_id("bold", "Bold", true, Some(Accelerator::new(Some(Modifiers::CONTROL), Code::KeyB)))).ok(); edit.append(&MenuItem::with_id("italic", "Italic", true, Some(Accelerator::new(Some(Modifiers::CONTROL), Code::KeyI)))).ok(); edit.append(&MenuItem::with_id("table", "Insert Table", true, Some(Accelerator::new(Some(Modifiers::CONTROL), Code::KeyT)))).ok(); let render = Submenu::new("Render", true); render.append(&MenuItem::with_id("live", "Live", true, None)).ok(); render.append(&MenuItem::with_id("editor", "Editor", true, None)).ok(); render.append(&MenuItem::with_id("view", "View", true, None)).ok(); render.append(&PredefinedMenuItem::separator()).ok(); render.append(&MenuItem::with_id("eval", "Evaluate", true, Some(Accelerator::new(Some(Modifiers::CONTROL), Code::Enter)))).ok(); let view = Submenu::new("View", true); view.append(&MenuItem::with_id("zoom_in", "Zoom In", true, Some(Accelerator::new(Some(Modifiers::CONTROL), Code::Equal)))).ok(); view.append(&MenuItem::with_id("zoom_out", "Zoom Out", true, Some(Accelerator::new(Some(Modifiers::CONTROL), Code::Minus)))).ok(); view.append(&MenuItem::with_id("zoom_reset", "Reset Zoom", true, Some(Accelerator::new(Some(Modifiers::CONTROL | Modifiers::SHIFT), Code::Digit0)))).ok(); menu.append(&file).ok(); menu.append(&edit).ok(); menu.append(&render).ok(); menu.append(&view).ok(); Self { menu } } pub fn poll() -> Option { MenuEvent::receiver().try_recv().ok().and_then(|e| { match e.id().0.as_str() { "new" => Some(MenuAction::NewNote), "open" => Some(MenuAction::Open), "save" => Some(MenuAction::Save), "save_as" => Some(MenuAction::SaveAs), "quit" => Some(MenuAction::Quit), "undo" => Some(MenuAction::Undo), "redo" => Some(MenuAction::Redo), "bold" => Some(MenuAction::Bold), "italic" => Some(MenuAction::Italic), "table" => Some(MenuAction::InsertTable), "eval" => Some(MenuAction::Evaluate), "live" => Some(MenuAction::LiveMode), "editor" => Some(MenuAction::EditorMode), "view" => Some(MenuAction::ViewMode), "zoom_in" => Some(MenuAction::ZoomIn), "zoom_out" => Some(MenuAction::ZoomOut), "zoom_reset" => Some(MenuAction::ZoomReset), "find" => Some(MenuAction::Find), "settings" => Some(MenuAction::Settings), "export_crate" => Some(MenuAction::ExportCrate), _ => None, } }) } }