From 6d114b7480ed5a6356b8938a4ebf11a9d19adeec Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Tue, 21 Jun 2016 19:44:59 -0700 Subject: [PATCH] dynamically generate the menu so that networks are listed can join/leave networks directly from the menu --- ZeroTier One/AppDelegate.swift | 65 +++++++++++++++++++++++++++++----- 1 file changed, 57 insertions(+), 8 deletions(-) diff --git a/ZeroTier One/AppDelegate.swift b/ZeroTier One/AppDelegate.swift index f0bd04375..dc7a3b9ae 100644 --- a/ZeroTier One/AppDelegate.swift +++ b/ZeroTier One/AppDelegate.swift @@ -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) + } } }