From 225c2b095b03e4b0383a99863349fc28b6a3f893 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Sat, 14 May 2016 15:42:45 -0700 Subject: Initial start of the menu bar app. Has menu items to join/leave networks which currently displays an empty popover from the icon (icon needs to be made still) --- ZeroTier One.xcodeproj/project.pbxproj | 16 ++++++ .../xcdebugger/Breakpoints_v2.xcbkptlist | 5 ++ ZeroTier One/AppDelegate.swift | 64 ++++++++++++++++++++- ZeroTier One/Assets.xcassets/Contents.json | 6 ++ .../MenuBarIconMac.imageset/Contents.json | 21 +++++++ .../MenuBarIconMac.imageset/MenuBarIconMac.png | Bin 0 -> 3810 bytes .../MenuBarIconMac.imageset/MenuBarIconMac@2x.png | Bin 0 -> 5444 bytes ZeroTier One/Base.lproj/MainMenu.xib | 11 ++-- ZeroTier One/Info.plist | 2 + ZeroTier One/JoinNetworkViewController.swift | 18 ++++++ ZeroTier One/JoinNetworkViewController.xib | 20 +++++++ ZeroTier One/ShowNetworksViewController.swift | 18 ++++++ ZeroTier One/ShowNetworksViewController.xib | 20 +++++++ 13 files changed, 195 insertions(+), 6 deletions(-) create mode 100644 ZeroTier One.xcodeproj/xcuserdata/grant.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 ZeroTier One/Assets.xcassets/Contents.json create mode 100644 ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/Contents.json create mode 100644 ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBarIconMac.png create mode 100644 ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBarIconMac@2x.png create mode 100644 ZeroTier One/JoinNetworkViewController.swift create mode 100644 ZeroTier One/JoinNetworkViewController.xib create mode 100644 ZeroTier One/ShowNetworksViewController.swift create mode 100644 ZeroTier One/ShowNetworksViewController.xib diff --git a/ZeroTier One.xcodeproj/project.pbxproj b/ZeroTier One.xcodeproj/project.pbxproj index 10787067..2730b987 100644 --- a/ZeroTier One.xcodeproj/project.pbxproj +++ b/ZeroTier One.xcodeproj/project.pbxproj @@ -10,6 +10,10 @@ 93326BDC1CE7C816005CA2AC /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93326BDB1CE7C816005CA2AC /* AppDelegate.swift */; }; 93326BDE1CE7C816005CA2AC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 93326BDD1CE7C816005CA2AC /* Assets.xcassets */; }; 93326BE11CE7C816005CA2AC /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 93326BDF1CE7C816005CA2AC /* MainMenu.xib */; }; + 93326BEA1CE7D9B9005CA2AC /* JoinNetworkViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93326BE81CE7D9B9005CA2AC /* JoinNetworkViewController.swift */; }; + 93326BEB1CE7D9B9005CA2AC /* JoinNetworkViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 93326BE91CE7D9B9005CA2AC /* JoinNetworkViewController.xib */; }; + 93326BEE1CE7DA30005CA2AC /* ShowNetworksViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93326BEC1CE7DA30005CA2AC /* ShowNetworksViewController.swift */; }; + 93326BEF1CE7DA30005CA2AC /* ShowNetworksViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 93326BED1CE7DA30005CA2AC /* ShowNetworksViewController.xib */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -18,6 +22,10 @@ 93326BDD1CE7C816005CA2AC /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 93326BE01CE7C816005CA2AC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; 93326BE21CE7C816005CA2AC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 93326BE81CE7D9B9005CA2AC /* JoinNetworkViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JoinNetworkViewController.swift; sourceTree = ""; }; + 93326BE91CE7D9B9005CA2AC /* JoinNetworkViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JoinNetworkViewController.xib; sourceTree = ""; }; + 93326BEC1CE7DA30005CA2AC /* ShowNetworksViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShowNetworksViewController.swift; sourceTree = ""; }; + 93326BED1CE7DA30005CA2AC /* ShowNetworksViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ShowNetworksViewController.xib; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -51,9 +59,13 @@ isa = PBXGroup; children = ( 93326BDB1CE7C816005CA2AC /* AppDelegate.swift */, + 93326BE81CE7D9B9005CA2AC /* JoinNetworkViewController.swift */, + 93326BEC1CE7DA30005CA2AC /* ShowNetworksViewController.swift */, 93326BDD1CE7C816005CA2AC /* Assets.xcassets */, 93326BDF1CE7C816005CA2AC /* MainMenu.xib */, 93326BE21CE7C816005CA2AC /* Info.plist */, + 93326BE91CE7D9B9005CA2AC /* JoinNetworkViewController.xib */, + 93326BED1CE7DA30005CA2AC /* ShowNetworksViewController.xib */, ); path = "ZeroTier One"; sourceTree = ""; @@ -116,6 +128,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 93326BEF1CE7DA30005CA2AC /* ShowNetworksViewController.xib in Resources */, + 93326BEB1CE7D9B9005CA2AC /* JoinNetworkViewController.xib in Resources */, 93326BDE1CE7C816005CA2AC /* Assets.xcassets in Resources */, 93326BE11CE7C816005CA2AC /* MainMenu.xib in Resources */, ); @@ -129,6 +143,8 @@ buildActionMask = 2147483647; files = ( 93326BDC1CE7C816005CA2AC /* AppDelegate.swift in Sources */, + 93326BEA1CE7D9B9005CA2AC /* JoinNetworkViewController.swift in Sources */, + 93326BEE1CE7DA30005CA2AC /* ShowNetworksViewController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/ZeroTier One.xcodeproj/xcuserdata/grant.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/ZeroTier One.xcodeproj/xcuserdata/grant.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 00000000..fe2b4541 --- /dev/null +++ b/ZeroTier One.xcodeproj/xcuserdata/grant.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,5 @@ + + + diff --git a/ZeroTier One/AppDelegate.swift b/ZeroTier One/AppDelegate.swift index 6ac5a5c1..e5932f5f 100644 --- a/ZeroTier One/AppDelegate.swift +++ b/ZeroTier One/AppDelegate.swift @@ -14,8 +14,34 @@ 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 + func applicationDidFinishLaunching(aNotification: NSNotification) { - // Insert code here to initialize your application + + + 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 + + networkListPopover.contentViewController = ShowNetworksViewController( + nibName: "ShowNetworksViewController", bundle: nil) + networkListPopover.behavior = .Transient } func applicationWillTerminate(aNotification: NSNotification) { @@ -23,5 +49,41 @@ class AppDelegate: NSObject, NSApplicationDelegate { } + 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) + } } diff --git a/ZeroTier One/Assets.xcassets/Contents.json b/ZeroTier One/Assets.xcassets/Contents.json new file mode 100644 index 00000000..da4a164c --- /dev/null +++ b/ZeroTier One/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/Contents.json b/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/Contents.json new file mode 100644 index 00000000..ab75ef9a --- /dev/null +++ b/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "mac", + "filename" : "MenuBarIconMac.png", + "scale" : "1x" + }, + { + "idiom" : "mac", + "filename" : "MenuBarIconMac@2x.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBarIconMac.png b/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBarIconMac.png new file mode 100644 index 00000000..74e59fe7 Binary files /dev/null and b/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBarIconMac.png differ diff --git a/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBarIconMac@2x.png b/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBarIconMac@2x.png new file mode 100644 index 00000000..1c99f851 Binary files /dev/null and b/ZeroTier One/Assets.xcassets/MenuBarIconMac.imageset/MenuBarIconMac@2x.png differ diff --git a/ZeroTier One/Base.lproj/MainMenu.xib b/ZeroTier One/Base.lproj/MainMenu.xib index 3bcfb090..4722fac2 100644 --- a/ZeroTier One/Base.lproj/MainMenu.xib +++ b/ZeroTier One/Base.lproj/MainMenu.xib @@ -1,7 +1,8 @@ - + - + + @@ -11,7 +12,7 @@ - + @@ -666,11 +667,11 @@ - + - + diff --git a/ZeroTier One/Info.plist b/ZeroTier One/Info.plist index d5b744c6..f5d0dc94 100644 --- a/ZeroTier One/Info.plist +++ b/ZeroTier One/Info.plist @@ -2,6 +2,8 @@ + LSUIElement + CFBundleDevelopmentRegion en CFBundleExecutable diff --git a/ZeroTier One/JoinNetworkViewController.swift b/ZeroTier One/JoinNetworkViewController.swift new file mode 100644 index 00000000..d071ce91 --- /dev/null +++ b/ZeroTier One/JoinNetworkViewController.swift @@ -0,0 +1,18 @@ +// +// JoinNetworkViewController.swift +// ZeroTier One +// +// Created by Grant Limberg on 5/14/16. +// Copyright © 2016 ZeroTier, Inc. All rights reserved. +// + +import Cocoa + +class JoinNetworkViewController: NSViewController { + + override func viewDidLoad() { + super.viewDidLoad() + // Do view setup here. + } + +} diff --git a/ZeroTier One/JoinNetworkViewController.xib b/ZeroTier One/JoinNetworkViewController.xib new file mode 100644 index 00000000..7f3f1329 --- /dev/null +++ b/ZeroTier One/JoinNetworkViewController.xib @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/ZeroTier One/ShowNetworksViewController.swift b/ZeroTier One/ShowNetworksViewController.swift new file mode 100644 index 00000000..0ecb38f5 --- /dev/null +++ b/ZeroTier One/ShowNetworksViewController.swift @@ -0,0 +1,18 @@ +// +// ShowNetworksViewController.swift +// ZeroTier One +// +// Created by Grant Limberg on 5/14/16. +// Copyright © 2016 ZeroTier, Inc. All rights reserved. +// + +import Cocoa + +class ShowNetworksViewController: NSViewController { + + override func viewDidLoad() { + super.viewDidLoad() + // Do view setup here. + } + +} diff --git a/ZeroTier One/ShowNetworksViewController.xib b/ZeroTier One/ShowNetworksViewController.xib new file mode 100644 index 00000000..2fe5f22f --- /dev/null +++ b/ZeroTier One/ShowNetworksViewController.xib @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3