Initial commit
This commit is contained in:
@@ -0,0 +1,108 @@
|
||||
// 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() }
|
||||
}
|
||||
Reference in New Issue
Block a user