Browse Source

dynamically generate the menu so that networks are listed

can join/leave networks directly from the menu
Grant Limberg 9 years ago
parent
commit
6d114b7480
1 changed files with 57 additions and 8 deletions
  1. 57 8
      ZeroTier One/AppDelegate.swift

+ 57 - 8
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)
+        }
     }
 }