// MainMenuBuilder.swift // GreenshotMac // // A menu bar for the editor windows; the app itself lives in the status bar. import AppKit @MainActor enum MainMenuBuilder { static func install() { let mainMenu = NSMenu() // Application menu let appMenuItem = NSMenuItem() let appMenu = NSMenu() appMenu.addItem(withTitle: "About GreenshotMac", action: #selector(NSApplication.orderFrontStandardAboutPanel(_:)), keyEquivalent: "") appMenu.addItem(.separator()) appMenu.addItem(withTitle: "Hide GreenshotMac", action: #selector(NSApplication.hide(_:)), keyEquivalent: "h") appMenu.addItem(.separator()) appMenu.addItem(withTitle: "Quit GreenshotMac", action: #selector(NSApplication.terminate(_:)), keyEquivalent: "q") appMenuItem.submenu = appMenu mainMenu.addItem(appMenuItem) // File let fileItem = NSMenuItem() let fileMenu = NSMenu(title: "File") fileMenu.addItem(withTitle: "Save", action: #selector(EditorWindowController.saveDocument(_:)), keyEquivalent: "s") let saveAs = NSMenuItem(title: "Save As…", action: #selector(EditorWindowController.saveDocumentAs(_:)), keyEquivalent: "s") saveAs.keyEquivalentModifierMask = [.command, .shift] fileMenu.addItem(saveAs) fileMenu.addItem(withTitle: "Print…", action: #selector(EditorWindowController.printDocument(_:)), keyEquivalent: "p") fileMenu.addItem(withTitle: "Share…", action: #selector(EditorWindowController.shareDocument(_:)), keyEquivalent: "") fileMenu.addItem(.separator()) fileMenu.addItem(withTitle: "Close", action: #selector(NSWindow.performClose(_:)), keyEquivalent: "w") fileItem.submenu = fileMenu mainMenu.addItem(fileItem) // Edit let editItem = NSMenuItem() let editMenu = NSMenu(title: "Edit") editMenu.addItem(withTitle: "Undo", action: Selector(("undo:")), keyEquivalent: "z") let redo = NSMenuItem(title: "Redo", action: Selector(("redo:")), keyEquivalent: "z") redo.keyEquivalentModifierMask = [.command, .shift] editMenu.addItem(redo) editMenu.addItem(.separator()) editMenu.addItem(withTitle: "Cut", action: #selector(NSText.cut(_:)), keyEquivalent: "x") editMenu.addItem(withTitle: "Copy", action: #selector(EditorWindowController.copy(_:)), keyEquivalent: "c") editMenu.addItem(withTitle: "Paste", action: #selector(NSText.paste(_:)), keyEquivalent: "v") editMenu.addItem(withTitle: "Duplicate", action: #selector(EditorWindowController.duplicateSelection(_:)), keyEquivalent: "d") editMenu.addItem(withTitle: "Delete", action: #selector(EditorWindowController.deleteSelection(_:)), keyEquivalent: "\u{8}") editItem.submenu = editMenu mainMenu.addItem(editItem) // Capture let captureItem = NSMenuItem() let captureMenu = NSMenu(title: "Capture") captureMenu.addItem(withTitle: "Region", action: #selector(CaptureMenuTarget.captureRegion), keyEquivalent: "") captureMenu.addItem(withTitle: "Window", action: #selector(CaptureMenuTarget.captureWindow), keyEquivalent: "") captureMenu.addItem(withTitle: "Full screen", action: #selector(CaptureMenuTarget.captureFullscreen), keyEquivalent: "") captureMenu.addItem(withTitle: "Last region", action: #selector(CaptureMenuTarget.captureLastRegion), keyEquivalent: "") for menuItem in captureMenu.items { menuItem.target = CaptureMenuTarget.shared } captureItem.submenu = captureMenu mainMenu.addItem(captureItem) // Tools let toolsItem = NSMenuItem() let toolsMenu = NSMenu(title: "Tools") for tool in ToolKind.allCases { let menuItem = NSMenuItem(title: tool.title, action: #selector(EditorWindowController.selectTool(_:)), keyEquivalent: tool.keyEquivalent) menuItem.keyEquivalentModifierMask = [] menuItem.representedObject = tool.rawValue toolsMenu.addItem(menuItem) } toolsMenu.addItem(.separator()) toolsMenu.addItem(withTitle: "Apply crop", action: #selector(EditorWindowController.applyCrop(_:)), keyEquivalent: "\r") toolsMenu.addItem(.separator()) toolsMenu.addItem(withTitle: "Bring to Front", action: #selector(EditorWindowController.bringToFront(_:)), keyEquivalent: "") toolsMenu.addItem(withTitle: "Send to Back", action: #selector(EditorWindowController.sendToBack(_:)), keyEquivalent: "") toolsItem.submenu = toolsMenu mainMenu.addItem(toolsItem) // View let viewItem = NSMenuItem() let viewMenu = NSMenu(title: "View") viewMenu.addItem(withTitle: "Zoom In", action: #selector(EditorWindowController.zoomIn(_:)), keyEquivalent: "+") viewMenu.addItem(withTitle: "Zoom Out", action: #selector(EditorWindowController.zoomOut(_:)), keyEquivalent: "-") viewMenu.addItem(withTitle: "Actual Size", action: #selector(EditorWindowController.actualSize(_:)), keyEquivalent: "0") viewItem.submenu = viewMenu mainMenu.addItem(viewItem) NSApp.mainMenu = mainMenu } } @MainActor final class CaptureMenuTarget: NSObject { static let shared = CaptureMenuTarget() @objc func captureRegion() { CaptureCoordinator.shared.captureRegion() } @objc func captureWindow() { CaptureCoordinator.shared.captureWindow() } @objc func captureFullscreen() { CaptureCoordinator.shared.captureFullscreen() } @objc func captureLastRegion() { CaptureCoordinator.shared.captureLastRegion() } }