diff options
Diffstat (limited to 'WireGuard/WireGuard/UI/macOS/MainMenu.swift')
-rw-r--r-- | WireGuard/WireGuard/UI/macOS/MainMenu.swift | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/WireGuard/WireGuard/UI/macOS/MainMenu.swift b/WireGuard/WireGuard/UI/macOS/MainMenu.swift new file mode 100644 index 0000000..72bba71 --- /dev/null +++ b/WireGuard/WireGuard/UI/macOS/MainMenu.swift @@ -0,0 +1,129 @@ +// SPDX-License-Identifier: MIT +// Copyright © 2018 WireGuard LLC. All Rights Reserved. + +import Cocoa + +class MainMenu: NSMenu { + init() { + super.init(title: "") + addSubmenu(createApplicationMenu()) + addSubmenu(createFileMenu()) + addSubmenu(createEditMenu()) + addSubmenu(createTunnelMenu()) + addSubmenu(createWindowMenu()) + } + + required init(coder decoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func addSubmenu(_ menu: NSMenu) { + let menuItem = self.addItem(withTitle: "", action: nil, keyEquivalent: "") + self.setSubmenu(menu, for: menuItem) + } + + private func createApplicationMenu() -> NSMenu { + let menu = NSMenu() + + let aboutMenuItem = menu.addItem(withTitle: tr("macMenuAbout"), + action: #selector(AppDelegate.aboutClicked), keyEquivalent: "") + aboutMenuItem.target = NSApp.delegate + + menu.addItem(NSMenuItem.separator()) + + menu.addItem(withTitle: tr("macMenuViewLog"), + action: #selector(TunnelsListTableViewController.handleViewLogAction), keyEquivalent: "") + + menu.addItem(NSMenuItem.separator()) + + let hideMenuItem = menu.addItem(withTitle: tr("macMenuHideApp"), + action: #selector(NSApplication.hide), keyEquivalent: "h") + hideMenuItem.target = NSApp + let hideOthersMenuItem = menu.addItem(withTitle: tr("macMenuHideOtherApps"), + action: #selector(NSApplication.hideOtherApplications), keyEquivalent: "h") + hideOthersMenuItem.keyEquivalentModifierMask = [.command, .option] + hideOthersMenuItem.target = NSApp + let showAllMenuItem = menu.addItem(withTitle: tr("macMenuShowAllApps"), + action: #selector(NSApplication.unhideAllApplications), keyEquivalent: "") + showAllMenuItem.target = NSApp + + menu.addItem(NSMenuItem.separator()) + + let quitMenuItem = menu.addItem(withTitle: tr("macMenuQuit"), + action: #selector(AppDelegate.quit), keyEquivalent: "q") + quitMenuItem.target = NSApp.delegate + + return menu + } + + private func createFileMenu() -> NSMenu { + let menu = NSMenu(title: tr("macMenuFile")) + + menu.addItem(withTitle: tr("macMenuAddEmptyTunnel"), + action: #selector(TunnelsListTableViewController.handleAddEmptyTunnelAction), keyEquivalent: "n") + menu.addItem(withTitle: tr("macMenuImportTunnels"), + action: #selector(TunnelsListTableViewController.handleImportTunnelAction), keyEquivalent: "o") + + menu.addItem(NSMenuItem.separator()) + + menu.addItem(withTitle: tr("macMenuExportTunnels"), + action: #selector(TunnelsListTableViewController.handleExportTunnelsAction), keyEquivalent: "") + + menu.addItem(NSMenuItem.separator()) + + menu.addItem(withTitle: tr("macMenuCloseWindow"), action: #selector(NSWindow.performClose(_:)), keyEquivalent:"w") + + return menu + } + + private func createEditMenu() -> NSMenu { + let menu = NSMenu(title: tr("macMenuEdit")) + + menu.addItem(withTitle: tr("macMenuUndo"), action: #selector(UndoActionRespondable.undo(_:)), keyEquivalent:"z") + menu.addItem(withTitle: tr("macMenuRedo"), action: #selector(UndoActionRespondable.redo(_:)), keyEquivalent:"Z") + + menu.addItem(NSMenuItem.separator()) + + menu.addItem(withTitle: tr("macMenuCut"), action: #selector(NSText.cut(_:)), keyEquivalent:"x") + menu.addItem(withTitle: tr("macMenuCopy"), action: #selector(NSText.copy(_:)), keyEquivalent:"c") + menu.addItem(withTitle: tr("macMenuPaste"), action: #selector(NSText.paste(_:)), keyEquivalent:"v") + + menu.addItem(NSMenuItem.separator()) + + menu.addItem(withTitle: tr("macMenuSelectAll"), action: #selector(NSText.selectAll(_:)), keyEquivalent:"a") + + return menu + } + + private func createTunnelMenu() -> NSMenu { + let menu = NSMenu(title: tr("macMenuTunnel")) + + menu.addItem(withTitle: tr("macMenuToggleStatus"), action: #selector(TunnelDetailTableViewController.handleToggleActiveStatusAction), keyEquivalent:"t") + + menu.addItem(NSMenuItem.separator()) + + menu.addItem(withTitle: tr("macMenuEditTunnel"), action: #selector(TunnelDetailTableViewController.handleEditTunnelAction), keyEquivalent:"e") + menu.addItem(withTitle: tr("macMenuDeleteSelected"), action: #selector(TunnelsListTableViewController.handleRemoveTunnelAction), keyEquivalent: "") + + return menu + } + + private func createWindowMenu() -> NSMenu { + let menu = NSMenu(title: tr("macMenuWindow")) + + menu.addItem(withTitle: tr("macMenuMinimize"), action: #selector(NSWindow.performMiniaturize(_:)), keyEquivalent:"m") + menu.addItem(withTitle: tr("macMenuZoom"), action: #selector(NSWindow.performZoom(_:)), keyEquivalent:"") + + menu.addItem(NSMenuItem.separator()) + + let fullScreenMenuItem = menu.addItem(withTitle: tr("macMenuFullScreen"), action: #selector(NSWindow.toggleFullScreen(_:)), keyEquivalent:"f") + fullScreenMenuItem.keyEquivalentModifierMask = [.command, .control] + + return menu + } +} + +@objc protocol UndoActionRespondable { + func undo(_ sender: AnyObject) + func redo(_ sender: AnyObject) +} |