From e6494b7ea5fb36e324d80774ea92f4d2f49b0224 Mon Sep 17 00:00:00 2001 From: Jeena Date: Tue, 3 Feb 2015 23:53:38 +0100 Subject: [PATCH] second commit, working app --- .gitignore | 1 + ScreenshotUpload.xcodeproj/project.pbxproj | 2 + .../xcschemes/ScreenshotUpload.xcscheme | 43 ------- .../xcschemes/xcschememanagement.plist | 27 ----- ScreenshotUpload/AppDelegate.swift | 101 ++++++++++++++++- ScreenshotUpload/Base.lproj/MainMenu.xib | 106 ++++++++++++++++-- .../AppIcon.appiconset/Contents.json | 3 +- .../Screenshot-App-icon.png | Bin 0 -> 17579 bytes ScreenshotUpload/Info.plist | 2 +- 9 files changed, 204 insertions(+), 81 deletions(-) create mode 100644 .gitignore delete mode 100644 ScreenshotUpload.xcodeproj/xcuserdata/jeena.xcuserdatad/xcschemes/ScreenshotUpload.xcscheme delete mode 100644 ScreenshotUpload.xcodeproj/xcuserdata/jeena.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 ScreenshotUpload/Images.xcassets/AppIcon.appiconset/Screenshot-App-icon.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ee32510 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +ScreenshotUpload.xcodeproj/xcuserdata/ diff --git a/ScreenshotUpload.xcodeproj/project.pbxproj b/ScreenshotUpload.xcodeproj/project.pbxproj index f163414..407070a 100644 --- a/ScreenshotUpload.xcodeproj/project.pbxproj +++ b/ScreenshotUpload.xcodeproj/project.pbxproj @@ -399,6 +399,7 @@ 1F80F6441956FFD600925040 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; 1F80F6451956FFD600925040 /* Build configuration list for PBXNativeTarget "ScreenshotUploadTests" */ = { isa = XCConfigurationList; @@ -407,6 +408,7 @@ 1F80F6471956FFD600925040 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/ScreenshotUpload.xcodeproj/xcuserdata/jeena.xcuserdatad/xcschemes/ScreenshotUpload.xcscheme b/ScreenshotUpload.xcodeproj/xcuserdata/jeena.xcuserdatad/xcschemes/ScreenshotUpload.xcscheme deleted file mode 100644 index d2d91ae..0000000 --- a/ScreenshotUpload.xcodeproj/xcuserdata/jeena.xcuserdatad/xcschemes/ScreenshotUpload.xcscheme +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/ScreenshotUpload.xcodeproj/xcuserdata/jeena.xcuserdatad/xcschemes/xcschememanagement.plist b/ScreenshotUpload.xcodeproj/xcuserdata/jeena.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index b995a5e..0000000 --- a/ScreenshotUpload.xcodeproj/xcuserdata/jeena.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,27 +0,0 @@ - - - - - SchemeUserState - - ScreenshotUpload.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - 1F80F6251956FFD500925040 - - primary - - - 1F80F6371956FFD600925040 - - primary - - - - - diff --git a/ScreenshotUpload/AppDelegate.swift b/ScreenshotUpload/AppDelegate.swift index 3fe28d3..f48e328 100644 --- a/ScreenshotUpload/AppDelegate.swift +++ b/ScreenshotUpload/AppDelegate.swift @@ -7,20 +7,119 @@ // import Cocoa +import Foundation class AppDelegate: NSObject, NSApplicationDelegate { @IBOutlet var window: NSWindow + @IBOutlet var takeScreenshotButton : NSButton func applicationDidFinishLaunching(aNotification: NSNotification?) { - // Insert code here to initialize your application + + if !self.handledURL(aNotification) { + + // Insert code here to initialize your application + let defaults = NSUserDefaults.standardUserDefaults() + let fileName = defaults.stringForKey("fileName") + let scpPath = defaults.stringForKey("scpPath") + let httpPath = defaults.stringForKey("httpPath") + + if fileName? && scpPath? && httpPath? { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { + NSOperationQueue.mainQueue().addOperationWithBlock { + self.takeScreenshot(self) + } + } + } + } } func applicationWillTerminate(aNotification: NSNotification?) { // Insert code here to tear down your application } + + func handledURL(aNotification: NSNotification?) -> Bool { + + if let urlString = aNotification?.userInfo["openUrl"] as? String { + + let url = NSURL.URLWithString(urlString) + NSWorkspace.sharedWorkspace().openURL(url) + println(url) + + NSApp.terminate(self) + + return true + } + + return false + } + @IBAction func takeScreenshot(sender : NSObject) { + + window.miniaturize(self) + NSRunningApplication.currentApplication().hide() + + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { + // do some async stuff + + let httpUrl = self.runSystemCallsAssync() + + NSOperationQueue.mainQueue().addOperationWithBlock { + // do some main thread stuff stuff + + if httpUrl? { + let notification = NSUserNotification() + notification.title = "Screenshot uploaded to" + notification.informativeText = httpUrl + notification.userInfo = ["openUrl": httpUrl] + //notification.identifier = httpUrl + notification.soundName = "NSUserNotificationDefaultSoundName" + notification.actionButtonTitle = "Open" + notification.otherButtonTitle = "" + + NSUserNotificationCenter.defaultUserNotificationCenter().deliverNotification( + notification + ) + + NSApp.terminate(self) + + } else { + self.window.orderFront(self) + } + } + } + } + + func runSystemCallsAssync() -> String! { + + let tmpName = NSTemporaryDirectory() + "nu.jabs.apps.ScreenshotUpload.png" + + systemCall("screencapture -i \(tmpName)") + + if NSFileManager.defaultManager().isReadableFileAtPath(tmpName) { + + let defaults = NSUserDefaults.standardUserDefaults() + let fileName = defaults.stringForKey("fileName") + let scpPath = defaults.stringForKey("scpPath") + let httpPath = defaults.stringForKey("httpPath") + + systemCall("scp \(tmpName) \(scpPath)\(fileName)") + systemCall("rm \(tmpName)") + + let httpUrl = "\(httpPath)\(fileName)" + systemCall("echo \(httpUrl) | pbcopy") + + return httpUrl + } + + return nil + } + + func systemCall(cmd : String) { + println(cmd) + system(cmd.bridgeToObjectiveC().UTF8String) + } } diff --git a/ScreenshotUpload/Base.lproj/MainMenu.xib b/ScreenshotUpload/Base.lproj/MainMenu.xib index 4afc4d2..d0a2a4c 100644 --- a/ScreenshotUpload/Base.lproj/MainMenu.xib +++ b/ScreenshotUpload/Base.lproj/MainMenu.xib @@ -1,7 +1,7 @@ - + - + @@ -11,8 +11,9 @@ - + + @@ -666,15 +667,104 @@ - - + + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ScreenshotUpload/Images.xcassets/AppIcon.appiconset/Contents.json b/ScreenshotUpload/Images.xcassets/AppIcon.appiconset/Contents.json index 2db2b1c..348342a 100644 --- a/ScreenshotUpload/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/ScreenshotUpload/Images.xcassets/AppIcon.appiconset/Contents.json @@ -21,8 +21,9 @@ "scale" : "2x" }, { - "idiom" : "mac", "size" : "128x128", + "idiom" : "mac", + "filename" : "Screenshot-App-icon.png", "scale" : "1x" }, { diff --git a/ScreenshotUpload/Images.xcassets/AppIcon.appiconset/Screenshot-App-icon.png b/ScreenshotUpload/Images.xcassets/AppIcon.appiconset/Screenshot-App-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6cba06ed0996d8f3b1c269378e10820730685d79 GIT binary patch literal 17579 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 SsHNHf0000CFBundleIconFile CFBundleIdentifier - nu.jabs.apps.ScreenshotUpload.${PRODUCT_NAME:rfc1034identifier} + nu.jabs.apps.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion 6.0 CFBundleName