dynamically generate the menu so that networks are listed

can join/leave networks directly from the menu
This commit is contained in:
Grant Limberg 2016-06-21 19:44:59 -07:00
parent c8f85ffec9
commit 6d114b7480

View File

@ -23,20 +23,15 @@ class AppDelegate: NSObject, NSApplicationDelegate {
let monitor = NetworkMonitor()
var networks = [Network]()
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
buildMenu()
joinNetworkPopover.contentViewController = JoinNetworkViewController(
nibName: "JoinNetworkViewController", bundle: nil)
@ -98,6 +93,60 @@ class AppDelegate: NSObject, NSApplicationDelegate {
func onNetworkListUpdated(note: NSNotification) {
let netList = note.userInfo!["networks"] as! [Network]
(networkListPopover.contentViewController as! ShowNetworksViewController).setNetworks(netList)
self.networks = netList
buildMenu()
}
func buildMenu() {
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())
if networks.count > 0 {
for net in networks {
let id = String(net.nwid, radix: 16)
let networkName = "\(id) (\(net.name))"
let item = NSMenuItem(title: networkName, action: #selector(AppDelegate.toggleNetwork(_:)), keyEquivalent: "")
if net.connected {
item.state = NSOnState
}
else {
item.state = NSOffState
}
item.representedObject = net
menu.addItem(item)
}
menu.addItem(NSMenuItem.separatorItem())
}
menu.addItem(NSMenuItem(title: "Quit ZeroTier One", action: #selector(AppDelegate.quit), keyEquivalent: "q"))
statusItem.menu = menu
}
func toggleNetwork(sender: NSMenuItem) {
NSLog("\(sender.title)")
let network = sender.representedObject as! Network
let id = String(network.nwid, radix: 16)
if network.connected {
ServiceCom.leaveNetwork(id)
}
else {
ServiceCom.joinNetwork(id)
}
}
}