You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
3.6 KiB
103 lines
3.6 KiB
// |
|
// AppDelegate.swift |
|
// ZeroTier One |
|
// |
|
// Created by Grant Limberg on 5/14/16. |
|
// Copyright © 2016 ZeroTier, Inc. All rights reserved. |
|
// |
|
|
|
import Cocoa |
|
|
|
@NSApplicationMain |
|
class AppDelegate: NSObject, NSApplicationDelegate { |
|
|
|
@IBOutlet weak var window: NSWindow! |
|
|
|
|
|
let statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(-2.0) |
|
|
|
let networkListPopover = NSPopover() |
|
let joinNetworkPopover = NSPopover() |
|
|
|
var transientMonitor: AnyObject? = nil |
|
|
|
let monitor = NetworkMonitor() |
|
|
|
func applicationDidFinishLaunching(aNotification: NSNotification) { |
|
let nc = NSNotificationCenter.defaultCenter() |
|
nc.addObserver(self, selector: #selector(onNetworkListUpdated(_:)), name: networkUpdateKey, object: nil) |
|
|
|
statusItem.image = NSImage(named: "MenuBarIconMac") |
|
|
|
let menu = NSMenu() |
|
|
|
menu.addItem(NSMenuItem(title: "Show Networks", action: #selector(AppDelegate.showNetworks), keyEquivalent: "n")) |
|
menu.addItem(NSMenuItem(title: "Join Network", action: #selector(AppDelegate.joinNetwork), keyEquivalent: "j")) |
|
menu.addItem(NSMenuItem.separatorItem()) |
|
menu.addItem(NSMenuItem(title: "Quit ZeroTier One", action: #selector(AppDelegate.quit), keyEquivalent: "q")) |
|
|
|
statusItem.menu = menu |
|
|
|
joinNetworkPopover.contentViewController = JoinNetworkViewController( |
|
nibName: "JoinNetworkViewController", bundle: nil) |
|
joinNetworkPopover.behavior = .Transient |
|
|
|
joinNetworkPopover.appearance = NSAppearance(named: NSAppearanceNameAqua) |
|
|
|
networkListPopover.contentViewController = ShowNetworksViewController( |
|
nibName: "ShowNetworksViewController", bundle: nil) |
|
networkListPopover.behavior = .Transient |
|
|
|
networkListPopover.appearance = NSAppearance(named: NSAppearanceNameAqua) |
|
} |
|
|
|
func applicationWillTerminate(aNotification: NSNotification) { |
|
// Insert code here to tear down your application |
|
let nc = NSNotificationCenter.defaultCenter() |
|
nc.removeObserver(self) |
|
} |
|
|
|
|
|
func showNetworks() { |
|
if let button = statusItem.button { |
|
networkListPopover.showRelativeToRect(button.bounds, ofView: button, preferredEdge: .MinY) |
|
|
|
if transientMonitor == nil { |
|
transientMonitor = NSEvent.addGlobalMonitorForEventsMatchingMask( |
|
[.LeftMouseDownMask, .RightMouseDownMask, .OtherMouseDownMask]) { (event: NSEvent) -> Void in |
|
|
|
NSEvent.removeMonitor(self.transientMonitor!) |
|
self.transientMonitor = nil |
|
self.networkListPopover.close() |
|
} |
|
} |
|
} |
|
} |
|
|
|
func joinNetwork() { |
|
if let button = statusItem.button { |
|
joinNetworkPopover.showRelativeToRect(button.bounds, ofView: button, preferredEdge: .MinY) |
|
|
|
if transientMonitor == nil { |
|
transientMonitor = NSEvent.addGlobalMonitorForEventsMatchingMask( |
|
[.LeftMouseDownMask, .RightMouseDownMask, .OtherMouseDownMask]) { (event: NSEvent) -> Void in |
|
|
|
NSEvent.removeMonitor(self.transientMonitor!) |
|
self.transientMonitor = nil |
|
self.joinNetworkPopover.close() |
|
|
|
} |
|
} |
|
} |
|
} |
|
|
|
func quit() { |
|
NSApp.performSelector(#selector(NSApp.terminate(_:)), withObject: nil, afterDelay: 0.0) |
|
} |
|
|
|
func onNetworkListUpdated(note: NSNotification) { |
|
let netList = note.userInfo!["networks"] as! [Network] |
|
(networkListPopover.contentViewController as! ShowNetworksViewController).setNetworks(netList) |
|
} |
|
} |
|
|
|
|