├── .gitignore ├── AutomatorWorkflow.zip ├── Dictater.swift ├── Dictater.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── xcshareddata │ └── xcschemes │ └── Dictater.xcscheme ├── Dictater.xcworkspace └── contents.xcworkspacedata ├── Dictater ├── AppDelegate.swift ├── Application.swift ├── Assets.xcassets │ └── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── lips_only.png │ │ ├── lips_only512-1.png │ │ └── lips_only512.png ├── Credits.rtf ├── DictaterService.swift ├── DictaterWindow.swift ├── EnableServiceController.swift ├── FontAwesome.otf ├── Info.plist ├── Main.storyboard ├── NSFileManager.swift ├── NSProgressBar+Extensions.swift ├── NSProgressIndicator+Animate.swift ├── NSSpeechSynthesizer.swift ├── NSTextView.swift ├── NSView+backgroundColor.swift ├── Sparkle.framework │ ├── Headers │ ├── Modules │ ├── PrivateHeaders │ ├── Resources │ ├── Sparkle │ └── Versions │ │ ├── A │ │ ├── Headers │ │ │ ├── SUAppcast.h │ │ │ ├── SUAppcastItem.h │ │ │ ├── SUErrors.h │ │ │ ├── SUExport.h │ │ │ ├── SUStandardVersionComparator.h │ │ │ ├── SUUpdater.h │ │ │ ├── SUVersionComparisonProtocol.h │ │ │ ├── SUVersionDisplayProtocol.h │ │ │ └── Sparkle.h │ │ ├── Modules │ │ │ └── module.modulemap │ │ ├── PrivateHeaders │ │ │ └── SUUnarchiver.h │ │ ├── Resources │ │ │ ├── Autoupdate.app │ │ │ │ └── Contents │ │ │ │ │ ├── Info.plist │ │ │ │ │ ├── MacOS │ │ │ │ │ └── Autoupdate │ │ │ │ │ ├── PkgInfo │ │ │ │ │ └── Resources │ │ │ │ │ ├── AppIcon.icns │ │ │ │ │ ├── SUStatus.nib │ │ │ │ │ ├── ar.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ ├── cs.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ ├── da.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ ├── de.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ ├── el.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ ├── en.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ ├── es.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ ├── fr.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ ├── is.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ ├── it.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ ├── ja.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ ├── ko.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ ├── nb.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ ├── nl.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ ├── pl.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ ├── pt_BR.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ ├── pt_PT.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ ├── ro.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ ├── ru.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ ├── sk.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ ├── sl.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ ├── sv.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ ├── th.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ ├── tr.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ ├── uk.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ ├── zh_CN.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ └── zh_TW.lproj │ │ │ │ │ └── Sparkle.strings │ │ │ ├── Info.plist │ │ │ ├── SUModelTranslation.plist │ │ │ ├── SUStatus.nib │ │ │ ├── ar.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ │ └── Sparkle.strings │ │ │ ├── cs.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ │ └── Sparkle.strings │ │ │ ├── da.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ │ └── Sparkle.strings │ │ │ ├── de.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ │ └── Sparkle.strings │ │ │ ├── el.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ │ └── Sparkle.strings │ │ │ ├── en.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ │ └── Sparkle.strings │ │ │ ├── es.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ │ └── Sparkle.strings │ │ │ ├── fr.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ │ └── Sparkle.strings │ │ │ ├── fr_CA.lproj │ │ │ ├── is.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ │ └── Sparkle.strings │ │ │ ├── it.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ │ └── Sparkle.strings │ │ │ ├── ja.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ │ └── Sparkle.strings │ │ │ ├── ko.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ │ └── Sparkle.strings │ │ │ ├── nb.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ │ └── Sparkle.strings │ │ │ ├── nl.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ │ └── Sparkle.strings │ │ │ ├── pl.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ │ └── Sparkle.strings │ │ │ ├── pt.lproj │ │ │ ├── pt_BR.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ │ └── Sparkle.strings │ │ │ ├── pt_PT.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ │ └── Sparkle.strings │ │ │ ├── ro.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ │ └── Sparkle.strings │ │ │ ├── ru.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ │ └── Sparkle.strings │ │ │ ├── sk.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ │ └── Sparkle.strings │ │ │ ├── sl.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ │ └── Sparkle.strings │ │ │ ├── sv.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ │ └── Sparkle.strings │ │ │ ├── th.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ │ └── Sparkle.strings │ │ │ ├── tr.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ │ └── Sparkle.strings │ │ │ ├── uk.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ │ └── Sparkle.strings │ │ │ ├── zh_CN.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ │ └── Sparkle.strings │ │ │ └── zh_TW.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ │ └── Sparkle.strings │ │ └── Sparkle │ │ └── Current ├── Speech.swift ├── SpeechButtonManager.swift ├── Teleprompter.swift ├── TeleprompterPreferencesController.swift ├── TeleprompterTextView.swift ├── TeleprompterWindowDelegate.swift ├── ViewController.swift ├── Vocalization.swift ├── dsa_pub.pem ├── instructions.png ├── logo_small.png └── usage.png ├── DictaterTests ├── DictaterTests.swift └── Info.plist ├── DictaterUITests ├── DictaterUITests.swift └── Info.plist ├── LICENSE ├── Podfile ├── Podfile.lock ├── Pods ├── Manifest.lock ├── Pods.xcodeproj │ └── project.pbxproj ├── ProgressKit │ ├── BaseView.swift │ ├── Determinate │ │ ├── CircularProgressView.swift │ │ ├── DeterminateAnimation.swift │ │ └── ProgressBar.swift │ ├── InDeterminate │ │ ├── CircularSnail.swift │ │ ├── Crawler.swift │ │ ├── IndeterminateAnimation.swift │ │ ├── Rainbow.swift │ │ ├── RotatingArc.swift │ │ ├── ShootingStars.swift │ │ └── Spinner.swift │ ├── LICENSE │ ├── ProgressUtils.swift │ └── README.md └── Target Support Files │ ├── Pods-Dictater │ ├── Info.plist │ ├── Pods-Dictater-acknowledgements.markdown │ ├── Pods-Dictater-acknowledgements.plist │ ├── Pods-Dictater-dummy.m │ ├── Pods-Dictater-frameworks.sh │ ├── Pods-Dictater-resources.sh │ ├── Pods-Dictater-umbrella.h │ ├── Pods-Dictater.debug.xcconfig │ ├── Pods-Dictater.modulemap │ └── Pods-Dictater.release.xcconfig │ └── ProgressKit │ ├── Info.plist │ ├── ProgressKit-dummy.m │ ├── ProgressKit-prefix.pch │ ├── ProgressKit-umbrella.h │ ├── ProgressKit.modulemap │ └── ProgressKit.xcconfig ├── README.md ├── Updates └── AppCast.xml ├── example.png └── teleprompter.png /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | build/ 4 | *.pbxuser 5 | !default.pbxuser 6 | *.mode1v3 7 | !default.mode1v3 8 | *.mode2v3 9 | !default.mode2v3 10 | *.perspectivev3 11 | !default.perspectivev3 12 | xcuserdata 13 | *.xccheckout 14 | *.moved-aside 15 | DerivedData 16 | *.hmap 17 | *.ipa 18 | *.xcuserstate 19 | 20 | # CocoaPods 21 | # 22 | # We recommend against adding the Pods directory to your .gitignore. However 23 | # you should judge for yourself, the pros and cons are mentioned at: 24 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 25 | # 26 | #Pods/ 27 | 28 | Updates/generate_appcast_item.php 29 | -------------------------------------------------------------------------------- /AutomatorWorkflow.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/AutomatorWorkflow.zip -------------------------------------------------------------------------------- /Dictater.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Dictater.swift 3 | // Dictater 4 | // 5 | // Created by Kyle Carson on 9/2/15. 6 | // Copyright © 2015 Kyle Carson. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Cocoa 11 | 12 | class Dictater 13 | { 14 | enum PreferenceKeys : String 15 | { 16 | case SkipBoundary = "skipBoundary" 17 | case HasBeenUsed = "hasBeenUsed" 18 | case FontName = "fontName" 19 | case FontSize = "fontSize" 20 | case LineHeightMultiple = "lineHeightMultiple" 21 | case ProgressBarEnabled = "progressBarEnabled" 22 | case AutoScrollEnabled = "autoScrollEnabled" 23 | } 24 | 25 | static let TextAppearanceChangedNotification = "Dictater.FontChanged" 26 | 27 | static func setupDefaults() 28 | { 29 | let font = self.defaultFont 30 | UserDefaults.standard.register( 31 | defaults: [ 32 | PreferenceKeys.SkipBoundary.rawValue : Speech.Boundary.Sentence.rawValue, 33 | PreferenceKeys.HasBeenUsed.rawValue : false, 34 | PreferenceKeys.FontName.rawValue : font.fontName, 35 | PreferenceKeys.FontSize.rawValue : Double(font.pointSize), 36 | PreferenceKeys.LineHeightMultiple.rawValue : 1.2, 37 | PreferenceKeys.ProgressBarEnabled.rawValue : true, 38 | PreferenceKeys.AutoScrollEnabled.rawValue : true, 39 | ]) 40 | } 41 | 42 | static var skipBoundary : Speech.Boundary 43 | { 44 | get 45 | { 46 | let rawValue = UserDefaults.standard.integer(forKey: PreferenceKeys.SkipBoundary.rawValue) 47 | if let boundary = Speech.Boundary(rawValue: rawValue) 48 | { 49 | return boundary 50 | } 51 | return .Sentence 52 | } 53 | set 54 | { 55 | UserDefaults.standard.set(newValue.rawValue, forKey: PreferenceKeys.SkipBoundary.rawValue) 56 | } 57 | } 58 | 59 | static var hasBeenUsed : Bool 60 | { 61 | get 62 | { 63 | return UserDefaults.standard.bool(forKey: PreferenceKeys.HasBeenUsed.rawValue) 64 | } 65 | set 66 | { 67 | UserDefaults.standard.set(newValue, forKey: PreferenceKeys.HasBeenUsed.rawValue) 68 | } 69 | } 70 | 71 | static var autoScrollEnabled : Bool 72 | { 73 | get 74 | { 75 | return UserDefaults.standard.bool(forKey: PreferenceKeys.AutoScrollEnabled.rawValue) 76 | } 77 | set 78 | { 79 | UserDefaults.standard.set(newValue, forKey: PreferenceKeys.AutoScrollEnabled.rawValue) 80 | } 81 | } 82 | 83 | static var isProgressBarEnabled : Bool 84 | { 85 | get { 86 | return UserDefaults.standard.bool(forKey: PreferenceKeys.ProgressBarEnabled.rawValue) 87 | } 88 | set 89 | { 90 | UserDefaults.standard.set(newValue, forKey: PreferenceKeys.ProgressBarEnabled.rawValue) 91 | } 92 | } 93 | 94 | static var font : NSFont 95 | { 96 | let cgfloat = CGFloat(self.fontSize) 97 | return NSFont(name: self.fontName, size: cgfloat) ?? self.defaultFont 98 | } 99 | 100 | static var defaultFont : NSFont 101 | { 102 | return NSFont.messageFont(ofSize: 14) 103 | } 104 | 105 | 106 | static var fontName : String 107 | { 108 | get { 109 | if let string = UserDefaults.standard.string(forKey: PreferenceKeys.FontName.rawValue) 110 | { 111 | return string 112 | } else { 113 | return self.defaultFont.fontName 114 | } 115 | } 116 | 117 | set { 118 | UserDefaults.standard.set(newValue, forKey: PreferenceKeys.FontName.rawValue) 119 | NotificationCenter.default.post(name: NSNotification.Name(rawValue: self.TextAppearanceChangedNotification), object: nil) 120 | } 121 | } 122 | 123 | static var fontSize : Int 124 | { 125 | get { 126 | return UserDefaults.standard.integer(forKey: PreferenceKeys.FontSize.rawValue) 127 | } 128 | 129 | set { 130 | UserDefaults.standard.set(newValue, forKey: PreferenceKeys.FontSize.rawValue) 131 | NotificationCenter.default.post(name: NSNotification.Name(rawValue: self.TextAppearanceChangedNotification), object: nil) 132 | } 133 | } 134 | 135 | static var lineHeightMultiple : Double 136 | { 137 | get { 138 | return UserDefaults.standard.double(forKey: PreferenceKeys.LineHeightMultiple.rawValue) 139 | } 140 | 141 | set { 142 | UserDefaults.standard.set(newValue, forKey: PreferenceKeys.LineHeightMultiple.rawValue) 143 | NotificationCenter.default.post(name: NSNotification.Name(rawValue: self.TextAppearanceChangedNotification), object: nil) 144 | } 145 | } 146 | 147 | class ParagraphStyle : NSParagraphStyle 148 | { 149 | let multiple = Dictater.lineHeightMultiple 150 | override var lineHeightMultiple : CGFloat 151 | { 152 | return CGFloat(self.multiple) 153 | } 154 | } 155 | 156 | } 157 | -------------------------------------------------------------------------------- /Dictater.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Dictater.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Dictater.xcodeproj/xcshareddata/xcschemes/Dictater.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 43 | 49 | 50 | 51 | 52 | 53 | 63 | 65 | 71 | 72 | 73 | 74 | 80 | 82 | 88 | 89 | 90 | 91 | 93 | 94 | 97 | 98 | 99 | -------------------------------------------------------------------------------- /Dictater.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Dictater/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // Dictate Assist 4 | // 5 | // Created by Kyle Carson on 9/1/15. 6 | // Copyright © 2015 Kyle Carson. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | @NSApplicationMain 12 | class AppDelegate: NSObject, NSApplicationDelegate { 13 | 14 | func applicationDidFinishLaunching(_ notification: Notification) { 15 | NSApp.servicesProvider = DictaterService() 16 | 17 | if !Dictater.hasBeenUsed 18 | { 19 | self.openHowToUseWindow() 20 | } 21 | 22 | let args = ProcessInfo.processInfo.arguments 23 | var skip = false 24 | 25 | for arg in args[ 1 ..< args.count ] 26 | { 27 | if skip 28 | { 29 | skip = false 30 | continue 31 | } 32 | 33 | if arg.hasPrefix("-") 34 | { 35 | skip = true 36 | continue 37 | } 38 | 39 | Speech.sharedSpeech.speak( text: arg ) 40 | break 41 | } 42 | } 43 | 44 | func applicationWillTerminate(aNotification: NSNotification) { 45 | Speech.sharedSpeech.pause() 46 | } 47 | 48 | var howToUseController : NSWindowController? 49 | 50 | func openHowToUseWindow() 51 | { 52 | if let sb = NSApplication.shared.windows.first?.windowController?.storyboard, 53 | let controller = sb.instantiateController(withIdentifier: "howToUse") as? NSWindowController 54 | { 55 | controller.showWindow(self) 56 | self.howToUseController = controller 57 | controller.window?.becomeKey() 58 | controller.window?.becomeMain() 59 | } 60 | } 61 | } 62 | 63 | -------------------------------------------------------------------------------- /Dictater/Application.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Application.swift 3 | // Dictater 4 | // 5 | // Created by Kyle Carson on 9/3/15. 6 | // Copyright © 2015 Kyle Carson. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Cocoa 11 | 12 | class Application : NSApplication 13 | { 14 | 15 | } -------------------------------------------------------------------------------- /Dictater/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "mac", 5 | "size" : "16x16", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "mac", 10 | "size" : "16x16", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "mac", 15 | "size" : "32x32", 16 | "scale" : "1x" 17 | }, 18 | { 19 | "idiom" : "mac", 20 | "size" : "32x32", 21 | "scale" : "2x" 22 | }, 23 | { 24 | "idiom" : "mac", 25 | "size" : "128x128", 26 | "scale" : "1x" 27 | }, 28 | { 29 | "idiom" : "mac", 30 | "size" : "128x128", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "idiom" : "mac", 35 | "size" : "256x256", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "size" : "256x256", 40 | "idiom" : "mac", 41 | "filename" : "lips_only512.png", 42 | "scale" : "2x" 43 | }, 44 | { 45 | "size" : "512x512", 46 | "idiom" : "mac", 47 | "filename" : "lips_only512-1.png", 48 | "scale" : "1x" 49 | }, 50 | { 51 | "size" : "512x512", 52 | "idiom" : "mac", 53 | "filename" : "lips_only.png", 54 | "scale" : "2x" 55 | } 56 | ], 57 | "info" : { 58 | "version" : 1, 59 | "author" : "xcode" 60 | } 61 | } -------------------------------------------------------------------------------- /Dictater/Assets.xcassets/AppIcon.appiconset/lips_only.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Assets.xcassets/AppIcon.appiconset/lips_only.png -------------------------------------------------------------------------------- /Dictater/Assets.xcassets/AppIcon.appiconset/lips_only512-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Assets.xcassets/AppIcon.appiconset/lips_only512-1.png -------------------------------------------------------------------------------- /Dictater/Assets.xcassets/AppIcon.appiconset/lips_only512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Assets.xcassets/AppIcon.appiconset/lips_only512.png -------------------------------------------------------------------------------- /Dictater/Credits.rtf: -------------------------------------------------------------------------------- 1 | {\rtf1\ansi\ansicpg1252\cocoartf1348\cocoasubrtf170 2 | {\fonttbl\f0\fswiss\fcharset0 Helvetica;} 3 | {\colortbl;\red255\green255\blue255;} 4 | \margl1440\margr1440\vieww9000\viewh8400\viewkind0 5 | \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural 6 | 7 | \f0\fs24 \cf0 Font Icons from {\field{\*\fldinst{HYPERLINK "http://fontawesome.io"}}{\fldrslt Font Awesome}}\ 8 | \ 9 | \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural 10 | {\field{\*\fldinst{HYPERLINK "https://nosrac.github.io/Dictater/"}}{\fldrslt \cf0 Dictater Website}}} 11 | -------------------------------------------------------------------------------- /Dictater/DictaterService.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DictaterService.swift 3 | // Dictater 4 | // 5 | // Created by Kyle Carson on 9/3/15. 6 | // Copyright © 2015 Kyle Carson. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Cocoa 11 | 12 | public class DictaterService 13 | { 14 | @objc func beginDicatation(_ pboard: NSPasteboard, userData: NSString, error: NSErrorPointer) 15 | { 16 | if let string = pboard.string(forType: NSPasteboard.PasteboardType.string) 17 | { 18 | Speech.sharedSpeech.speak( text: string ) 19 | Dictater.hasBeenUsed = true 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Dictater/DictaterWindow.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DictateAssistWindow.swift 3 | // Dictate Assist 4 | // 5 | // Created by Kyle Carson on 9/1/15. 6 | // Copyright © 2015 Kyle Carson. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Cocoa 11 | 12 | class DictaterWindow : NSWindow 13 | { 14 | override init(contentRect: NSRect, styleMask style: NSWindow.StyleMask, backing backingStoreType: NSWindow.BackingStoreType, defer flag: Bool) { 15 | super.init(contentRect: contentRect, styleMask: style, backing: backingStoreType, defer: flag) 16 | 17 | // self.styleMask = NSBorderlessWindowMask 18 | self.isOpaque = false 19 | self.backgroundColor = NSColor.clear 20 | self.level = NSWindow.Level.floating 21 | 22 | NotificationCenter.default.addObserver(self, selector: #selector(self.didEnterFullScreen), name: NSNotification.Name(rawValue: TeleprompterWindowDelegate.FullScreenEnteredEvent), object: nil) 23 | NotificationCenter.default.addObserver(self, selector: #selector(self.didExitFullScreen), name: NSNotification.Name(rawValue: TeleprompterWindowDelegate.FullScreenExitedEvent), object: nil) 24 | } 25 | 26 | @objc func didEnterFullScreen() 27 | { 28 | self.orderOut(self) 29 | } 30 | 31 | @objc func didExitFullScreen() 32 | { 33 | self.orderFront(self) 34 | } 35 | 36 | // required init?(coder: NSCoder) { 37 | // super.init(coder: coder) 38 | // } 39 | 40 | override var contentView : NSView? { 41 | set { 42 | if let view = newValue 43 | { 44 | view.wantsLayer = true 45 | view.layer?.frame = view.frame 46 | view.layer?.cornerRadius = 6.0 47 | view.layer?.masksToBounds = true 48 | } 49 | super.contentView = newValue 50 | 51 | } 52 | get { 53 | return super.contentView 54 | } 55 | } 56 | 57 | override var canBecomeMain : Bool 58 | { 59 | get { 60 | return true 61 | } 62 | } 63 | 64 | override var canBecomeKey : Bool 65 | { 66 | get { 67 | return true 68 | } 69 | } 70 | 71 | // Drag Windows 72 | 73 | var initialLocation : NSPoint? 74 | 75 | override func mouseDown(with event: NSEvent) { 76 | initialLocation = event.locationInWindow 77 | } 78 | 79 | override func mouseDragged(with event: NSEvent) { 80 | if let screenVisibleFrame = NSScreen.main?.visibleFrame, 81 | let initialLocation = self.initialLocation 82 | { 83 | let windowFrame = self.frame 84 | var newOrigin = windowFrame.origin 85 | 86 | let currentLocation = event.locationInWindow 87 | 88 | newOrigin.x += (currentLocation.x - initialLocation.x) 89 | newOrigin.y += (currentLocation.y - initialLocation.y) 90 | 91 | if (newOrigin.y + windowFrame.size.height) > (screenVisibleFrame.origin.y + screenVisibleFrame.size.height) 92 | { 93 | newOrigin.y = screenVisibleFrame.origin.y + screenVisibleFrame.size.height - windowFrame.size.height 94 | } 95 | 96 | self.setFrameOrigin(newOrigin) 97 | } 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /Dictater/EnableServiceController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EnableServiceController.swift 3 | // Dictater 4 | // 5 | // Created by Kyle Carson on 9/4/15. 6 | // Copyright © 2015 Kyle Carson. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Cocoa 11 | 12 | class EnableServiceController : NSViewController 13 | { 14 | @IBAction func openKeyboardSettings(sender: AnyObject?) 15 | { 16 | NSWorkspace.shared.openFile("/System/Library/PreferencePanes/Keyboard.prefPane") 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Dictater/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/FontAwesome.otf -------------------------------------------------------------------------------- /Dictater/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ATSApplicationFontsPath 6 | 7 | CFBundleDevelopmentRegion 8 | en 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIconFile 12 | 13 | CFBundleIdentifier 14 | $(PRODUCT_BUNDLE_IDENTIFIER) 15 | CFBundleInfoDictionaryVersion 16 | 6.0 17 | CFBundleName 18 | $(PRODUCT_NAME) 19 | CFBundlePackageType 20 | APPL 21 | CFBundleShortVersionString 22 | 1.2 23 | CFBundleSignature 24 | ???? 25 | CFBundleVersion 26 | 1.2 27 | SUPublicDSAKeyFile 28 | dsa_pub.pem 29 | LSMinimumSystemVersion 30 | $(MACOSX_DEPLOYMENT_TARGET) 31 | LSUIElement 32 | 33 | NSHumanReadableCopyright 34 | Copyright © 2015 Kyle Carson (@kyleacarson). All rights reserved. 35 | NSMainStoryboardFile 36 | Main 37 | NSPrincipalClass 38 | Dictater.Application 39 | SUFeedURL 40 | https://raw.githubusercontent.com/Nosrac/Dictater/master/Updates/AppCast.xml 41 | NSServices 42 | 43 | 44 | NSMenuItem 45 | 46 | default 47 | Dictate 48 | 49 | NSMessage 50 | beginDicatation 51 | NSSendTypes 52 | 53 | NSStringPboardType 54 | 55 | 56 | 57 | UIAppFonts 58 | 59 | FontAwesome.otf 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /Dictater/NSFileManager.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FileManager.swift 3 | // Converter Box 4 | // 5 | // Created by Kyle Carson on 9/15/15. 6 | // Copyright © 2015 Kyle Carson. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | extension FileManager 12 | { 13 | func directoryExistsAtPath (path : String) -> Bool 14 | { 15 | var isDirectory : ObjCBool = false 16 | if self.fileExists(atPath: path, isDirectory: &isDirectory) 17 | { 18 | return isDirectory.boolValue 19 | } else { 20 | return false 21 | } 22 | } 23 | 24 | func getTemporaryFile(fileExtension : String = "rand") -> String? 25 | { 26 | var tempDir = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).first! 27 | 28 | if let identifier = Bundle.main.bundleIdentifier 29 | { 30 | tempDir = "\(tempDir)/\(identifier)/" 31 | } 32 | 33 | do 34 | { 35 | try FileManager.default.createDirectory(atPath: tempDir, withIntermediateDirectories: true, attributes: nil) 36 | 37 | var filename : String? 38 | 39 | while filename == nil 40 | { 41 | filename = "\(tempDir)/\(arc4random()).\(fileExtension)" 42 | 43 | if FileManager.default.fileExists(atPath: filename!) 44 | { 45 | filename = nil 46 | } else { 47 | do 48 | { 49 | try "".write(toFile: filename!, atomically: true, encoding: String.Encoding.utf8) 50 | } catch { 51 | filename = nil 52 | } 53 | } 54 | } 55 | 56 | return filename 57 | } catch { 58 | return nil 59 | } 60 | } 61 | 62 | func getMimeType(file file: String) -> String? 63 | { 64 | if !FileManager.default.fileExists(atPath: file) 65 | { 66 | return nil 67 | } 68 | 69 | if file.hasSuffix(".epub") 70 | { 71 | return "application/epub+zip" 72 | } 73 | 74 | let nsstringFile : NSString = file as NSString 75 | 76 | if let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, nsstringFile.pathExtension as CFString, nil)?.takeRetainedValue() 77 | { 78 | if let mimeType = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType) 79 | { 80 | return mimeType.takeRetainedValue() as String 81 | } 82 | } 83 | 84 | return "application/octet-stream"; 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /Dictater/NSProgressBar+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NSProgressBar+Extensions.swift 3 | // Dictater 4 | // 5 | // Created by Kyle Carson on 1/25/16. 6 | // Copyright © 2016 Kyle Carson. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | extension Progress 12 | { 13 | var percent : Double { 14 | guard self.totalUnitCount != 0 else { 15 | return 0 16 | } 17 | 18 | return Double(self.completedUnitCount) / Double(self.totalUnitCount) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Dictater/NSProgressIndicator+Animate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NSProgressIndicator+Animate.swift 3 | // Dictater 4 | // 5 | // Adapted by Kyle Carson on 9/3/15. 6 | // Created by Matthias Gansrigler on 06.05.2015. 7 | // Copyright (c) 2015 Eternal Storms Software. All rights reserved. 8 | // 9 | 10 | import Foundation 11 | import Cocoa 12 | 13 | class ESSProgressBarAnimation : NSAnimation 14 | { 15 | let indicator : NSProgressIndicator 16 | let initialValue : Double 17 | let newValue : Double 18 | 19 | init(_ progressIndicator: NSProgressIndicator, newValue: Double) 20 | { 21 | self.indicator = progressIndicator 22 | self.initialValue = progressIndicator.doubleValue 23 | self.newValue = newValue 24 | 25 | super.init(duration: 0.2, animationCurve: .easeIn) 26 | self.animationBlockingMode = .nonblockingThreaded 27 | } 28 | 29 | required init?(coder aDecoder: NSCoder) { 30 | 31 | indicator = NSProgressIndicator() 32 | initialValue = 0 33 | newValue = 0 34 | 35 | super.init(coder: aDecoder) 36 | } 37 | 38 | override var currentProgress : NSAnimation.Progress 39 | { 40 | didSet { 41 | let delta = self.newValue - self.initialValue 42 | 43 | self.indicator.doubleValue = self.initialValue + (delta * Double(currentProgress)) 44 | } 45 | } 46 | } 47 | 48 | extension NSProgressIndicator 49 | { 50 | func animateToDoubleValue(value: Double) -> NSAnimation 51 | { 52 | let animation = ESSProgressBarAnimation(self, newValue: value) 53 | animation.start() 54 | return animation 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /Dictater/NSSpeechSynthesizer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SpeechTimer.swift 3 | // Dictater 4 | // 5 | // Created by Kyle Carson on 9/24/15. 6 | // Copyright © 2015 Kyle Carson. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Cocoa 11 | 12 | extension NSSpeechSynthesizer 13 | { 14 | func getSpeechDuration(string: String, callback: @escaping ((_ duration: TimeInterval) -> ())) 15 | { 16 | let timer = NSSpeechSynthesizerTimer(text: string, synthesizer: self) 17 | timer.finished = { 18 | if let duration = timer.duration 19 | { 20 | callback(duration) 21 | } 22 | } 23 | timer.start() 24 | } 25 | } 26 | 27 | class NSSpeechSynthesizerTimer : NSObject, NSSpeechSynthesizerDelegate 28 | { 29 | let synthesizer : NSSpeechSynthesizer 30 | let text : String 31 | 32 | var duration : TimeInterval? 33 | 34 | var finished : (() -> ())? 35 | 36 | private var tempFile : String? 37 | 38 | init(text: String, synthesizer: NSSpeechSynthesizer? = nil) 39 | { 40 | self.text = text 41 | self.synthesizer = synthesizer ?? NSSpeechSynthesizer() 42 | } 43 | 44 | func start() -> Bool 45 | { 46 | if let tempFile = FileManager.default.getTemporaryFile( fileExtension: "AIFF"), 47 | let synthesizer = NSSpeechSynthesizer(voice: self.synthesizer.voice()) 48 | { 49 | synthesizer.rate = self.synthesizer.rate 50 | synthesizer.delegate = self 51 | synthesizer.startSpeaking(self.text, to: URL(fileURLWithPath: tempFile)) 52 | 53 | self.tempFile = tempFile 54 | return true 55 | } 56 | return false 57 | } 58 | 59 | func speechSynthesizer(_ sender: NSSpeechSynthesizer, didFinishSpeaking finishedSpeaking: Bool) 60 | { 61 | guard let tempFile = self.tempFile else { 62 | return 63 | } 64 | 65 | if let sound = NSSound(contentsOfFile: tempFile, byReference: false) 66 | { 67 | self.duration = sound.duration 68 | self.finished?() 69 | } 70 | try! FileManager.default.removeItem(atPath: tempFile) 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /Dictater/NSTextView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NSTextView.swift 3 | // Dictater 4 | // 5 | // Created by Kyle Carson on 9/14/15. 6 | // Copyright © 2015 Kyle Carson. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Cocoa 11 | 12 | extension NSTextView 13 | { 14 | // Tweaked from http://lists.apple.com/archives/cocoa-dev/2005/Jun/msg01909.html 15 | var visibleRange : NSRange 16 | { 17 | guard let scrollView = self.enclosingScrollView else { 18 | return NSRange() 19 | } 20 | guard let layoutManager = self.layoutManager else { 21 | return NSRange() 22 | } 23 | guard let textContainer = self.textContainer else { 24 | return NSRange() 25 | } 26 | 27 | var rect = scrollView.documentVisibleRect 28 | rect.origin.x -= self.textContainerOrigin.x 29 | rect.origin.y -= self.textContainerOrigin.y 30 | 31 | if let paragraphStyle = self.defaultParagraphStyle, 32 | let font = self.font 33 | { 34 | rect.size.height -= paragraphStyle.lineHeightMultiple * font.pointSize 35 | } 36 | 37 | 38 | let glyphRange = layoutManager.glyphRange(forBoundingRect: rect, in: textContainer) 39 | let charRange = layoutManager.characterRange(forGlyphRange: glyphRange, actualGlyphRange: nil) 40 | 41 | return charRange 42 | } 43 | 44 | func scrollRangeToVisible(range: NSRange, smart: Bool = false) 45 | { 46 | if !smart 47 | { 48 | super.scrollRangeToVisible(range) 49 | return 50 | } 51 | 52 | let visibleRange = self.visibleRange 53 | 54 | if visibleRange.location <= range.location && range.location < (visibleRange.location + visibleRange.length) 55 | { 56 | // Do Nothing 57 | } else { 58 | self.scrollRangeToVisible(range) 59 | } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Dictater/NSView+backgroundColor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NSView+backgroundColor.swift 3 | // Dictate Assist 4 | // 5 | // Parts from http://stackoverflow.com/a/31461380 6 | // 7 | 8 | import Foundation 9 | import Cocoa 10 | 11 | @IBDesignable 12 | extension NSView 13 | { 14 | @IBInspectable var backgroundColor: NSColor? { 15 | get { 16 | if let colorRef = self.layer?.backgroundColor { 17 | return NSColor(cgColor: colorRef) 18 | } else { 19 | return nil 20 | } 21 | } 22 | set { 23 | self.wantsLayer = true 24 | self.layer?.backgroundColor = newValue?.cgColor 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Headers: -------------------------------------------------------------------------------- 1 | Versions/Current/Headers -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Modules: -------------------------------------------------------------------------------- 1 | Versions/Current/Modules -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/PrivateHeaders: -------------------------------------------------------------------------------- 1 | Versions/Current/PrivateHeaders -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Resources: -------------------------------------------------------------------------------- 1 | Versions/Current/Resources -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Sparkle: -------------------------------------------------------------------------------- 1 | Versions/Current/Sparkle -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Headers/SUAppcast.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUAppcast.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 3/12/06. 6 | // Copyright 2006 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUAPPCAST_H 10 | #define SUAPPCAST_H 11 | 12 | #import 13 | #import "SUExport.h" 14 | 15 | @class SUAppcastItem; 16 | SU_EXPORT @interface SUAppcast : NSObject 17 | 18 | @property (copy) NSString *userAgentString; 19 | @property (copy) NSDictionary *httpHeaders; 20 | 21 | - (void)fetchAppcastFromURL:(NSURL *)url completionBlock:(void (^)(NSError *))err; 22 | 23 | @property (readonly, copy) NSArray *items; 24 | @end 25 | 26 | #endif 27 | -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUAppcastItem.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 3/12/06. 6 | // Copyright 2006 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUAPPCASTITEM_H 10 | #define SUAPPCASTITEM_H 11 | 12 | #import 13 | #import "SUExport.h" 14 | 15 | SU_EXPORT @interface SUAppcastItem : NSObject 16 | @property (copy, readonly) NSString *title; 17 | @property (copy, readonly) NSDate *date; 18 | @property (copy, readonly) NSString *itemDescription; 19 | @property (strong, readonly) NSURL *releaseNotesURL; 20 | @property (copy, readonly) NSString *DSASignature; 21 | @property (copy, readonly) NSString *minimumSystemVersion; 22 | @property (copy, readonly) NSString *maximumSystemVersion; 23 | @property (strong, readonly) NSURL *fileURL; 24 | @property (copy, readonly) NSString *versionString; 25 | @property (copy, readonly) NSString *displayVersionString; 26 | @property (copy, readonly) NSDictionary *deltaUpdates; 27 | @property (strong, readonly) NSURL *infoURL; 28 | 29 | // Initializes with data from a dictionary provided by the RSS class. 30 | - (instancetype)initWithDictionary:(NSDictionary *)dict; 31 | - (instancetype)initWithDictionary:(NSDictionary *)dict failureReason:(NSString **)error; 32 | 33 | @property (getter=isDeltaUpdate, readonly) BOOL deltaUpdate; 34 | @property (getter=isCriticalUpdate, readonly) BOOL criticalUpdate; 35 | 36 | // Returns the dictionary provided in initWithDictionary; this might be useful later for extensions. 37 | @property (readonly, copy) NSDictionary *propertiesDictionary; 38 | 39 | - (NSURL *)infoURL; 40 | 41 | @end 42 | 43 | #endif 44 | -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Headers/SUErrors.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUErrors.h 3 | // Sparkle 4 | // 5 | // Created by C.W. Betts on 10/13/14. 6 | // Copyright (c) 2014 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #ifndef SUERRORS_H 10 | #define SUERRORS_H 11 | 12 | #import 13 | #import "SUExport.h" 14 | 15 | /** 16 | * Error domain used by Sparkle 17 | */ 18 | SU_EXPORT extern NSString *const SUSparkleErrorDomain; 19 | 20 | typedef NS_ENUM(OSStatus, SUError) { 21 | // Appcast phase errors. 22 | SUAppcastParseError = 1000, 23 | SUNoUpdateError = 1001, 24 | SUAppcastError = 1002, 25 | SURunningFromDiskImageError = 1003, 26 | 27 | // Downlaod phase errors. 28 | SUTemporaryDirectoryError = 2000, 29 | 30 | // Extraction phase errors. 31 | SUUnarchivingError = 3000, 32 | SUSignatureError = 3001, 33 | 34 | // Installation phase errors. 35 | SUFileCopyFailure = 4000, 36 | SUAuthenticationFailure = 4001, 37 | SUMissingUpdateError = 4002, 38 | SUMissingInstallerToolError = 4003, 39 | SURelaunchError = 4004, 40 | SUInstallationError = 4005, 41 | SUDowngradeError = 4006 42 | }; 43 | 44 | #endif 45 | -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Headers/SUExport.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUExport.h 3 | // Sparkle 4 | // 5 | // Created by Jake Petroules on 2014-08-23. 6 | // Copyright (c) 2014 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #ifndef SUEXPORT_H 10 | #define SUEXPORT_H 11 | 12 | #ifdef BUILDING_SPARKLE 13 | #define SU_EXPORT __attribute__((visibility("default"))) 14 | #else 15 | #define SU_EXPORT 16 | #endif 17 | 18 | #endif 19 | -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Headers/SUStandardVersionComparator.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUStandardVersionComparator.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 12/21/07. 6 | // Copyright 2007 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUSTANDARDVERSIONCOMPARATOR_H 10 | #define SUSTANDARDVERSIONCOMPARATOR_H 11 | 12 | #import 13 | #import "SUExport.h" 14 | #import "SUVersionComparisonProtocol.h" 15 | 16 | /*! 17 | Sparkle's default version comparator. 18 | 19 | This comparator is adapted from MacPAD, by Kevin Ballard. 20 | It's "dumb" in that it does essentially string comparison, 21 | in components split by character type. 22 | */ 23 | SU_EXPORT @interface SUStandardVersionComparator : NSObject 24 | 25 | /*! 26 | Returns a singleton instance of the comparator. 27 | */ 28 | + (SUStandardVersionComparator *)defaultComparator; 29 | 30 | /*! 31 | Compares version strings through textual analysis. 32 | 33 | See the implementation for more details. 34 | */ 35 | - (NSComparisonResult)compareVersion:(NSString *)versionA toVersion:(NSString *)versionB; 36 | @end 37 | 38 | #endif 39 | -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Headers/SUUpdater.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUUpdater.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 1/4/06. 6 | // Copyright 2006 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUUPDATER_H 10 | #define SUUPDATER_H 11 | 12 | #import 13 | #import "SUExport.h" 14 | #import "SUVersionComparisonProtocol.h" 15 | #import "SUVersionDisplayProtocol.h" 16 | 17 | @class SUUpdateDriver, SUAppcastItem, SUHost, SUAppcast; 18 | 19 | @protocol SUUpdaterDelegate; 20 | 21 | /*! 22 | The main API in Sparkle for controlling the update mechanism. 23 | 24 | This class is used to configure the update paramters as well as manually 25 | and automatically schedule and control checks for updates. 26 | */ 27 | SU_EXPORT @interface SUUpdater : NSObject 28 | 29 | @property (unsafe_unretained) IBOutlet id delegate; 30 | 31 | + (SUUpdater *)sharedUpdater; 32 | + (SUUpdater *)updaterForBundle:(NSBundle *)bundle; 33 | - (instancetype)initForBundle:(NSBundle *)bundle; 34 | 35 | @property (readonly, strong) NSBundle *hostBundle; 36 | @property (strong, readonly) NSBundle *sparkleBundle; 37 | 38 | @property BOOL automaticallyChecksForUpdates; 39 | 40 | @property NSTimeInterval updateCheckInterval; 41 | 42 | /*! 43 | * The URL of the appcast used to download update information. 44 | * 45 | * This property must be called on the main thread. 46 | */ 47 | @property (copy) NSURL *feedURL; 48 | 49 | @property (nonatomic, copy) NSString *userAgentString; 50 | 51 | @property (copy) NSDictionary *httpHeaders; 52 | 53 | @property BOOL sendsSystemProfile; 54 | 55 | @property BOOL automaticallyDownloadsUpdates; 56 | 57 | /*! 58 | Explicitly checks for updates and displays a progress dialog while doing so. 59 | 60 | This method is meant for a main menu item. 61 | Connect any menu item to this action in Interface Builder, 62 | and Sparkle will check for updates and report back its findings verbosely 63 | when it is invoked. 64 | */ 65 | - (IBAction)checkForUpdates:(id)sender; 66 | 67 | /*! 68 | Checks for updates, but does not display any UI unless an update is found. 69 | 70 | This is meant for programmatically initating a check for updates. That is, 71 | it will display no UI unless it actually finds an update, in which case it 72 | proceeds as usual. 73 | 74 | If the fully automated updating is turned on, however, this will invoke that 75 | behavior, and if an update is found, it will be downloaded and prepped for 76 | installation. 77 | */ 78 | - (void)checkForUpdatesInBackground; 79 | 80 | /*! 81 | Returns the date of last update check. 82 | 83 | \returns \c nil if no check has been performed. 84 | */ 85 | @property (readonly, copy) NSDate *lastUpdateCheckDate; 86 | 87 | /*! 88 | Begins a "probing" check for updates which will not actually offer to 89 | update to that version. 90 | 91 | However, the delegate methods 92 | SUUpdaterDelegate::updater:didFindValidUpdate: and 93 | SUUpdaterDelegate::updaterDidNotFindUpdate: will be called, 94 | so you can use that information in your UI. 95 | */ 96 | - (void)checkForUpdateInformation; 97 | 98 | /*! 99 | Appropriately schedules or cancels the update checking timer according to 100 | the preferences for time interval and automatic checks. 101 | 102 | This call does not change the date of the next check, 103 | but only the internal NSTimer. 104 | */ 105 | - (void)resetUpdateCycle; 106 | 107 | @property (readonly) BOOL updateInProgress; 108 | 109 | @end 110 | 111 | // ----------------------------------------------------------------------------- 112 | // SUUpdater Notifications for events that might be interesting to more than just the delegate 113 | // The updater will be the notification object 114 | // ----------------------------------------------------------------------------- 115 | SU_EXPORT extern NSString *const SUUpdaterDidFinishLoadingAppCastNotification; 116 | SU_EXPORT extern NSString *const SUUpdaterDidFindValidUpdateNotification; 117 | SU_EXPORT extern NSString *const SUUpdaterDidNotFindUpdateNotification; 118 | SU_EXPORT extern NSString *const SUUpdaterWillRestartNotification; 119 | #define SUUpdaterWillRelaunchApplicationNotification SUUpdaterWillRestartNotification; 120 | #define SUUpdaterWillInstallUpdateNotification SUUpdaterWillRestartNotification; 121 | 122 | // Key for the SUAppcastItem object in the SUUpdaterDidFindValidUpdateNotification userInfo 123 | SU_EXPORT extern NSString *const SUUpdaterAppcastItemNotificationKey; 124 | // Key for the SUAppcast object in the SUUpdaterDidFinishLoadingAppCastNotification userInfo 125 | SU_EXPORT extern NSString *const SUUpdaterAppcastNotificationKey; 126 | 127 | // ----------------------------------------------------------------------------- 128 | // SUUpdater Delegate: 129 | // ----------------------------------------------------------------------------- 130 | 131 | /*! 132 | Provides methods to control the behavior of an SUUpdater object. 133 | */ 134 | @protocol SUUpdaterDelegate 135 | @optional 136 | 137 | /*! 138 | Returns whether to allow Sparkle to pop up. 139 | 140 | For example, this may be used to prevent Sparkle from interrupting a setup assistant. 141 | 142 | \param updater The SUUpdater instance. 143 | */ 144 | - (BOOL)updaterMayCheckForUpdates:(SUUpdater *)updater; 145 | 146 | /*! 147 | Returns additional parameters to append to the appcast URL's query string. 148 | 149 | This is potentially based on whether or not Sparkle will also be sending along the system profile. 150 | 151 | \param updater The SUUpdater instance. 152 | \param sendingProfile Whether the system profile will also be sent. 153 | 154 | \return An array of dictionaries with keys: "key", "value", "displayKey", "displayValue", the latter two being specifically for display to the user. 155 | */ 156 | - (NSArray *)feedParametersForUpdater:(SUUpdater *)updater sendingSystemProfile:(BOOL)sendingProfile; 157 | 158 | /*! 159 | Returns a custom appcast URL. 160 | 161 | Override this to dynamically specify the entire URL. 162 | 163 | \param updater The SUUpdater instance. 164 | */ 165 | - (NSString *)feedURLStringForUpdater:(SUUpdater *)updater; 166 | 167 | /*! 168 | Returns whether Sparkle should prompt the user about automatic update checks. 169 | 170 | Use this to override the default behavior. 171 | 172 | \param updater The SUUpdater instance. 173 | */ 174 | - (BOOL)updaterShouldPromptForPermissionToCheckForUpdates:(SUUpdater *)updater; 175 | 176 | /*! 177 | Called after Sparkle has downloaded the appcast from the remote server. 178 | 179 | Implement this if you want to do some special handling with the appcast once it finishes loading. 180 | 181 | \param updater The SUUpdater instance. 182 | \param appcast The appcast that was downloaded from the remote server. 183 | */ 184 | - (void)updater:(SUUpdater *)updater didFinishLoadingAppcast:(SUAppcast *)appcast; 185 | 186 | /*! 187 | Returns the item in the appcast corresponding to the update that should be installed. 188 | 189 | If you're using special logic or extensions in your appcast, 190 | implement this to use your own logic for finding a valid update, if any, 191 | in the given appcast. 192 | 193 | \param appcast The appcast that was downloaded from the remote server. 194 | \param updater The SUUpdater instance. 195 | */ 196 | - (SUAppcastItem *)bestValidUpdateInAppcast:(SUAppcast *)appcast forUpdater:(SUUpdater *)updater; 197 | 198 | /*! 199 | Called when a valid update is found by the update driver. 200 | 201 | \param updater The SUUpdater instance. 202 | \param item The appcast item corresponding to the update that is proposed to be installed. 203 | */ 204 | - (void)updater:(SUUpdater *)updater didFindValidUpdate:(SUAppcastItem *)item; 205 | 206 | /*! 207 | Called when a valid update is not found. 208 | 209 | \param updater The SUUpdater instance. 210 | */ 211 | - (void)updaterDidNotFindUpdate:(SUUpdater *)updater; 212 | 213 | /*! 214 | Called immediately before downloading the specified update. 215 | 216 | \param updater The SUUpdater instance. 217 | \param item The appcast item corresponding to the update that is proposed to be downloaded. 218 | \param request The mutable URL request that will be used to download the update. 219 | */ 220 | - (void)updater:(SUUpdater *)updater willDownloadUpdate:(SUAppcastItem *)item withRequest:(NSMutableURLRequest *)request; 221 | 222 | /*! 223 | Called after the specified update failed to download. 224 | 225 | \param updater The SUUpdater instance. 226 | \param item The appcast item corresponding to the update that failed to download. 227 | \param error The error generated by the failed download. 228 | */ 229 | - (void)updater:(SUUpdater *)updater failedToDownloadUpdate:(SUAppcastItem *)item error:(NSError *)error; 230 | 231 | /*! 232 | Called immediately before installing the specified update. 233 | 234 | \param updater The SUUpdater instance. 235 | \param item The appcast item corresponding to the update that is proposed to be installed. 236 | */ 237 | - (void)updater:(SUUpdater *)updater willInstallUpdate:(SUAppcastItem *)item; 238 | 239 | /*! 240 | Returns whether the relaunch should be delayed in order to perform other tasks. 241 | 242 | This is not called if the user didn't relaunch on the previous update, 243 | in that case it will immediately restart. 244 | 245 | \param updater The SUUpdater instance. 246 | \param item The appcast item corresponding to the update that is proposed to be installed. 247 | \param invocation The invocation that must be completed before continuing with the relaunch. 248 | 249 | \return \c YES to delay the relaunch until \p invocation is invoked. 250 | */ 251 | - (BOOL)updater:(SUUpdater *)updater shouldPostponeRelaunchForUpdate:(SUAppcastItem *)item untilInvoking:(NSInvocation *)invocation; 252 | 253 | /*! 254 | Returns whether the application should be relaunched at all. 255 | 256 | Some apps \b cannot be relaunched under certain circumstances. 257 | This method can be used to explicitly prevent a relaunch. 258 | 259 | \param updater The SUUpdater instance. 260 | */ 261 | - (BOOL)updaterShouldRelaunchApplication:(SUUpdater *)updater; 262 | 263 | /*! 264 | Called immediately before relaunching. 265 | 266 | \param updater The SUUpdater instance. 267 | */ 268 | - (void)updaterWillRelaunchApplication:(SUUpdater *)updater; 269 | 270 | /*! 271 | Returns an object that compares version numbers to determine their arithmetic relation to each other. 272 | 273 | This method allows you to provide a custom version comparator. 274 | If you don't implement this method or return \c nil, 275 | the standard version comparator will be used. 276 | 277 | \sa SUStandardVersionComparator 278 | 279 | \param updater The SUUpdater instance. 280 | */ 281 | - (id)versionComparatorForUpdater:(SUUpdater *)updater; 282 | 283 | /*! 284 | Returns an object that formats version numbers for display to the user. 285 | 286 | If you don't implement this method or return \c nil, 287 | the standard version formatter will be used. 288 | 289 | \sa SUUpdateAlert 290 | 291 | \param updater The SUUpdater instance. 292 | */ 293 | - (id)versionDisplayerForUpdater:(SUUpdater *)updater; 294 | 295 | /*! 296 | Returns the path which is used to relaunch the client after the update is installed. 297 | 298 | The default is the path of the host bundle. 299 | 300 | \param updater The SUUpdater instance. 301 | */ 302 | - (NSString *)pathToRelaunchForUpdater:(SUUpdater *)updater; 303 | 304 | /*! 305 | Called before an updater shows a modal alert window, 306 | to give the host the opportunity to hide attached windows that may get in the way. 307 | 308 | \param updater The SUUpdater instance. 309 | */ 310 | - (void)updaterWillShowModalAlert:(SUUpdater *)updater; 311 | 312 | /*! 313 | Called after an updater shows a modal alert window, 314 | to give the host the opportunity to hide attached windows that may get in the way. 315 | 316 | \param updater The SUUpdater instance. 317 | */ 318 | - (void)updaterDidShowModalAlert:(SUUpdater *)updater; 319 | 320 | /*! 321 | Called when an update is scheduled to be silently installed on quit. 322 | 323 | \param updater The SUUpdater instance. 324 | \param item The appcast item corresponding to the update that is proposed to be installed. 325 | \param invocation Can be used to trigger an immediate silent install and relaunch. 326 | */ 327 | - (void)updater:(SUUpdater *)updater willInstallUpdateOnQuit:(SUAppcastItem *)item immediateInstallationInvocation:(NSInvocation *)invocation; 328 | 329 | /*! 330 | Calls after an update that was scheduled to be silently installed on quit has been canceled. 331 | 332 | \param updater The SUUpdater instance. 333 | \param item The appcast item corresponding to the update that was proposed to be installed. 334 | */ 335 | - (void)updater:(SUUpdater *)updater didCancelInstallUpdateOnQuit:(SUAppcastItem *)item; 336 | 337 | /*! 338 | Called after an update is aborted due to an error. 339 | 340 | \param updater The SUUpdater instance. 341 | \param error The error that caused the abort 342 | */ 343 | - (void)updater:(SUUpdater *)updater didAbortWithError:(NSError *)error; 344 | 345 | @end 346 | 347 | #endif 348 | -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUVersionComparisonProtocol.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 12/21/07. 6 | // Copyright 2007 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUVERSIONCOMPARISONPROTOCOL_H 10 | #define SUVERSIONCOMPARISONPROTOCOL_H 11 | 12 | #import 13 | #import "SUExport.h" 14 | 15 | /*! 16 | Provides version comparison facilities for Sparkle. 17 | */ 18 | @protocol SUVersionComparison 19 | 20 | /*! 21 | An abstract method to compare two version strings. 22 | 23 | Should return NSOrderedAscending if b > a, NSOrderedDescending if b < a, 24 | and NSOrderedSame if they are equivalent. 25 | */ 26 | - (NSComparisonResult)compareVersion:(NSString *)versionA toVersion:(NSString *)versionB; // *** MAY BE CALLED ON NON-MAIN THREAD! 27 | 28 | @end 29 | 30 | #endif 31 | -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Headers/SUVersionDisplayProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUVersionDisplayProtocol.h 3 | // EyeTV 4 | // 5 | // Created by Uli Kusterer on 08.12.09. 6 | // Copyright 2009 Elgato Systems GmbH. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "SUExport.h" 11 | 12 | /*! 13 | Applies special display formatting to version numbers. 14 | */ 15 | @protocol SUVersionDisplay 16 | 17 | /*! 18 | Formats two version strings. 19 | 20 | Both versions are provided so that important distinguishing information 21 | can be displayed while also leaving out unnecessary/confusing parts. 22 | */ 23 | - (void)formatVersion:(NSString **)inOutVersionA andVersion:(NSString **)inOutVersionB; 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Headers/Sparkle.h: -------------------------------------------------------------------------------- 1 | // 2 | // Sparkle.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 3/16/06. (Modified by CDHW on 23/12/07) 6 | // Copyright 2006 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SPARKLE_H 10 | #define SPARKLE_H 11 | 12 | #import 13 | 14 | // This list should include the shared headers. It doesn't matter if some of them aren't shared (unless 15 | // there are name-space collisions) so we can list all of them to start with: 16 | 17 | #import 18 | #import 19 | #import 20 | #import 21 | #import 22 | #import 23 | #import 24 | 25 | #endif 26 | -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module Sparkle { 2 | umbrella header "Sparkle.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/PrivateHeaders/SUUnarchiver.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUUnarchiver.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 3/16/06. 6 | // Copyright 2006 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUUNARCHIVER_H 10 | #define SUUNARCHIVER_H 11 | 12 | #import 13 | 14 | @class SUHost; 15 | @protocol SUUnarchiverDelegate; 16 | 17 | @interface SUUnarchiver : NSObject 18 | 19 | @property (copy, readonly) NSString *archivePath; 20 | @property (copy, readonly) NSString *updateHostBundlePath; 21 | @property (weak) id delegate; 22 | 23 | + (SUUnarchiver *)unarchiverForPath:(NSString *)path updatingHostBundlePath:(NSString *)host; 24 | 25 | - (void)start; 26 | @end 27 | 28 | @protocol SUUnarchiverDelegate 29 | - (void)unarchiverDidFinish:(SUUnarchiver *)unarchiver; 30 | - (void)unarchiverDidFail:(SUUnarchiver *)unarchiver; 31 | @optional 32 | - (void)unarchiver:(SUUnarchiver *)unarchiver extractedProgress:(double)progress; 33 | @end 34 | 35 | #endif 36 | -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildMachineOSBuild 6 | 15A244d 7 | CFBundleDevelopmentRegion 8 | English 9 | CFBundleExecutable 10 | Autoupdate 11 | CFBundleIconFile 12 | AppIcon 13 | CFBundleIdentifier 14 | org.sparkle-project.Sparkle.Autoupdate 15 | CFBundleInfoDictionaryVersion 16 | 6.0 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.11.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleSupportedPlatforms 24 | 25 | MacOSX 26 | 27 | CFBundleVersion 28 | 1.11.0 29 | DTCompiler 30 | com.apple.compilers.llvm.clang.1_0 31 | DTPlatformBuild 32 | 7A176x 33 | DTPlatformVersion 34 | GM 35 | DTSDKBuild 36 | 15A244e 37 | DTSDKName 38 | macosx10.11 39 | DTXcode 40 | 0700 41 | DTXcodeBuild 42 | 7A176x 43 | LSBackgroundOnly 44 | 1 45 | LSMinimumSystemVersion 46 | 10.7 47 | LSUIElement 48 | 1 49 | NSMainNibFile 50 | MainMenu 51 | NSPrincipalClass 52 | NSApplication 53 | 54 | 55 | -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/MacOS/Autoupdate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/MacOS/Autoupdate -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/PkgInfo: -------------------------------------------------------------------------------- 1 | APPL???? -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/AppIcon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/AppIcon.icns -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/SUStatus.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/SUStatus.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ar.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ar.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/cs.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/cs.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/da.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/da.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/de.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/de.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/el.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/el.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/en.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/en.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/es.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/es.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/fr.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/fr.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/is.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/is.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/it.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/it.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ja.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ja.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ko.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ko.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/nb.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/nb.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/nl.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/nl.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/pl.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/pl.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/pt_BR.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/pt_BR.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/pt_PT.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/pt_PT.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ro.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ro.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ru.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/ru.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/sk.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/sk.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/sl.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/sl.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/sv.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/sv.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/th.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/th.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/tr.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/tr.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/uk.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/uk.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/zh_CN.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/zh_CN.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/zh_TW.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/zh_TW.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildMachineOSBuild 6 | 15A244d 7 | CFBundleDevelopmentRegion 8 | en 9 | CFBundleExecutable 10 | Sparkle 11 | CFBundleIdentifier 12 | org.andymatuschak.Sparkle 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | Sparkle 17 | CFBundlePackageType 18 | FMWK 19 | CFBundleShortVersionString 20 | 1.11.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleSupportedPlatforms 24 | 25 | MacOSX 26 | 27 | CFBundleVersion 28 | 1.11.0 29 | DTCompiler 30 | com.apple.compilers.llvm.clang.1_0 31 | DTPlatformBuild 32 | 7A176x 33 | DTPlatformVersion 34 | GM 35 | DTSDKBuild 36 | 15A244e 37 | DTSDKName 38 | macosx10.11 39 | DTXcode 40 | 0700 41 | DTXcodeBuild 42 | 7A176x 43 | 44 | 45 | -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/SUModelTranslation.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ADP2,1 6 | Developer Transition Kit 7 | iMac1,1 8 | iMac G3 (Rev A-D) 9 | iMac4,1 10 | iMac (Core Duo) 11 | iMac4,2 12 | iMac for Education (17 inch, Core Duo) 13 | iMac5,1 14 | iMac (Core 2 Duo, 17 or 20 inch, SuperDrive) 15 | iMac5,2 16 | iMac (Core 2 Duo, 17 inch, Combo Drive) 17 | iMac6,1 18 | iMac (Core 2 Duo, 24 inch, SuperDrive) 19 | iMac8,1 20 | iMac (Core 2 Duo, 20 or 24 inch, Early 2008 ) 21 | iMac9,1 22 | iMac (Core 2 Duo, 20 or 24 inch, Early or Mid 2009 ) 23 | iMac10,1 24 | iMac (Core 2 Duo, 21.5 or 27 inch, Late 2009 ) 25 | iMac11,1 26 | iMac (Core i5 or i7, 27 inch Late 2009) 27 | iMac11,2 28 | iMac (Core i3 or i5, 27 inch Mid 2010) 29 | iMac11,3 30 | iMac (Core i5 or i7, 27 inch Mid 2010) 31 | iMac12,1 32 | iMac (Core i3 or i5 or i7, 21.5 inch Mid 2010 or Late 2011) 33 | iMac12,2 34 | iMac (Core i5 or i7, 27 inch Mid 2011) 35 | iMac13,1 36 | iMac (Core i3 or i5 or i7, 21.5 inch Late 2012 or Early 2013) 37 | iMac13,2 38 | iMac (Core i5 or i7, 27 inch Late 2012) 39 | iMac14,1 40 | iMac (Core i5, 21.5 inch Late 2013) 41 | iMac14,2 42 | iMac (Core i5 or i7, 27 inch Late 2013) 43 | iMac14,3 44 | iMac (Core i5 or i7, 21.5 inch Late 2013) 45 | MacBook1,1 46 | MacBook (Core Duo) 47 | MacBook2,1 48 | MacBook (Core 2 Duo) 49 | MacBook4,1 50 | MacBook (Core 2 Duo Feb 2008) 51 | MacBook5,1 52 | MacBook (Core 2 Duo, Late 2008, Unibody) 53 | MacBook5,2 54 | MacBook (Core 2 Duo, Early 2009, White) 55 | MacBook6,1 56 | MacBook (Core 2 Duo, Late 2009, Unibody) 57 | MacBook7,1 58 | MacBook (Core 2 Duo, Mid 2010, White) 59 | MacBookAir1,1 60 | MacBook Air (Core 2 Duo, 13 inch, Early 2008) 61 | MacBookAir2,1 62 | MacBook Air (Core 2 Duo, 13 inch, Mid 2009) 63 | MacBookAir3,1 64 | MacBook Air (Core 2 Duo, 11 inch, Late 2010) 65 | MacBookAir3,2 66 | MacBook Air (Core 2 Duo, 13 inch, Late 2010) 67 | MacBookAir4,1 68 | MacBook Air (Core i5 or i7, 11 inch, Mid 2011) 69 | MacBookAir4,2 70 | MacBook Air (Core i5 or i7, 13 inch, Mid 2011) 71 | MacBookAir5,1 72 | MacBook Air (Core i5 or i7, 11 inch, Mid 2012) 73 | MacBookAir5,2 74 | MacBook Air (Core i5 or i7, 13 inch, Mid 2012) 75 | MacBookAir6,1 76 | MacBook Air (Core i5 or i7, 11 inch, Mid 2013 or Early 2014) 77 | MacBookAir6,2 78 | MacBook Air (Core i5 or i7, 13 inch, Mid 2013 or Early 2014) 79 | MacBookPro1,1 80 | MacBook Pro Core Duo (15-inch) 81 | MacBookPro1,2 82 | MacBook Pro Core Duo (17-inch) 83 | MacBookPro2,1 84 | MacBook Pro Core 2 Duo (17-inch) 85 | MacBookPro2,2 86 | MacBook Pro Core 2 Duo (15-inch) 87 | MacBookPro3,1 88 | MacBook Pro Core 2 Duo (15-inch LED, Core 2 Duo) 89 | MacBookPro3,2 90 | MacBook Pro Core 2 Duo (17-inch HD, Core 2 Duo) 91 | MacBookPro4,1 92 | MacBook Pro (Core 2 Duo Feb 2008) 93 | Macmini1,1 94 | Mac Mini (Core Solo/Duo) 95 | MacPro1,1 96 | Mac Pro (four-core) 97 | MacPro2,1 98 | Mac Pro (eight-core) 99 | MacPro3,1 100 | Mac Pro (January 2008 4- or 8- core "Harpertown") 101 | MacPro4,1 102 | Mac Pro (March 2009) 103 | MacPro5,1 104 | Mac Pro (August 2010) 105 | PowerBook1,1 106 | PowerBook G3 107 | PowerBook2,1 108 | iBook G3 109 | PowerBook2,2 110 | iBook G3 (FireWire) 111 | PowerBook2,3 112 | iBook G3 113 | PowerBook2,4 114 | iBook G3 115 | PowerBook3,1 116 | PowerBook G3 (FireWire) 117 | PowerBook3,2 118 | PowerBook G4 119 | PowerBook3,3 120 | PowerBook G4 (Gigabit Ethernet) 121 | PowerBook3,4 122 | PowerBook G4 (DVI) 123 | PowerBook3,5 124 | PowerBook G4 (1GHz / 867MHz) 125 | PowerBook4,1 126 | iBook G3 (Dual USB, Late 2001) 127 | PowerBook4,2 128 | iBook G3 (16MB VRAM) 129 | PowerBook4,3 130 | iBook G3 Opaque 16MB VRAM, 32MB VRAM, Early 2003) 131 | PowerBook5,1 132 | PowerBook G4 (17 inch) 133 | PowerBook5,2 134 | PowerBook G4 (15 inch FW 800) 135 | PowerBook5,3 136 | PowerBook G4 (17-inch 1.33GHz) 137 | PowerBook5,4 138 | PowerBook G4 (15 inch 1.5/1.33GHz) 139 | PowerBook5,5 140 | PowerBook G4 (17-inch 1.5GHz) 141 | PowerBook5,6 142 | PowerBook G4 (15 inch 1.67GHz/1.5GHz) 143 | PowerBook5,7 144 | PowerBook G4 (17-inch 1.67GHz) 145 | PowerBook5,8 146 | PowerBook G4 (Double layer SD, 15 inch) 147 | PowerBook5,9 148 | PowerBook G4 (Double layer SD, 17 inch) 149 | PowerBook6,1 150 | PowerBook G4 (12 inch) 151 | PowerBook6,2 152 | PowerBook G4 (12 inch, DVI) 153 | PowerBook6,3 154 | iBook G4 155 | PowerBook6,4 156 | PowerBook G4 (12 inch 1.33GHz) 157 | PowerBook6,5 158 | iBook G4 (Early-Late 2004) 159 | PowerBook6,7 160 | iBook G4 (Mid 2005) 161 | PowerBook6,8 162 | PowerBook G4 (12 inch 1.5GHz) 163 | PowerMac1,1 164 | Power Macintosh G3 (Blue & White) 165 | PowerMac1,2 166 | Power Macintosh G4 (PCI Graphics) 167 | PowerMac10,1 168 | Mac Mini G4 169 | PowerMac10,2 170 | Mac Mini (Late 2005) 171 | PowerMac11,2 172 | Power Macintosh G5 (Late 2005) 173 | PowerMac12,1 174 | iMac G5 (iSight) 175 | PowerMac2,1 176 | iMac G3 (Slot-loading CD-ROM) 177 | PowerMac2,2 178 | iMac G3 (Summer 2000) 179 | PowerMac3,1 180 | Power Macintosh G4 (AGP Graphics) 181 | PowerMac3,2 182 | Power Macintosh G4 (AGP Graphics) 183 | PowerMac3,3 184 | Power Macintosh G4 (Gigabit Ethernet) 185 | PowerMac3,4 186 | Power Macintosh G4 (Digital Audio) 187 | PowerMac3,5 188 | Power Macintosh G4 (Quick Silver) 189 | PowerMac3,6 190 | Power Macintosh G4 (Mirrored Drive Door) 191 | PowerMac4,1 192 | iMac G3 (Early/Summer 2001) 193 | PowerMac4,2 194 | iMac G4 (Flat Panel) 195 | PowerMac4,4 196 | eMac 197 | PowerMac4,5 198 | iMac G4 (17-inch Flat Panel) 199 | PowerMac5,1 200 | Power Macintosh G4 Cube 201 | PowerMac6,1 202 | iMac G4 (USB 2.0) 203 | PowerMac6,3 204 | iMac G4 (20-inch Flat Panel) 205 | PowerMac6,4 206 | eMac (USB 2.0, 2005) 207 | PowerMac7,2 208 | Power Macintosh G5 209 | PowerMac7,3 210 | Power Macintosh G5 211 | PowerMac8,1 212 | iMac G5 213 | PowerMac8,2 214 | iMac G5 (Ambient Light Sensor) 215 | PowerMac9,1 216 | Power Macintosh G5 (Late 2005) 217 | RackMac1,1 218 | Xserve G4 219 | RackMac1,2 220 | Xserve G4 (slot-loading, cluster node) 221 | RackMac3,1 222 | Xserve G5 223 | Xserve1,1 224 | Xserve (Intel Xeon) 225 | Xserve2,1 226 | Xserve (January 2008 quad-core) 227 | 228 | 229 | -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/SUStatus.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/SUStatus.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/ar.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/ar.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/ar.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/ar.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/ar.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/ar.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/ar.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/ar.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/cs.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/cs.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/cs.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/cs.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/cs.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/da.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/da.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/da.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/da.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/da.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/el.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/el.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/el.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/el.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/el.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/el.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/el.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/el.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/en.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/fr_CA.lproj: -------------------------------------------------------------------------------- 1 | fr.lproj -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/is.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/is.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/is.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/is.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/is.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/it.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/it.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/ja.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/ja.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/ja.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/ja.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/ja.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/ko.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/ko.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/ko.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/ko.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/ko.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/nb.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/nb.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/nb.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/nb.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/nb.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/nb.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/nb.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/nb.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/nl.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/nl.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/nl.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/nl.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/pl.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/pl.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/pl.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/pl.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/pl.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/pt.lproj: -------------------------------------------------------------------------------- 1 | pt_BR.lproj -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/pt_BR.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/pt_PT.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/ro.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/ro.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/ro.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/ro.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/ro.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/ro.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/ro.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/ro.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/ru.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/ru.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/ru.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/ru.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/sk.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/sk.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/sk.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/sk.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/sk.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/sl.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/sl.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/sl.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/sl.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/sl.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/sv.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/sv.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/sv.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/sv.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/th.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/th.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/th.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/th.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/th.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/tr.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/tr.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/tr.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/tr.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/tr.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/uk.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/uk.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/uk.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/uk.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/uk.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdatePermissionPrompt.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdatePermissionPrompt.nib -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/A/Sparkle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/Sparkle.framework/Versions/A/Sparkle -------------------------------------------------------------------------------- /Dictater/Sparkle.framework/Versions/Current: -------------------------------------------------------------------------------- 1 | A -------------------------------------------------------------------------------- /Dictater/Speech.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Speech.siwft.swift 3 | // Dictater 4 | // 5 | // Created by Kyle Carson on 9/4/15. 6 | // Copyright © 2015 Kyle Carson. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Cocoa 11 | 12 | class Speech 13 | { 14 | class Controls 15 | { 16 | let speech : Speech 17 | 18 | init(speech: Speech) 19 | { 20 | self.speech = speech 21 | } 22 | 23 | static let PauseIcon = "" 24 | static let PlayIcon = "" 25 | 26 | var canPlayPause : Bool 27 | { 28 | if let _ = Speech.sharedSpeech.vocalization 29 | { 30 | return true 31 | } else { 32 | return false 33 | } 34 | } 35 | 36 | var playPauseIcon : String 37 | { 38 | if let vocalization = self.speech.vocalization, vocalization.isSpeaking 39 | { 40 | return Controls.PauseIcon 41 | } else { 42 | return Controls.PlayIcon 43 | } 44 | } 45 | 46 | var canSkipForward : Bool 47 | { 48 | guard let vocalization = Speech.sharedSpeech.vocalization else { 49 | return false 50 | } 51 | 52 | if vocalization.didFinish 53 | { 54 | return false 55 | } else { 56 | return true 57 | } 58 | } 59 | 60 | var canSkipBackwards : Bool 61 | { 62 | if let _ = Speech.sharedSpeech.vocalization 63 | { 64 | return true 65 | } else { 66 | return false 67 | } 68 | } 69 | 70 | var canOpenTeleprompter : Bool 71 | { 72 | if let _ = Speech.sharedSpeech.vocalization 73 | { 74 | return true 75 | } else { 76 | return false 77 | } 78 | } 79 | 80 | static var sharedControls : Controls 81 | { 82 | return Controls(speech: Speech.sharedSpeech) 83 | } 84 | } 85 | 86 | static var sharedSpeech : Speech = 87 | { 88 | return Speech() 89 | }() 90 | 91 | var text = "" 92 | 93 | var vocalization : Vocalization? 94 | var totalDuration : TimeInterval? 95 | { 96 | didSet { 97 | NotificationCenter.default.post(name: NSNotification.Name(rawValue: Speech.TotalDurationChangedNotification), object: self) 98 | } 99 | } 100 | 101 | var estimatedProgressSeconds : TimeInterval? 102 | { 103 | guard let totalDuration = self.totalDuration else { 104 | return nil 105 | } 106 | 107 | let progress = self.progress 108 | 109 | return Double(progress.completedUnitCount) / Double(progress.totalUnitCount) * totalDuration 110 | } 111 | 112 | func speak(text : String) 113 | { 114 | self.totalDuration = nil 115 | self.text = text 116 | self.speak(fromIndex: 0) 117 | 118 | if let vocalization = self.vocalization 119 | { 120 | vocalization.synthesizer.getSpeechDuration(string: self.text) 121 | { (duration) in 122 | self.totalDuration = duration 123 | } 124 | } 125 | } 126 | 127 | enum Boundary : Int 128 | { 129 | case Sentence = 1 130 | case Paragraph = 100 131 | 132 | var name : String { 133 | if self == .Sentence 134 | { 135 | return "Sentence" 136 | } else { 137 | return "Paragraph" 138 | } 139 | } 140 | 141 | var enumerationOption : NSString.EnumerationOptions 142 | { 143 | if self == .Sentence 144 | { 145 | return .bySentences 146 | } else { 147 | return .byParagraphs 148 | } 149 | } 150 | } 151 | 152 | static let ProgressChangedNotification = "Speech.ProgressChangedNotification" 153 | static let TotalDurationChangedNotification = "Speech.TotalDurationChangedNotification" 154 | 155 | var progress : Progress 156 | { 157 | let progress = Progress() 158 | if let range = self.range 159 | { 160 | progress.totalUnitCount = Int64(text.count) 161 | progress.completedUnitCount = Int64(range.location) 162 | } 163 | return progress 164 | } 165 | 166 | var range : NSRange? 167 | { 168 | get { 169 | 170 | if let vocalization = vocalization, 171 | let currentRange = vocalization.currentRange 172 | { 173 | return NSRange( 174 | location: currentRange.location + self.skipOffset, 175 | length: currentRange.length 176 | ) 177 | } else { 178 | return nil 179 | } 180 | } 181 | } 182 | private var skipOffset : Int = 0 183 | 184 | 185 | @objc func progressDidChange() 186 | { 187 | NotificationCenter.default.post(name: NSNotification.Name(rawValue: Speech.ProgressChangedNotification), object: self) 188 | } 189 | 190 | private func speak(fromIndex index: Int) 191 | { 192 | if let vocalization = self.vocalization 193 | { 194 | NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: Vocalization.ProgressChangedNotification), object: vocalization) 195 | 196 | vocalization.pause() 197 | self.vocalization = nil 198 | } 199 | 200 | var effectiveIndex = index 201 | 202 | if (effectiveIndex < 0) 203 | { 204 | effectiveIndex = 0 205 | } 206 | 207 | let vocalization : Vocalization 208 | let nsstring = NSString(string: self.text).substring(from: effectiveIndex) 209 | 210 | vocalization = Vocalization( String(nsstring) ) 211 | 212 | NotificationCenter.default.addObserver(self, selector: #selector(self.progressDidChange), name: NSNotification.Name(rawValue: Vocalization.ProgressChangedNotification), object: vocalization) 213 | 214 | self.vocalization = vocalization 215 | self.skipOffset = index 216 | 217 | vocalization.start() 218 | } 219 | 220 | func playPause() 221 | { 222 | if let vocalization = vocalization 223 | { 224 | if vocalization.isSpeaking 225 | { 226 | self.pause() 227 | } else { 228 | self.play() 229 | } 230 | } 231 | } 232 | 233 | func pause() 234 | { 235 | if let vocalization = vocalization 236 | { 237 | if vocalization.isSpeaking 238 | { 239 | vocalization.pause() 240 | } 241 | } 242 | } 243 | 244 | func play() 245 | { 246 | if let vocalization = vocalization 247 | { 248 | if !vocalization.isSpeaking 249 | { 250 | if vocalization.didFinish 251 | { 252 | self.speak(fromIndex: 0) 253 | } else { 254 | vocalization.continueSpeaking() 255 | } 256 | } 257 | } 258 | } 259 | 260 | func skip(by boundary: Speech.Boundary, forward: Bool = true) 261 | { 262 | var options = boundary.enumerationOption 263 | let currentRange = self.range ?? NSRange() 264 | let currentLocation = currentRange.location 265 | 266 | let vocalization = self.vocalization 267 | 268 | let range : NSRange 269 | var index : Int? 270 | var skip : Bool = true 271 | 272 | let paused : Bool 273 | if let vocalization = vocalization 274 | { 275 | paused = !vocalization.isSpeaking 276 | } else { 277 | paused = false 278 | } 279 | 280 | if forward 281 | { 282 | range = NSRange(location: currentLocation, length: self.text.count - currentLocation) 283 | } else { 284 | // TODO: Maybe a bug here? 285 | options = options.union(.reverse) 286 | 287 | range = NSRange(location: 0, length: currentLocation) 288 | } 289 | 290 | NSString(string: self.text).enumerateSubstrings(in: range, options: options, using: { (substring, substringRange, enclosingRange, stop) -> Void in 291 | guard let substring = substring, substring.count > 0 else { 292 | return 293 | } 294 | 295 | if let _ = index 296 | { 297 | return 298 | } 299 | 300 | if skip 301 | { 302 | skip = false 303 | 304 | return 305 | } 306 | 307 | index = substringRange.location 308 | }) 309 | 310 | if index == nil 311 | { 312 | if forward 313 | { 314 | index = self.text.count 315 | } else { 316 | index = 0 317 | } 318 | } 319 | 320 | if let index = index 321 | { 322 | self.speak(fromIndex: index) 323 | 324 | if paused 325 | { 326 | self.pause() 327 | } 328 | } else { 329 | print("Shoo") 330 | } 331 | 332 | } 333 | 334 | 335 | } 336 | -------------------------------------------------------------------------------- /Dictater/SpeechButtonManager.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SpeechButtonManager.swift 3 | // Dictater 4 | // 5 | // Created by Kyle Carson on 9/11/15. 6 | // Copyright © 2015 Kyle Carson. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Cocoa 11 | //import ProgressKit 12 | 13 | class SpeechButtonManager : NSObject 14 | { 15 | // weak var progressView : ProgressBar? 16 | weak var playPauseButton : NSButton? 17 | weak var skipForwardButton : NSButton? 18 | weak var skipBackwardsButton : NSButton? 19 | weak var openTeleprompterButton : NSButton? 20 | weak var remainingTimeView : NSTextField? 21 | 22 | 23 | let speech : Speech 24 | let controls : Speech.Controls 25 | 26 | init(speech: Speech) 27 | { 28 | self.speech = speech 29 | self.controls = Speech.Controls(speech: speech) 30 | 31 | super.init() 32 | } 33 | 34 | var progressAnimation : NSAnimation? 35 | 36 | func registerEvents() 37 | { 38 | NotificationCenter.default.addObserver(self, selector: #selector(SpeechButtonManager.update), name: NSNotification.Name(rawValue: Speech.ProgressChangedNotification), object: speech) 39 | NotificationCenter.default.addObserver(self, selector: #selector(SpeechButtonManager.update), name: NSNotification.Name(rawValue: Speech.TotalDurationChangedNotification), object: speech) 40 | NotificationCenter.default.addObserver(self, selector: #selector(SpeechButtonManager.update), name: NSNotification.Name(rawValue: Vocalization.IsSpeakingChangedNotification), object: nil) 41 | 42 | self.playPauseButton?.target = self 43 | self.playPauseButton?.action = #selector(SpeechButtonManager.playPause) 44 | 45 | self.skipForwardButton?.target = self 46 | self.skipForwardButton?.action = #selector(SpeechButtonManager.skipAhead) 47 | 48 | self.skipBackwardsButton?.target = self 49 | self.skipBackwardsButton?.action = #selector(SpeechButtonManager.skipBackwards) 50 | } 51 | 52 | func deregisterEvents() 53 | { 54 | NotificationCenter.default.removeObserver(self) 55 | } 56 | 57 | @objc func update() 58 | { 59 | // self.playPauseButton?.image = self.controls.playPauseIcon 60 | 61 | self.playPauseButton?.isEnabled = self.controls.canPlayPause 62 | self.skipBackwardsButton?.isEnabled = self.controls.canSkipBackwards 63 | self.skipForwardButton?.isEnabled = self.controls.canSkipForward 64 | self.openTeleprompterButton?.isEnabled = self.controls.canOpenTeleprompter 65 | 66 | self.skipBackwardsButton?.menu = self.backwardsButtonMenu() 67 | 68 | // if let progressBar = self.progressView 69 | // { 70 | // if progressBar.hidden 71 | // { 72 | // progressBar.animated = false 73 | // progressBar.progress = 0 74 | // progressBar.animated = true 75 | // } 76 | // 77 | // progressBar.progress = CGFloat(speech.progress.percent) 78 | // if self.speech.vocalization == nil || speech.progress.percent == 1 79 | // { 80 | // progressBar.hidden = true 81 | // } else { 82 | // progressBar.hidden = false 83 | // } 84 | // } 85 | 86 | if let duration = self.totalDurationText, 87 | let view = self.remainingTimeView, 88 | let vocalization = self.speech.vocalization, !vocalization.didFinish 89 | { 90 | view.stringValue = duration 91 | view.isHidden = false 92 | 93 | if view.alphaValue == 0 94 | { 95 | view.animator().alphaValue = 1.0 96 | } 97 | } else { 98 | self.remainingTimeView?.alphaValue = 0.0 99 | } 100 | } 101 | 102 | var totalDurationText : String? 103 | { 104 | guard let duration = self.speech.totalDuration else { 105 | return nil 106 | } 107 | guard let progressSeconds = self.speech.estimatedProgressSeconds else { 108 | return nil 109 | } 110 | 111 | let minutes = (duration - progressSeconds) / 60 112 | if minutes < 1 113 | { 114 | return "< 1m left" 115 | } else { 116 | return "\(Int(ceil(minutes)))m left" 117 | } 118 | 119 | } 120 | 121 | func backwardsButtonMenu() -> NSMenu 122 | { 123 | let menu = NSMenu(); 124 | let restartButton = NSMenuItem(title: "Restart", action: #selector(SpeechButtonManager.restart), keyEquivalent: "") 125 | if self.controls.canSkipBackwards 126 | { 127 | restartButton.target = self 128 | } 129 | 130 | menu.addItem(restartButton) 131 | 132 | return menu 133 | } 134 | 135 | @objc func restart() 136 | { 137 | self.speech.speak( text: self.speech.text ) 138 | } 139 | 140 | @objc func playPause() 141 | { 142 | self.speech.playPause() 143 | } 144 | 145 | @objc func skipAhead() 146 | { 147 | self.speech.skip(by: Dictater.skipBoundary) 148 | } 149 | 150 | @objc func skipBackwards() 151 | { 152 | self.speech.skip(by: .Sentence, forward: false) 153 | } 154 | } 155 | -------------------------------------------------------------------------------- /Dictater/Teleprompter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Teleprompter.swift 3 | // Dictater 4 | // 5 | // Created by Kyle Carson on 9/6/15. 6 | // Copyright © 2015 Kyle Carson. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Cocoa 11 | //import ProgressKit 12 | 13 | class Teleprompter : NSViewController, NSWindowDelegate 14 | { 15 | @IBOutlet var textView : TeleprompterTextView? 16 | @IBOutlet var playPauseButton : NSButton? 17 | @IBOutlet var skipBackwardsButton : NSButton? 18 | @IBOutlet var skipForwardButton : NSButton? 19 | // @IBOutlet var progressView : ProgressBar? 20 | @IBOutlet var remainingTimeView : NSTextField? 21 | 22 | let windowDelegate : NSWindowDelegate = TeleprompterWindowDelegate() 23 | 24 | let speech = Speech.sharedSpeech 25 | let buttonController = SpeechButtonManager(speech: Speech.sharedSpeech) 26 | 27 | required init?(coder: NSCoder) { 28 | super.init(coder: coder) 29 | } 30 | 31 | override func viewDidLoad() { 32 | super.viewDidLoad() 33 | 34 | self.buttonController.playPauseButton = self.playPauseButton 35 | self.buttonController.skipForwardButton = self.skipForwardButton 36 | self.buttonController.skipBackwardsButton = self.skipBackwardsButton 37 | self.buttonController.remainingTimeView = self.remainingTimeView 38 | 39 | self.buttonController.update() 40 | } 41 | 42 | func updateProgressView() 43 | { 44 | if Dictater.isProgressBarEnabled 45 | { 46 | // self.progressView.hidden = false 47 | // self.buttonController.progressView = self.progressView 48 | } else { 49 | 50 | // self.progressView?.hidden = true 51 | // self.buttonController.progressView = nil 52 | } 53 | 54 | self.buttonController.update() 55 | } 56 | 57 | override func viewWillAppear() { 58 | 59 | 60 | self.view.window?.delegate = self.windowDelegate 61 | 62 | self.buttonController.registerEvents() 63 | 64 | let center = NotificationCenter.default 65 | 66 | center.addObserver(self, selector: #selector(self.updateFont), name: NSNotification.Name(rawValue: Dictater.TextAppearanceChangedNotification), object: nil) 67 | center.addObserver(self, selector: #selector(self.update), name: NSNotification.Name(rawValue: Speech.ProgressChangedNotification), object: self.speech) 68 | center.addObserver(self, selector: #selector(self.updateButtons), name: NSNotification.Name(rawValue: TeleprompterWindowDelegate.ResizedEvent), object: nil) 69 | 70 | // TODO: Here's a problem 71 | // center.addObserver(self, selector: #selector(self.updateProgressView), name: UserDefaultsDidChangeNotification, object: nil) 72 | 73 | 74 | self.update() 75 | self.updateFont() 76 | } 77 | 78 | override func viewWillDisappear() { 79 | NotificationCenter.default.removeObserver(self) 80 | 81 | self.buttonController.deregisterEvents() 82 | } 83 | 84 | @objc func updateFont() { 85 | if let textView = self.textView 86 | { 87 | textView.font = Dictater.font 88 | let paragraphStyle = Dictater.ParagraphStyle() 89 | textView.defaultParagraphStyle = paragraphStyle 90 | 91 | let range = NSMakeRange(0, textView.attributedString().length) 92 | textView.textStorage?.addAttribute(NSAttributedString.Key.paragraphStyle, value: paragraphStyle, range: range) 93 | } 94 | } 95 | 96 | @objc func updateButtons() 97 | { 98 | self.buttonController.update() 99 | } 100 | 101 | @objc func update() 102 | { 103 | if let textView = self.textView 104 | { 105 | if textView.string != self.speech.text 106 | { 107 | textView.string = self.speech.text 108 | } 109 | 110 | self.highlightText() 111 | 112 | if let range = self.speech.range, self.shouldAutoScroll() 113 | { 114 | textView.scrollRangeToVisible(range: range, smart: true) 115 | } 116 | } 117 | } 118 | 119 | func shouldAutoScroll() -> Bool 120 | { 121 | if !Dictater.autoScrollEnabled 122 | { 123 | return false 124 | } 125 | 126 | if let date = self.textView?.scrollDate 127 | { 128 | let seconds = NSDate().timeIntervalSince(date as Date) 129 | 130 | if seconds <= 3 131 | { 132 | return false 133 | } 134 | } 135 | 136 | return true 137 | } 138 | 139 | func highlightText() 140 | { 141 | if let textView = self.textView, 142 | let textStorage = textView.textStorage, 143 | let newRange = self.speech.range 144 | { 145 | textStorage.beginEditing() 146 | 147 | let fullRange = NSRange.init(location: 0, length: self.speech.text.count) 148 | for (key, _) in self.highlightAttributes 149 | { 150 | textStorage.removeAttribute(key, range: fullRange) 151 | } 152 | 153 | textStorage.addAttributes(self.highlightAttributes, range: newRange) 154 | textStorage.endEditing() 155 | } 156 | } 157 | 158 | var highlightAttributes : [NSAttributedString.Key:Any] { 159 | let attributes : [NSAttributedString.Key:Any] = [ 160 | NSAttributedString.Key.backgroundColor: NSColor(red:1, green:0.832, blue:0.473, alpha:0.5), 161 | NSAttributedString.Key.underlineColor: NSColor(red:1, green:0.832, blue:0.473, alpha:1), 162 | NSAttributedString.Key.underlineStyle: NSUnderlineStyle.thick.rawValue 163 | ] 164 | return attributes 165 | } 166 | } 167 | -------------------------------------------------------------------------------- /Dictater/TeleprompterPreferencesController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TeleprompterPreferencesController.swift 3 | // Dictater 4 | // 5 | // Created by Kyle Carson on 9/7/15. 6 | // Copyright © 2015 Kyle Carson. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Cocoa 11 | 12 | class TeleprompterPreferencesController : NSViewController 13 | { 14 | @IBOutlet var fontButton : NSPopUpButton? 15 | @IBOutlet var fontSizeText : NSTextField? 16 | @IBOutlet var LineHeightMultipleText : NSTextField? 17 | 18 | @IBOutlet var lineHeightMultipleDecrementButton : NSButton? 19 | @IBOutlet var fontSizeDecrementButton : NSButton? 20 | 21 | let minLineHeightMultiple = 0.85 22 | let minFontSize = 10 23 | 24 | @IBAction func changeFontSize (sender: AnyObject?) 25 | { 26 | if let changeInSize = sender?.tag 27 | { 28 | Dictater.fontSize += changeInSize 29 | 30 | self.update() 31 | } 32 | } 33 | @IBAction func changeLineHeightMultiple (sender: AnyObject?) 34 | { 35 | if let changeInSize = sender?.tag 36 | { 37 | Dictater.lineHeightMultiple += Double(changeInSize) / 100.0 38 | 39 | self.update() 40 | } 41 | } 42 | 43 | override func viewDidLoad() { 44 | self.update() 45 | 46 | self.fontButton?.target = self 47 | self.fontButton?.action = #selector(self.saveFonts) 48 | 49 | fontButton?.removeAllItems() 50 | fontButton?.addItems(withTitles: NSFontManager.shared.availableFontFamilies) 51 | fontButton?.selectItem(withTitle: Dictater.fontName) 52 | } 53 | 54 | func update() 55 | { 56 | let fontSize = Dictater.fontSize 57 | if fontSize > self.minFontSize 58 | { 59 | self.fontSizeDecrementButton?.isEnabled = true 60 | } else { 61 | self.fontSizeDecrementButton?.isEnabled = false 62 | } 63 | 64 | 65 | let lineHeightMultiple = Dictater.lineHeightMultiple 66 | if lineHeightMultiple - self.minLineHeightMultiple > 0.01 67 | { 68 | self.lineHeightMultipleDecrementButton?.isEnabled = true 69 | } else { 70 | self.lineHeightMultipleDecrementButton?.isEnabled = false 71 | } 72 | 73 | fontSizeText?.stringValue = "\(fontSize)pt" 74 | LineHeightMultipleText?.stringValue = "\(Dictater.lineHeightMultiple)x" 75 | 76 | } 77 | @objc func saveFonts() { 78 | if let fontButton = self.fontButton, 79 | let item = fontButton.selectedItem 80 | { 81 | Dictater.fontName = item.title 82 | } 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /Dictater/TeleprompterTextView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TeleprompterTextView.swift 3 | // Dictater 4 | // 5 | // Created by Kyle Carson on 9/15/15. 6 | // Copyright © 2015 Kyle Carson. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Cocoa 11 | 12 | class TeleprompterTextView : NSTextView 13 | { 14 | static let skipChars = [ " " ] 15 | 16 | override func keyDown(with event: NSEvent) { 17 | for char in TeleprompterTextView.skipChars 18 | { 19 | if char == event.characters 20 | { 21 | self.nextKeyView?.keyDown(with: event) 22 | return 23 | } 24 | } 25 | super.keyDown(with: event) 26 | } 27 | 28 | var scrollDate : NSDate? 29 | 30 | override func scrollWheel(with event: NSEvent) 31 | { 32 | super.scrollWheel(with: event) 33 | self.scrollDate = NSDate() 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Dictater/TeleprompterWindowDelegate.swift: -------------------------------------------------------------------------------- 1 | 2 | // 3 | // TeleprompterDelegate.swift 4 | // Dictater 5 | // 6 | // Created by Kyle Carson on 9/27/15. 7 | // Copyright © 2015 Kyle Carson. All rights reserved. 8 | // 9 | 10 | import Foundation 11 | import Cocoa 12 | 13 | class TeleprompterWindowDelegate : NSObject, NSWindowDelegate 14 | { 15 | static let FullScreenEnteredEvent = "Teleprompter.FullScreenEntered" 16 | static let FullScreenExitedEvent = "Teleprompter.FullScreenExited" 17 | static let ResizedEvent = "Teleprompter.Resized" 18 | 19 | func windowWillEnterFullScreen(_ notification: NSNotification) 20 | { 21 | NotificationCenter.default.post(name: NSNotification.Name(rawValue: TeleprompterWindowDelegate.FullScreenEnteredEvent), object: nil) 22 | } 23 | 24 | func windowDidExitFullScreen(_ notification: NSNotification) 25 | { 26 | NotificationCenter.default.post(name: NSNotification.Name(rawValue: TeleprompterWindowDelegate.FullScreenExitedEvent), object: nil) 27 | } 28 | 29 | func windowDidResize(_ notification: NSNotification) { 30 | NotificationCenter.default.post(name: NSNotification.Name(rawValue: TeleprompterWindowDelegate.ResizedEvent), object: nil) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Dictater/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // Dictate Assist 4 | // 5 | // Created by Kyle Carson on 9/1/15. 6 | // Copyright © 2015 Kyle Carson. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | //import ProgressKit 11 | 12 | class ViewController: NSViewController { 13 | 14 | var buttonController = SpeechButtonManager(speech: Speech.sharedSpeech) 15 | 16 | @IBOutlet var skipDurationMenuItem : NSMenuItem? 17 | 18 | // @IBOutlet var progressView : ProgressBar? 19 | 20 | @IBOutlet var playPauseButton : NSButton? 21 | @IBOutlet var skipForwardButton : NSButton? 22 | @IBOutlet var skipBackwardsButton : NSButton? 23 | @IBOutlet var openTeleprompterButton : NSButton? 24 | @IBOutlet var remainingTimeView : NSTextField? 25 | 26 | override func viewDidLoad() { 27 | super.viewDidLoad() 28 | 29 | self.setupSkipDurationMenuItem() 30 | 31 | self.buttonController.openTeleprompterButton = self.openTeleprompterButton 32 | // self.buttonController.progressView = self.progressView 33 | self.buttonController.playPauseButton = self.playPauseButton 34 | self.buttonController.skipForwardButton = self.skipForwardButton 35 | self.buttonController.skipBackwardsButton = self.skipBackwardsButton 36 | self.buttonController.remainingTimeView = self.remainingTimeView 37 | 38 | self.buttonController.update() 39 | } 40 | 41 | override func viewWillAppear() { 42 | self.buttonController.registerEvents() 43 | } 44 | 45 | override func viewWillDisappear() { 46 | self.buttonController.deregisterEvents() 47 | } 48 | 49 | @IBAction func openSpeechPreferences(target: AnyObject?) 50 | { 51 | NSWorkspace.shared.openFile("/System/Library/PreferencePanes/Speech.prefPane") 52 | } 53 | 54 | @IBAction func openMenu(target: AnyObject?) 55 | { 56 | if let view = target as? NSView 57 | { 58 | view.menu?.popUp(positioning: nil, at: view.frame.origin, in: view.superview) 59 | } 60 | } 61 | 62 | // Skip Duration Settings 63 | 64 | func setupSkipDurationMenuItem() 65 | { 66 | if let item = self.skipDurationMenuItem 67 | { 68 | let boundary = Dictater.skipBoundary 69 | 70 | if let submenu = item.submenu 71 | { 72 | for child in submenu.items 73 | { 74 | if child.tag == boundary.rawValue 75 | { 76 | child.state = NSControl.StateValue.on 77 | } else { 78 | child.state = NSControl.StateValue.off 79 | } 80 | } 81 | } 82 | } 83 | } 84 | 85 | @IBAction func changeSkipDuration(target: AnyObject?) 86 | { 87 | if let view = target as? NSMenuItem 88 | { 89 | if let boundary = Speech.Boundary(rawValue: view.tag) 90 | { 91 | Dictater.skipBoundary = boundary 92 | 93 | self.setupSkipDurationMenuItem() 94 | } 95 | } 96 | } 97 | 98 | } 99 | 100 | -------------------------------------------------------------------------------- /Dictater/Vocalization.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Vocalization.swift 3 | // Dictater 4 | // 5 | // Created by Kyle Carson on 9/4/15. 6 | // Copyright © 2015 Kyle Carson. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Cocoa 11 | 12 | class Vocalization : NSObject, NSSpeechSynthesizerDelegate 13 | { 14 | let text : String 15 | 16 | init(_ text: String) 17 | { 18 | self.text = text 19 | } 20 | 21 | lazy var synthesizer : NSSpeechSynthesizer = { 22 | let synth = NSSpeechSynthesizer() 23 | synth.delegate = self 24 | 25 | return synth 26 | }() 27 | 28 | var currentRange : NSRange? = NSRange() 29 | { 30 | didSet { 31 | NotificationCenter.default.post(name: NSNotification.Name(rawValue: Vocalization.ProgressChangedNotification), object: self) 32 | 33 | } 34 | } 35 | 36 | var didFinish : Bool = false 37 | 38 | var isSpeaking : Bool = false 39 | { 40 | didSet { 41 | if oldValue != self.isSpeaking 42 | { 43 | NotificationCenter.default.post(name: NSNotification.Name(rawValue: Vocalization.IsSpeakingChangedNotification), object: self) 44 | } 45 | } 46 | } 47 | 48 | var firstWordRange : NSRange 49 | { 50 | let words = self.text.components(separatedBy: CharacterSet.whitespacesAndNewlines) 51 | let length = words.first?.count ?? 0 52 | 53 | return NSRange.init(location: 0, length: length) 54 | } 55 | 56 | func start() 57 | { 58 | if self.text.count > 0 59 | { 60 | self.currentRange = self.firstWordRange 61 | self.synthesizer.startSpeaking(self.text) 62 | 63 | self.isSpeaking = true 64 | self.didFinish = false 65 | } else { 66 | self.isSpeaking = false 67 | self.didFinish = true 68 | 69 | self.currentRange = NSRange.init(location: 0, length: self.text.count) 70 | } 71 | } 72 | 73 | func pause() 74 | { 75 | self.synthesizer.pauseSpeaking(at: NSSpeechSynthesizer.Boundary.immediateBoundary) 76 | 77 | self.isSpeaking = false 78 | } 79 | 80 | func continueSpeaking() 81 | { 82 | self.self.synthesizer.continueSpeaking() 83 | 84 | self.isSpeaking = true 85 | 86 | } 87 | 88 | static let ProgressChangedNotification = "Vocalization.ProgressChangedNotification" 89 | static let IsSpeakingChangedNotification = "Vocalization.IsSpeakingChangedNotification" 90 | 91 | func speechSynthesizer(_ sender: NSSpeechSynthesizer, willSpeakWord characterRange: NSRange, of string: String) 92 | { 93 | self.currentRange = characterRange 94 | } 95 | 96 | func speechSynthesizer(_ sender: NSSpeechSynthesizer, didFinishSpeaking finishedSpeaking: Bool) { 97 | self.didFinish = true 98 | self.isSpeaking = false 99 | self.currentRange = NSRange.init(location: text.count, length: 0) 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /Dictater/dsa_pub.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN PUBLIC KEY----- 2 | MIIGOjCCBC0GByqGSM44BAEwggQgAoICAQC6ZlNemCCOvYfEk3AX/VJaDkDs4Ux1 3 | Als0Z3YkSXbRSn6Pp9XdSooYoSiG4Ql+lImxz+FaSO71KnMCqQlm/kz4iR++VbSt 4 | oulTNwJPVuOK/flDJW2KueL2TAH8qvNgPBqAmakaUlVRF1fmOsb77YBevGN2eMd2 5 | TrR3tJwfy9kSBubUPUp9YoqNsl3LaP24r3nOYB0BsfAIhp0q4XZd7qTaGAgF2v2w 6 | C1vN1jp0AR3T4DVgVdoOKEzeO5XMHTUJYbfQZlLkUMlYiKQFahCQSdZ6sPAziKH0 7 | e/Dethbp+v78brHLnkttHVC3bZ+vz3zuIsnsx0xtPpdEMuHlWwfJ8n0vNezgqh60 8 | DFCIBY6LL8OlIBvwIzcRPDDNrUPZ+44dy6nQWDJlwKIueEKCPyR8K+q+ktAmM0C5 9 | GGpNEycdo+HDKWKtL7CYbEFnYBjtI9fT50/BVbCqSu1xfsYKBmeJ8Fh/QLFyUsnB 10 | XfL40qCLrguPEzR7E09fm7keeJgr5pSFPZpBGQy6hze8hXI8WyH02sV2o0F15tW2 11 | l1Vv25aimKMZcTLWM+V9zcKA69/0NxnEJ/U89SlZhTubJRduihZUWvGcdqXbU8x9 12 | mPq76PhSg2duO1Mmcmy9oWZhjIhR6l7NVhfPtpA0aZArw8IfPpgMr5mC8rpw3rOi 13 | VlTonObTWjd82wIVAMK+qMsdXvi2+ZIo1bOTPFSR6usVAoICAEbfiZVG6P00J1Jf 14 | RwyhIRqEZp+5p+JwriW59yovWqoueUJ2hxnbjdEHRPOFKRBUZH2DXUAU06iukNZ8 15 | XdosY8elrQZmf9jIi23uWW27gQrs7LjMhBf4RIlimECiHXZ0QF1TS+E/VWDwm0Y9 16 | r3vV4IO+aAoZJJ6Hplzn+FpvNbpsnO/GLBRkmwpC2fdbwn+yW7E4FLVE6KWB0Y0b 17 | fC6kXwUPvIfs02xdDCb+iHeQhSxC+kSYRt8BdWSWuRq7JK2BNJYnfyvEo/IsTlRE 18 | hC3jg4gg98Mrgpesa+X4W4zy5EElcU1l6yESD8JvNrWXqlIVKnjv7/P/DX7x0DlB 19 | 8zeeR74Feb3TD5l38qa+1i4oDYHpKX25FnBTiLq9DhCm5NQmPdDyazURXhcTfqNk 20 | +PzvDutVR+JKLbUZw7cjRxomWgy9GyJOu+zqxoLDHWyGYBF4iMa/Vrb7HEODsOyt 21 | lDHxtCirZmeQ8iq8dObw7fUWs2r3n2PyOF289CYPa6pnhMV7oV5DwJz91Lp6YI1g 22 | O0ZErm4qSH8udkFDRfCnOEIJLWC0P7RyTbpRjSRQlMQ11zbc0LT2Z7pfewv/02bP 23 | X+9clw7/iqXwghtoWqr2cXnr0qUGszBwKb2sPkQO+CMzgMLiCNnS7H+xVrb3nmVV 24 | TT6QQLynMSQ6QfSyqa4b1ct5RHD9A4ICBQACggIAGGRBQxKxPyv4UPL1qqDdCRqx 25 | BW8SCPPubivODdr1orX/COiitqnOyOe3r8Y8m0ZDl1QE+XgvxloAxBkilXnTS3Xy 26 | 4w5ydY/1xpO6jucKC1w9sLFroiBBYYT2zYuRJykQcWKdX+eRX/3TsqQ4n6nPYSnw 27 | zffjNsR6Fcz85dwncypMfbgC2H+b/aDKWUAXq6tGFV2LzL6ij0lfeJAfLzCOisUB 28 | srwx5wYtIO+K/yKYsM+iPrYfhh5h9mAb0vfHRAqrppDMkti+CyyGOw1rAamnZ6XR 29 | eH5Vly/G2wASx+mE0j7hVE427NMgek7Y3UYi1YbEPCTrQZAkFLKSMRuzffNKKSI2 30 | 4fbho2s5Nl5sd3TdnlnlTfTcIUwDWO4F6WlSf65Xpuh59mgTiVkCkX8LfarUAILc 31 | O6rncAkBIxSOT4wmCsTzge9PF0OX67ihaKfwVKWemFgRE2qz7pcfHHZisC5xHyJ8 32 | 6Arjw9BRGe5Hf19ir4M8/IWYTyTgWv0t2wWrw/QNhrMx8q1RvKu31ooUoeNzNN31 33 | rZaoOJZbQVydM59EWteNcGd2U/L4lMpL15GfNXj4dn6lPrecsAqKGr004LEA508a 34 | arLN8A26iXvNPgEVdG1qko086IcOLaAVU752bFxaCz4fGDA/DvLp095n6WWGxFnL 35 | jsz4GQwCygxQhLG6FQ8= 36 | -----END PUBLIC KEY----- 37 | -------------------------------------------------------------------------------- /Dictater/instructions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/instructions.png -------------------------------------------------------------------------------- /Dictater/logo_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/logo_small.png -------------------------------------------------------------------------------- /Dictater/usage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/Dictater/usage.png -------------------------------------------------------------------------------- /DictaterTests/DictaterTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DictaterTests.swift 3 | // DictaterTests 4 | // 5 | // Created by Kyle Carson on 9/2/15. 6 | // Copyright © 2015 Kyle Carson. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | 11 | class DictaterTests: XCTestCase { 12 | 13 | override func setUp() { 14 | super.setUp() 15 | // Put setup code here. This method is called before the invocation of each test method in the class. 16 | } 17 | 18 | override func tearDown() { 19 | // Put teardown code here. This method is called after the invocation of each test method in the class. 20 | super.tearDown() 21 | } 22 | 23 | func testExample() { 24 | // This is an example of a functional test case. 25 | // Use XCTAssert and related functions to verify your tests produce the correct results. 26 | } 27 | 28 | func testPerformanceExample() { 29 | // This is an example of a performance test case. 30 | self.measureBlock() { 31 | // Put the code you want to measure the time of here. 32 | } 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /DictaterTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /DictaterUITests/DictaterUITests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DictaterUITests.swift 3 | // DictaterUITests 4 | // 5 | // Created by Kyle Carson on 9/2/15. 6 | // Copyright © 2015 Kyle Carson. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import XCTest 11 | 12 | class DictaterUITests: XCTestCase { 13 | 14 | override func setUp() { 15 | super.setUp() 16 | 17 | // Put setup code here. This method is called before the invocation of each test method in the class. 18 | 19 | // In UI tests it is usually best to stop immediately when a failure occurs. 20 | continueAfterFailure = false 21 | // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. 22 | XCUIApplication().launch() 23 | } 24 | 25 | override func tearDown() { 26 | // Put teardown code here. This method is called after the invocation of each test method in the class. 27 | super.tearDown() 28 | } 29 | 30 | func testExample() { 31 | // Use recording to get started writing UI tests. 32 | // Use XCTAssert and related functions to verify your tests produce the correct results. 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /DictaterUITests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Kyle Carson 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment this line to define a global platform for your project 2 | # platform :ios, '8.0' 3 | # Uncomment this line if you're using Swift 4 | use_frameworks! 5 | platform :osx, '10.10' 6 | 7 | target 'Dictater' do 8 | pod 'ProgressKit', '~> 0.4' 9 | end 10 | 11 | target 'DictaterTests' do 12 | 13 | end 14 | 15 | target 'DictaterUITests' do 16 | 17 | end 18 | 19 | -------------------------------------------------------------------------------- /Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - ProgressKit (0.4.1) 3 | 4 | DEPENDENCIES: 5 | - ProgressKit (~> 0.4) 6 | 7 | SPEC CHECKSUMS: 8 | ProgressKit: d42fd5b9b78a4ff914e9672fb2b76f570f9da47e 9 | 10 | COCOAPODS: 0.39.0 11 | -------------------------------------------------------------------------------- /Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - ProgressKit (0.4.1) 3 | 4 | DEPENDENCIES: 5 | - ProgressKit (~> 0.4) 6 | 7 | SPEC CHECKSUMS: 8 | ProgressKit: d42fd5b9b78a4ff914e9672fb2b76f570f9da47e 9 | 10 | COCOAPODS: 0.39.0 11 | -------------------------------------------------------------------------------- /Pods/ProgressKit/BaseView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BaseView.swift 3 | // ProgressKit 4 | // 5 | // Created by Kauntey Suryawanshi on 04/10/15. 6 | // Copyright (c) 2015 Kauntey Suryawanshi. All rights reserved. 7 | // 8 | 9 | import AppKit 10 | 11 | @IBDesignable 12 | public class BaseView : NSView { 13 | 14 | override init(frame frameRect: NSRect) { 15 | super.init(frame: frameRect) 16 | self.configureLayers() 17 | } 18 | 19 | required public init?(coder: NSCoder) { 20 | super.init(coder: coder) 21 | self.configureLayers() 22 | } 23 | 24 | /// Configure the Layers 25 | func configureLayers() { 26 | self.wantsLayer = true 27 | notifyViewRedesigned() 28 | } 29 | 30 | @IBInspectable var background: NSColor = NSColor(red: 88.3 / 256, green: 104.4 / 256, blue: 118.5 / 256, alpha: 1.0) { 31 | didSet { 32 | self.notifyViewRedesigned() 33 | } 34 | } 35 | 36 | @IBInspectable var foreground: NSColor = NSColor(red: 66.3 / 256, green: 173.7 / 256, blue: 106.4 / 256, alpha: 1.0) { 37 | didSet { 38 | self.notifyViewRedesigned() 39 | } 40 | } 41 | 42 | @IBInspectable var cornerRadius: CGFloat = 5.0 { 43 | didSet { 44 | self.notifyViewRedesigned() 45 | } 46 | } 47 | 48 | /// Call when any IBInspectable variable is changed 49 | func notifyViewRedesigned() { 50 | self.layer?.backgroundColor = background.CGColor 51 | self.layer?.cornerRadius = cornerRadius 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /Pods/ProgressKit/Determinate/CircularProgressView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CircularView.swift 3 | // Animo 4 | // 5 | // Created by Kauntey Suryawanshi on 29/06/15. 6 | // Copyright (c) 2015 Kauntey Suryawanshi. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Cocoa 11 | 12 | @IBDesignable 13 | public class CircularProgressView: DeterminateAnimation { 14 | 15 | var backgroundCircle = CAShapeLayer() 16 | var progressLayer = CAShapeLayer() 17 | var percentLabelLayer = CATextLayer() 18 | 19 | @IBInspectable var strokeWidth: CGFloat = -1 { 20 | didSet { 21 | notifyViewRedesigned() 22 | } 23 | } 24 | 25 | @IBInspectable var showPercent: Bool = true { 26 | didSet { 27 | notifyViewRedesigned() 28 | } 29 | } 30 | 31 | override func notifyViewRedesigned() { 32 | super.notifyViewRedesigned() 33 | backgroundCircle.lineWidth = self.strokeWidth / 2 34 | progressLayer.lineWidth = strokeWidth 35 | percentLabelLayer.hidden = !showPercent 36 | 37 | backgroundCircle.strokeColor = foreground.colorWithAlphaComponent(0.5).CGColor 38 | progressLayer.strokeColor = foreground.CGColor 39 | percentLabelLayer.foregroundColor = foreground.CGColor 40 | } 41 | 42 | override func updateProgress() { 43 | CATransaction.begin() 44 | if animated { 45 | CATransaction.setAnimationDuration(0.5) 46 | } else { 47 | CATransaction.setDisableActions(true) 48 | } 49 | let timing = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut) 50 | CATransaction.setAnimationTimingFunction(timing) 51 | progressLayer.strokeEnd = max(0, min(progress, 1)) 52 | percentLabelLayer.string = "\(Int(progress * 100))%" 53 | CATransaction.commit() 54 | } 55 | 56 | override func configureLayers() { 57 | super.configureLayers() 58 | let rect = self.bounds 59 | let radius = (rect.width / 2) * 0.75 60 | let strokeScalingFactor = CGFloat(0.05) 61 | 62 | 63 | // Add background Circle 64 | do { 65 | backgroundCircle.frame = rect 66 | backgroundCircle.lineWidth = strokeWidth == -1 ? (rect.width * strokeScalingFactor / 2) : strokeWidth / 2 67 | 68 | backgroundCircle.strokeColor = foreground.colorWithAlphaComponent(0.5).CGColor 69 | backgroundCircle.fillColor = NSColor.clearColor().CGColor 70 | let backgroundPath = NSBezierPath() 71 | backgroundPath.appendBezierPathWithArcWithCenter(rect.mid, radius: radius, startAngle: 0, endAngle: 360) 72 | backgroundCircle.path = backgroundPath.CGPath 73 | self.layer?.addSublayer(backgroundCircle) 74 | } 75 | 76 | // Progress Layer 77 | do { 78 | progressLayer.strokeEnd = 0 //REMOVe this 79 | progressLayer.fillColor = NSColor.clearColor().CGColor 80 | progressLayer.lineCap = kCALineCapRound 81 | progressLayer.lineWidth = strokeWidth == -1 ? (rect.width * strokeScalingFactor) : strokeWidth 82 | 83 | progressLayer.frame = rect 84 | progressLayer.strokeColor = foreground.CGColor 85 | let arcPath = NSBezierPath() 86 | let startAngle = CGFloat(90) 87 | arcPath.appendBezierPathWithArcWithCenter(rect.mid, radius: radius, startAngle: startAngle, endAngle: (startAngle - 360), clockwise: true) 88 | progressLayer.path = arcPath.CGPath 89 | self.layer?.addSublayer(progressLayer) 90 | } 91 | 92 | // Percentage Layer 93 | do { 94 | percentLabelLayer.string = "0%" 95 | percentLabelLayer.foregroundColor = foreground.CGColor 96 | percentLabelLayer.frame = rect 97 | percentLabelLayer.font = "Helvetica Neue Light" 98 | percentLabelLayer.alignmentMode = kCAAlignmentCenter 99 | percentLabelLayer.position.y = rect.midY * 0.25 100 | percentLabelLayer.fontSize = rect.width * 0.2 101 | self.layer?.addSublayer(percentLabelLayer) 102 | } 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /Pods/ProgressKit/Determinate/DeterminateAnimation.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DeterminateAnimation.swift 3 | // ProgressKit 4 | // 5 | // Created by Kauntey Suryawanshi on 09/07/15. 6 | // Copyright (c) 2015 Kauntey Suryawanshi. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Cocoa 11 | 12 | protocol DeterminableAnimation { 13 | func updateProgress() 14 | } 15 | 16 | @IBDesignable 17 | public class DeterminateAnimation: BaseView, DeterminableAnimation { 18 | 19 | @IBInspectable public var animated: Bool = true 20 | 21 | /// Value of progress now. Range 0..1 22 | @IBInspectable public var progress: CGFloat = 0 { 23 | didSet { 24 | updateProgress() 25 | } 26 | } 27 | 28 | /// This function will only be called by didSet of progress. Every subclass will have its own implementation 29 | func updateProgress() { 30 | fatalError("Must be overriden in subclass") 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Pods/ProgressKit/Determinate/ProgressBar.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ProgressBar.swift 3 | // ProgressKit 4 | // 5 | // Created by Kauntey Suryawanshi on 31/07/15. 6 | // Copyright (c) 2015 Kauntey Suryawanshi. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Cocoa 11 | 12 | @IBDesignable 13 | public class ProgressBar: DeterminateAnimation { 14 | 15 | var borderLayer = CAShapeLayer() 16 | var progressLayer = CAShapeLayer() 17 | 18 | @IBInspectable var borderColor: NSColor = NSColor.blackColor() { 19 | didSet { 20 | notifyViewRedesigned() 21 | } 22 | } 23 | 24 | override func notifyViewRedesigned() { 25 | super.notifyViewRedesigned() 26 | self.layer?.cornerRadius = self.frame.height / 2 27 | borderLayer.borderColor = borderColor.CGColor 28 | progressLayer.backgroundColor = foreground.CGColor 29 | } 30 | 31 | override func configureLayers() { 32 | super.configureLayers() 33 | 34 | borderLayer.frame = self.bounds 35 | borderLayer.cornerRadius = borderLayer.frame.height / 2 36 | borderLayer.borderWidth = 1.0 37 | self.layer?.addSublayer(borderLayer) 38 | 39 | progressLayer.frame = NSInsetRect(borderLayer.bounds, 3, 3) 40 | progressLayer.frame.size.width = (borderLayer.bounds.width - 6) 41 | progressLayer.cornerRadius = progressLayer.frame.height / 2 42 | progressLayer.backgroundColor = foreground.CGColor 43 | borderLayer.addSublayer(progressLayer) 44 | 45 | } 46 | 47 | override func updateProgress() { 48 | CATransaction.begin() 49 | if animated { 50 | CATransaction.setAnimationDuration(0.5) 51 | } else { 52 | CATransaction.setDisableActions(true) 53 | } 54 | let timing = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut) 55 | CATransaction.setAnimationTimingFunction(timing) 56 | progressLayer.frame.size.width = (borderLayer.bounds.width - 6) * progress 57 | CATransaction.commit() 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /Pods/ProgressKit/InDeterminate/CircularSnail.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WhatsAppCircular.swift 3 | // ProgressKit 4 | // 5 | // Created by Kauntey Suryawanshi on 30/06/15. 6 | // Copyright (c) 2015 Kauntey Suryawanshi. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Cocoa 11 | 12 | private let duration = 1.5 13 | private let strokeRange = (start: 0.0, end: 0.8) 14 | 15 | @IBDesignable 16 | public class CircularSnail: IndeterminateAnimation { 17 | 18 | @IBInspectable var lineWidth: CGFloat = -1 { 19 | didSet { 20 | progressLayer.lineWidth = lineWidth 21 | } 22 | } 23 | 24 | override func notifyViewRedesigned() { 25 | super.notifyViewRedesigned() 26 | progressLayer.strokeColor = foreground.CGColor 27 | } 28 | 29 | var backgroundRotationLayer = CAShapeLayer() 30 | 31 | var progressLayer: CAShapeLayer = { 32 | var tempLayer = CAShapeLayer() 33 | tempLayer.strokeEnd = CGFloat(strokeRange.end) 34 | tempLayer.lineCap = kCALineCapRound 35 | tempLayer.fillColor = NSColor.clearColor().CGColor 36 | return tempLayer 37 | }() 38 | 39 | //MARK: Animation Declaration 40 | var animationGroup: CAAnimationGroup = { 41 | var tempGroup = CAAnimationGroup() 42 | tempGroup.repeatCount = 1 43 | tempGroup.duration = duration 44 | return tempGroup 45 | }() 46 | 47 | 48 | var rotationAnimation: CABasicAnimation = { 49 | var tempRotation = CABasicAnimation(keyPath: "transform.rotation") 50 | tempRotation.repeatCount = Float.infinity 51 | tempRotation.fromValue = 0 52 | tempRotation.toValue = 1 53 | tempRotation.cumulative = true 54 | tempRotation.duration = duration / 2 55 | return tempRotation 56 | }() 57 | 58 | /// Makes animation for Stroke Start and Stroke End 59 | func makeStrokeAnimationGroup() { 60 | var strokeStartAnimation: CABasicAnimation! 61 | var strokeEndAnimation: CABasicAnimation! 62 | 63 | func makeAnimationforKeyPath(keyPath: String) -> CABasicAnimation { 64 | let tempAnimation = CABasicAnimation(keyPath: keyPath) 65 | tempAnimation.repeatCount = 1 66 | tempAnimation.speed = 2.0 67 | tempAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) 68 | 69 | tempAnimation.fromValue = strokeRange.start 70 | tempAnimation.toValue = strokeRange.end 71 | tempAnimation.duration = duration 72 | 73 | return tempAnimation 74 | } 75 | strokeEndAnimation = makeAnimationforKeyPath("strokeEnd") 76 | strokeStartAnimation = makeAnimationforKeyPath("strokeStart") 77 | strokeStartAnimation.beginTime = duration / 2 78 | animationGroup.animations = [strokeEndAnimation, strokeStartAnimation, ] 79 | animationGroup.delegate = self 80 | } 81 | 82 | override func configureLayers() { 83 | super.configureLayers() 84 | makeStrokeAnimationGroup() 85 | let rect = self.bounds 86 | 87 | backgroundRotationLayer.frame = rect 88 | self.layer?.addSublayer(backgroundRotationLayer) 89 | 90 | // Progress Layer 91 | let radius = (rect.width / 2) * 0.75 92 | progressLayer.frame = rect 93 | progressLayer.lineWidth = lineWidth == -1 ? radius / 10: lineWidth 94 | let arcPath = NSBezierPath() 95 | arcPath.appendBezierPathWithArcWithCenter(rect.mid, radius: radius, startAngle: 0, endAngle: 360, clockwise: false) 96 | progressLayer.path = arcPath.CGPath 97 | backgroundRotationLayer.addSublayer(progressLayer) 98 | } 99 | 100 | var currentRotation = 0.0 101 | let π2 = M_PI * 2 102 | override public func animationDidStop(anim: CAAnimation, finished flag: Bool) { 103 | if !animate { return } 104 | CATransaction.begin() 105 | CATransaction.setDisableActions(true) 106 | currentRotation += strokeRange.end * π2 107 | currentRotation %= π2 108 | progressLayer.setAffineTransform(CGAffineTransformMakeRotation(CGFloat( currentRotation))) 109 | CATransaction.commit() 110 | progressLayer.addAnimation(animationGroup, forKey: "strokeEnd") 111 | } 112 | 113 | override func startAnimation() { 114 | progressLayer.addAnimation(animationGroup, forKey: "strokeEnd") 115 | backgroundRotationLayer.addAnimation(rotationAnimation, forKey: rotationAnimation.keyPath) 116 | } 117 | override func stopAnimation() { 118 | backgroundRotationLayer.removeAllAnimations() 119 | progressLayer.removeAllAnimations() 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /Pods/ProgressKit/InDeterminate/Crawler.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Crawler.swift 3 | // ProgressKit 4 | // 5 | // Created by Kauntey Suryawanshi on 11/07/15. 6 | // Copyright (c) 2015 Kauntey Suryawanshi. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Cocoa 11 | 12 | private let defaultForegroundColor = NSColor.whiteColor() 13 | private let defaultBackgroundColor = NSColor(white: 0.0, alpha: 0.4) 14 | private let duration = 1.2 15 | 16 | @IBDesignable 17 | public class Crawler: IndeterminateAnimation { 18 | 19 | var starList = [CAShapeLayer]() 20 | 21 | var smallCircleSize: Double { 22 | return Double(self.bounds.width) * 0.2 23 | } 24 | 25 | var animationGroups = [CAAnimation]() 26 | 27 | override func notifyViewRedesigned() { 28 | super.notifyViewRedesigned() 29 | for star in starList { 30 | star.backgroundColor = foreground.CGColor 31 | } 32 | } 33 | override func configureLayers() { 34 | super.configureLayers() 35 | let rect = self.bounds 36 | let insetRect = NSInsetRect(rect, rect.width * 0.15, rect.width * 0.15) 37 | 38 | for var i = 0.0; i < 5; i++ { 39 | let starShape = CAShapeLayer() 40 | starList.append(starShape) 41 | starShape.backgroundColor = foreground.CGColor 42 | 43 | let circleWidth = smallCircleSize - i * 2 44 | starShape.bounds = CGRect(x: 0, y: 0, width: circleWidth, height: circleWidth) 45 | starShape.cornerRadius = CGFloat(circleWidth / 2) 46 | starShape.position = CGPoint(x: rect.midX, y: rect.midY + insetRect.height / 2) 47 | self.layer?.addSublayer(starShape) 48 | 49 | let arcPath = NSBezierPath() 50 | arcPath.appendBezierPathWithArcWithCenter(insetRect.mid, radius: insetRect.width / 2, startAngle: 90, endAngle: -360 + 90, clockwise: true) 51 | 52 | let rotationAnimation = CAKeyframeAnimation(keyPath: "position") 53 | rotationAnimation.path = arcPath.CGPath 54 | rotationAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut) 55 | rotationAnimation.beginTime = (duration * 0.075) * i 56 | rotationAnimation.calculationMode = kCAAnimationCubicPaced 57 | 58 | let animationGroup = CAAnimationGroup() 59 | animationGroup.animations = [rotationAnimation] 60 | animationGroup.duration = duration 61 | animationGroup.repeatCount = Float.infinity 62 | animationGroups.append(animationGroup) 63 | 64 | } 65 | } 66 | 67 | override func startAnimation() { 68 | for (index, star) in starList.enumerate() { 69 | star.addAnimation(animationGroups[index], forKey: "") 70 | } 71 | } 72 | 73 | override func stopAnimation() { 74 | for star in starList { 75 | star.removeAllAnimations() 76 | } 77 | } 78 | } 79 | 80 | -------------------------------------------------------------------------------- /Pods/ProgressKit/InDeterminate/IndeterminateAnimation.swift: -------------------------------------------------------------------------------- 1 | // 2 | // InDeterminateAnimation.swift 3 | // ProgressKit 4 | // 5 | // Created by Kauntey Suryawanshi on 09/07/15. 6 | // Copyright (c) 2015 Kauntey Suryawanshi. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Cocoa 11 | 12 | protocol AnimationActivityProtocol { 13 | func startAnimation() 14 | func stopAnimation() 15 | } 16 | 17 | public class IndeterminateAnimation: BaseView, AnimationActivityProtocol { 18 | 19 | /// View is hidden when *animate* property is false 20 | @IBInspectable var displayAfterAnimationEnds: Bool = false 21 | 22 | /** 23 | Control point for all Indeterminate animation 24 | True invokes `startAnimation()` on subclass of IndeterminateAnimation 25 | False invokes `stopAnimation()` on subclass of IndeterminateAnimation 26 | */ 27 | public var animate: Bool = false { 28 | didSet { 29 | if animate { 30 | self.hidden = false 31 | startAnimation() 32 | } else { 33 | if !displayAfterAnimationEnds { 34 | self.hidden = true 35 | } 36 | stopAnimation() 37 | } 38 | } 39 | } 40 | 41 | /** 42 | Every function that extends Indeterminate animation must define startAnimation(). 43 | `animate` property of Indeterminate animation will indynamically invoke the subclass method 44 | */ 45 | func startAnimation() { 46 | fatalError("This is an abstract function") 47 | } 48 | 49 | /** 50 | Every function that extends Indeterminate animation must define **stopAnimation()**. 51 | 52 | *animate* property of Indeterminate animation will dynamically invoke the subclass method 53 | */ 54 | func stopAnimation() { 55 | fatalError("This is an abstract function") 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /Pods/ProgressKit/InDeterminate/Rainbow.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Rainbow.swift 3 | // ProgressKit 4 | // 5 | // Created by Kauntey Suryawanshi on 09/07/15. 6 | // Copyright (c) 2015 Kauntey Suryawanshi. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Cocoa 11 | 12 | @IBDesignable 13 | public class Rainbow: CircularSnail { 14 | 15 | @IBInspectable var onLightOffDark: Bool = false 16 | 17 | override func configureLayers() { 18 | super.configureLayers() 19 | self.background = NSColor.clearColor() 20 | } 21 | 22 | override public func animationDidStop(anim: CAAnimation, finished flag: Bool) { 23 | super.animationDidStop(anim, finished: flag) 24 | if onLightOffDark { 25 | progressLayer.strokeColor = lightColorList[Int(arc4random()) % lightColorList.count].CGColor 26 | } else { 27 | progressLayer.strokeColor = darkColorList[Int(arc4random()) % darkColorList.count].CGColor 28 | } 29 | } 30 | } 31 | 32 | var randomColor: NSColor { 33 | let red = CGFloat(Double(arc4random()) % 256.0 / 256.0) 34 | let green = CGFloat(Double(arc4random()) % 256.0 / 256.0) 35 | let blue = CGFloat(Double(arc4random()) % 256.0 / 256.0) 36 | return NSColor(calibratedRed: red, green: green, blue: blue, alpha: 1.0) 37 | } 38 | 39 | private let lightColorList:[NSColor] = [ 40 | NSColor(red: 0.9461, green: 0.6699, blue: 0.6243, alpha: 1.0), 41 | NSColor(red: 0.8625, green: 0.7766, blue: 0.8767, alpha: 1.0), 42 | NSColor(red: 0.6676, green: 0.6871, blue: 0.8313, alpha: 1.0), 43 | NSColor(red: 0.7263, green: 0.6189, blue: 0.8379, alpha: 1.0), 44 | NSColor(red: 0.8912, green: 0.9505, blue: 0.9971, alpha: 1.0), 45 | NSColor(red: 0.7697, green: 0.9356, blue: 0.9692, alpha: 1.0), 46 | NSColor(red: 0.3859, green: 0.7533, blue: 0.9477, alpha: 1.0), 47 | NSColor(red: 0.6435, green: 0.8554, blue: 0.8145, alpha: 1.0), 48 | NSColor(red: 0.8002, green: 0.936, blue: 0.7639, alpha: 1.0), 49 | NSColor(red: 0.5362, green: 0.8703, blue: 0.8345, alpha: 1.0), 50 | NSColor(red: 0.9785, green: 0.8055, blue: 0.4049, alpha: 1.0), 51 | NSColor(red: 1.0, green: 0.8667, blue: 0.6453, alpha: 1.0), 52 | NSColor(red: 0.9681, green: 0.677, blue: 0.2837, alpha: 1.0), 53 | NSColor(red: 0.9898, green: 0.7132, blue: 0.1746, alpha: 1.0), 54 | NSColor(red: 0.8238, green: 0.84, blue: 0.8276, alpha: 1.0), 55 | NSColor(red: 0.8532, green: 0.8763, blue: 0.883, alpha: 1.0), 56 | ] 57 | 58 | let darkColorList: [NSColor] = [ 59 | NSColor(red: 0.9472, green: 0.2496, blue: 0.0488, alpha: 1.0), 60 | NSColor(red: 0.8098, green: 0.1695, blue: 0.0467, alpha: 1.0), 61 | NSColor(red: 0.853, green: 0.2302, blue: 0.3607, alpha: 1.0), 62 | NSColor(red: 0.8152, green: 0.3868, blue: 0.5021, alpha: 1.0), 63 | NSColor(red: 0.96, green: 0.277, blue: 0.3515, alpha: 1.0), 64 | NSColor(red: 0.3686, green: 0.3069, blue: 0.6077, alpha: 1.0), 65 | NSColor(red: 0.5529, green: 0.3198, blue: 0.5409, alpha: 1.0), 66 | NSColor(red: 0.2132, green: 0.4714, blue: 0.7104, alpha: 1.0), 67 | NSColor(red: 0.1706, green: 0.2432, blue: 0.3106, alpha: 1.0), 68 | NSColor(red: 0.195, green: 0.2982, blue: 0.3709, alpha: 1.0), 69 | NSColor(red: 0.0, green: 0.3091, blue: 0.5859, alpha: 1.0), 70 | NSColor(red: 0.2261, green: 0.6065, blue: 0.3403, alpha: 1.0), 71 | NSColor(red: 0.1101, green: 0.5694, blue: 0.4522, alpha: 1.0), 72 | NSColor(red: 0.1716, green: 0.4786, blue: 0.2877, alpha: 1.0), 73 | NSColor(red: 0.8289, green: 0.33, blue: 0.0, alpha: 1.0), 74 | NSColor(red: 0.4183, green: 0.4842, blue: 0.5372, alpha: 1.0), 75 | NSColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 1.0), 76 | ] 77 | -------------------------------------------------------------------------------- /Pods/ProgressKit/InDeterminate/RotatingArc.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RotatingArc.swift 3 | // ProgressKit 4 | // 5 | // Created by Kauntey Suryawanshi on 26/10/15. 6 | // Copyright © 2015 Kauntey Suryawanshi. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Cocoa 11 | 12 | private let duration = 0.25 13 | 14 | @IBDesignable 15 | public class RotatingArc: IndeterminateAnimation { 16 | 17 | var backgroundCircle = CAShapeLayer() 18 | var arcLayer = CAShapeLayer() 19 | 20 | @IBInspectable var strokeWidth: CGFloat = 5 { 21 | didSet { 22 | notifyViewRedesigned() 23 | } 24 | } 25 | 26 | @IBInspectable var arcLength: Int = 35 { 27 | didSet { 28 | notifyViewRedesigned() 29 | } 30 | } 31 | 32 | @IBInspectable var clockWise: Bool = true { 33 | didSet { 34 | notifyViewRedesigned() 35 | } 36 | } 37 | 38 | var radius: CGFloat { 39 | return (self.frame.width / 2) * CGFloat(0.75) 40 | } 41 | 42 | var rotationAnimation: CABasicAnimation = { 43 | var tempRotation = CABasicAnimation(keyPath: "transform.rotation") 44 | tempRotation.repeatCount = Float.infinity 45 | tempRotation.fromValue = 0 46 | tempRotation.toValue = 1 47 | tempRotation.cumulative = true 48 | tempRotation.duration = duration 49 | return tempRotation 50 | }() 51 | 52 | override func notifyViewRedesigned() { 53 | super.notifyViewRedesigned() 54 | 55 | arcLayer.strokeColor = foreground.CGColor 56 | backgroundCircle.strokeColor = foreground.colorWithAlphaComponent(0.4).CGColor 57 | 58 | backgroundCircle.lineWidth = self.strokeWidth 59 | arcLayer.lineWidth = strokeWidth 60 | rotationAnimation.toValue = clockWise ? -1 : 1 61 | 62 | let arcPath = NSBezierPath() 63 | let endAngle: CGFloat = CGFloat(-360) * CGFloat(arcLength) / 100 64 | arcPath.appendBezierPathWithArcWithCenter(self.bounds.mid, radius: radius, startAngle: 0, endAngle: endAngle, clockwise: true) 65 | 66 | arcLayer.path = arcPath.CGPath 67 | } 68 | 69 | override func configureLayers() { 70 | super.configureLayers() 71 | let rect = self.bounds 72 | 73 | // Add background Circle 74 | do { 75 | backgroundCircle.frame = rect 76 | backgroundCircle.lineWidth = strokeWidth 77 | 78 | backgroundCircle.strokeColor = foreground.colorWithAlphaComponent(0.5).CGColor 79 | backgroundCircle.fillColor = NSColor.clearColor().CGColor 80 | let backgroundPath = NSBezierPath() 81 | backgroundPath.appendBezierPathWithArcWithCenter(rect.mid, radius: radius, startAngle: 0, endAngle: 360) 82 | backgroundCircle.path = backgroundPath.CGPath 83 | self.layer?.addSublayer(backgroundCircle) 84 | } 85 | 86 | // Arc Layer 87 | do { 88 | arcLayer.fillColor = NSColor.clearColor().CGColor 89 | arcLayer.lineWidth = strokeWidth 90 | 91 | arcLayer.frame = rect 92 | arcLayer.strokeColor = foreground.CGColor 93 | self.layer?.addSublayer(arcLayer) 94 | } 95 | } 96 | 97 | override func startAnimation() { 98 | arcLayer.addAnimation(rotationAnimation, forKey: "") 99 | } 100 | 101 | override func stopAnimation() { 102 | arcLayer.removeAllAnimations() 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /Pods/ProgressKit/InDeterminate/ShootingStars.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ShootingStars.swift 3 | // ProgressKit 4 | // 5 | // Created by Kauntey Suryawanshi on 09/07/15. 6 | // Copyright (c) 2015 Kauntey Suryawanshi. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Cocoa 11 | 12 | @IBDesignable 13 | public class ShootingStars: IndeterminateAnimation { 14 | private let animationDuration = 1.0 15 | 16 | var starLayer1 = CAShapeLayer() 17 | var starLayer2 = CAShapeLayer() 18 | var animation = CABasicAnimation(keyPath: "position.x") 19 | var tempAnimation = CABasicAnimation(keyPath: "position.x") 20 | 21 | override func notifyViewRedesigned() { 22 | super.notifyViewRedesigned() 23 | starLayer1.backgroundColor = foreground.CGColor 24 | starLayer2.backgroundColor = foreground.CGColor 25 | } 26 | 27 | override func configureLayers() { 28 | super.configureLayers() 29 | 30 | let rect = self.bounds 31 | let dimension = rect.height 32 | let starWidth = dimension * 1.5 33 | 34 | self.layer?.cornerRadius = 0 35 | 36 | /// Add Stars 37 | do { 38 | starLayer1.position = CGPoint(x: dimension / 2, y: dimension / 2) 39 | starLayer1.bounds.size = CGSize(width: starWidth, height: dimension) 40 | starLayer1.backgroundColor = foreground.CGColor 41 | self.layer?.addSublayer(starLayer1) 42 | 43 | starLayer2.position = CGPoint(x: rect.midX, y: dimension / 2) 44 | starLayer2.bounds.size = CGSize(width: starWidth, height: dimension) 45 | starLayer2.backgroundColor = foreground.CGColor 46 | self.layer?.addSublayer(starLayer2) 47 | } 48 | 49 | /// Add default animation 50 | do { 51 | animation.fromValue = -dimension 52 | animation.toValue = rect.width * 0.9 53 | animation.duration = animationDuration 54 | animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn) 55 | animation.removedOnCompletion = false 56 | animation.repeatCount = Float.infinity 57 | } 58 | 59 | /** Temp animation will be removed after first animation 60 | After finishing it will invoke animationDidStop and starLayer2 is also given default animation. 61 | The purpose of temp animation is to generate an temporary offset 62 | */ 63 | tempAnimation.fromValue = rect.midX 64 | tempAnimation.toValue = rect.width 65 | tempAnimation.delegate = self 66 | tempAnimation.duration = animationDuration / 2 67 | tempAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn) 68 | } 69 | 70 | override public func animationDidStop(anim: CAAnimation, finished flag: Bool) { 71 | starLayer2.addAnimation(animation, forKey: "default") 72 | } 73 | 74 | //MARK: Indeterminable protocol 75 | override func startAnimation() { 76 | starLayer1.addAnimation(animation, forKey: "default") 77 | starLayer2.addAnimation(tempAnimation, forKey: "tempAnimation") 78 | } 79 | 80 | override func stopAnimation() { 81 | starLayer1.removeAllAnimations() 82 | starLayer2.removeAllAnimations() 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /Pods/ProgressKit/InDeterminate/Spinner.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Spinner.swift 3 | // ProgressKit 4 | // 5 | // Created by Kauntey Suryawanshi on 28/07/15. 6 | // Copyright (c) 2015 Kauntey Suryawanshi. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Cocoa 11 | 12 | @IBDesignable 13 | public class Spinner: IndeterminateAnimation { 14 | 15 | var basicShape = CAShapeLayer() 16 | var containerLayer = CAShapeLayer() 17 | var starList = [CAShapeLayer]() 18 | 19 | var animation: CAKeyframeAnimation = { 20 | var animation = CAKeyframeAnimation(keyPath: "transform.rotation") 21 | animation.repeatCount = Float.infinity 22 | animation.calculationMode = kCAAnimationDiscrete 23 | return animation 24 | }() 25 | 26 | @IBInspectable var starSize:CGSize = CGSize(width: 6, height: 15) { 27 | didSet { 28 | notifyViewRedesigned() 29 | } 30 | } 31 | 32 | @IBInspectable var roundedCorners: Bool = true { 33 | didSet { 34 | notifyViewRedesigned() 35 | } 36 | } 37 | 38 | 39 | @IBInspectable var distance: CGFloat = CGFloat(20) { 40 | didSet { 41 | notifyViewRedesigned() 42 | } 43 | } 44 | 45 | @IBInspectable var starCount: Int = 10 { 46 | didSet { 47 | notifyViewRedesigned() 48 | } 49 | } 50 | 51 | @IBInspectable var duration: Double = 1 { 52 | didSet { 53 | animation.duration = duration 54 | } 55 | } 56 | 57 | @IBInspectable var clockwise: Bool = false { 58 | didSet { 59 | notifyViewRedesigned() 60 | } 61 | } 62 | 63 | override func configureLayers() { 64 | super.configureLayers() 65 | 66 | containerLayer.frame = self.bounds 67 | containerLayer.cornerRadius = frame.width / 2 68 | self.layer?.addSublayer(containerLayer) 69 | 70 | animation.duration = duration 71 | } 72 | 73 | override func notifyViewRedesigned() { 74 | super.notifyViewRedesigned() 75 | starList.removeAll(keepCapacity: true) 76 | containerLayer.sublayers = nil 77 | animation.values = [Double]() 78 | 79 | for var i = 0.0; i < 360; i = i + Double(360 / starCount) { 80 | var iRadian = CGFloat(i * M_PI / 180.0) 81 | if clockwise { iRadian = -iRadian } 82 | 83 | animation.values?.append(iRadian) 84 | let starShape = CAShapeLayer() 85 | starShape.cornerRadius = roundedCorners ? starSize.width / 2 : 0 86 | 87 | let centerLocation = CGPoint(x: frame.width / 2 - starSize.width / 2, y: frame.width / 2 - starSize.height / 2) 88 | 89 | starShape.frame = CGRect(origin: centerLocation, size: starSize) 90 | 91 | starShape.backgroundColor = foreground.CGColor 92 | starShape.anchorPoint = CGPoint(x: 0.5, y: 0) 93 | 94 | var rotation: CATransform3D = CATransform3DMakeTranslation(0, 0, 0.0); 95 | 96 | rotation = CATransform3DRotate(rotation, -iRadian, 0.0, 0.0, 1.0); 97 | rotation = CATransform3DTranslate(rotation, 0, distance, 0.0); 98 | starShape.transform = rotation 99 | 100 | starShape.opacity = Float(360 - i) / 360 101 | containerLayer.addSublayer(starShape) 102 | starList.append(starShape) 103 | } 104 | } 105 | 106 | override func startAnimation() { 107 | containerLayer.addAnimation(animation, forKey: "rotation") 108 | } 109 | 110 | override func stopAnimation() { 111 | containerLayer.removeAllAnimations() 112 | } 113 | } 114 | -------------------------------------------------------------------------------- /Pods/ProgressKit/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Kaunteya Suryawanshi 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /Pods/ProgressKit/ProgressUtils.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ProgressUtils.swift 3 | // ProgressKit 4 | // 5 | // Created by Kauntey Suryawanshi on 09/07/15. 6 | // Copyright (c) 2015 Kauntey Suryawanshi. All rights reserved. 7 | // 8 | 9 | 10 | import AppKit 11 | 12 | extension NSRect { 13 | var mid: CGPoint { 14 | return CGPoint(x: CGRectGetMidX(self), y: CGRectGetMidY(self)) 15 | } 16 | } 17 | 18 | extension NSBezierPath { 19 | /// Converts NSBezierPath to CGPath 20 | var CGPath: CGPathRef { 21 | let path = CGPathCreateMutable() 22 | let points = UnsafeMutablePointer.alloc(3) 23 | let numElements = self.elementCount 24 | 25 | for index in 0.. Double { 45 | return Double(degree) * (M_PI / 180) 46 | } 47 | 48 | func radianToDegree(radian: Double) -> Int { 49 | return Int(radian * (180 / M_PI)) 50 | } 51 | 52 | func + (p1: CGPoint, p2: CGPoint) -> CGPoint { 53 | return CGPoint(x: p1.x + p2.x, y: p1.y + p2.y) 54 | } 55 | 56 | -------------------------------------------------------------------------------- /Pods/ProgressKit/README.md: -------------------------------------------------------------------------------- 1 | 2 | ![Image](/Images/banner.gif) 3 | 4 | `ProgressKit` has set of cool `IBDesignable` progress views, with huge customisation options. 5 | You can now make spinners, progress bar, crawlers etc, which can be finely customised according to your app palette. 6 | 7 | # Contents 8 | - [Installation](#installation) 9 | - [Usage](#usage) 10 | - [Indeterminate Progress](#indeterminate-progress) 11 | - [CircularSnail](#circularsnail) 12 | - [Rainbow](#rainbow) 13 | - [Crawler](#crawler) 14 | - [Spinner](#spinner) 15 | - [Shooting Stars](#shooting-stars) 16 | - [Rotating Arc](#rotating-arc) 17 | - [Determinate Progress](#determinate-progress) 18 | - [Circular Progress] (#circular-progress) 19 | - [Progress Bar](#progress-bar) 20 | - [License](#license) 21 | 22 | # Installation 23 | ##CocoaPods 24 | [CocoaPods](http://cocoapods.org) adds supports for Swift and embedded frameworks. 25 | 26 | To integrate ProgressKit into your Xcode project using CocoaPods, specify it in your `Podfile`: 27 | 28 | ```ruby 29 | use_frameworks! 30 | 31 | pod 'ProgressKit' 32 | ``` 33 | 34 | Then, run the following command: 35 | 36 | ```bash 37 | $ pod install 38 | ``` 39 | 40 | # Usage 41 | - Drag a View at desired location in `XIB` or `Storyboard` 42 | - Change the Class to any of the desired progress views 43 | - Set the size such that width and height are equal 44 | - Drag `IBOutlet` to View Controller 45 | - For `Indeterminate` Progress Views 46 | - Set `true / false` to `view.animate` 47 | - For `Determinate` Progress Views: 48 | - Set `view.progress` to value in `0...1` 49 | 50 | 51 | # Indeterminate Progress 52 | 53 | ![Indeterminate](/Images/indeterminate.gif) 54 | Progress indicators which animate indefinately are `Indeterminate Progress` Views. 55 | 56 | This are the set of Indeterminate Progress Indicators. 57 | 58 | ## CircularSnail 59 | ![CircularSnail](/Images/CircularSnail.gif) 60 | 61 | ## Rainbow 62 | ![Rainbow](/Images/Rainbow.gif) 63 | ## Crawler 64 | ![Crawler](/Images/Crawler.gif) 65 | 66 | ## Spinner 67 | ![Spinner](/Images/Spinner.gif) 68 | 69 | ## Shooting Stars 70 | ![Shooting Stars](/Images/ShootingStars.gif) 71 | 72 | ## Rotating Arc 73 | ![Rotating Arc](/Images/RotatingArc.gif) 74 | 75 | # Determinate Progress 76 | Determinate progress views can be used for tasks whos progress can be seen and determined. 77 | 78 | ## Circular Progress 79 | ![Circular Progress](/Images/CircularProgress.png) 80 | 81 | ## Progress Bar 82 | ![Progress Bar](/Images/ProgressBar.png) 83 | 84 | # License 85 | `ProgressKit` is released under the MIT license. See LICENSE for details. 86 | 87 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Dictater/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Dictater/Pods-Dictater-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## ProgressKit 5 | 6 | The MIT License (MIT) 7 | 8 | Copyright (c) 2015 Kaunteya Suryawanshi 9 | 10 | Permission is hereby granted, free of charge, to any person obtaining a copy 11 | of this software and associated documentation files (the "Software"), to deal 12 | in the Software without restriction, including without limitation the rights 13 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | copies of the Software, and to permit persons to whom the Software is 15 | furnished to do so, subject to the following conditions: 16 | 17 | The above copyright notice and this permission notice shall be included in all 18 | copies or substantial portions of the Software. 19 | 20 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 23 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 26 | SOFTWARE. 27 | 28 | 29 | Generated by CocoaPods - http://cocoapods.org 30 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Dictater/Pods-Dictater-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | The MIT License (MIT) 18 | 19 | Copyright (c) 2015 Kaunteya Suryawanshi 20 | 21 | Permission is hereby granted, free of charge, to any person obtaining a copy 22 | of this software and associated documentation files (the "Software"), to deal 23 | in the Software without restriction, including without limitation the rights 24 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 25 | copies of the Software, and to permit persons to whom the Software is 26 | furnished to do so, subject to the following conditions: 27 | 28 | The above copyright notice and this permission notice shall be included in all 29 | copies or substantial portions of the Software. 30 | 31 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 32 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 33 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 34 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 35 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 36 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 37 | SOFTWARE. 38 | 39 | 40 | Title 41 | ProgressKit 42 | Type 43 | PSGroupSpecifier 44 | 45 | 46 | FooterText 47 | Generated by CocoaPods - http://cocoapods.org 48 | Title 49 | 50 | Type 51 | PSGroupSpecifier 52 | 53 | 54 | StringsTable 55 | Acknowledgements 56 | Title 57 | Acknowledgements 58 | 59 | 60 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Dictater/Pods-Dictater-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_Dictater : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_Dictater 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Dictater/Pods-Dictater-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 5 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 6 | 7 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 8 | 9 | install_framework() 10 | { 11 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 12 | local source="${BUILT_PRODUCTS_DIR}/$1" 13 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 14 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 15 | elif [ -r "$1" ]; then 16 | local source="$1" 17 | fi 18 | 19 | local destination="${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 20 | 21 | if [ -L "${source}" ]; then 22 | echo "Symlinked..." 23 | source="$(readlink "${source}")" 24 | fi 25 | 26 | # use filter instead of exclude so missing patterns dont' throw errors 27 | echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 28 | rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 29 | 30 | local basename 31 | basename="$(basename -s .framework "$1")" 32 | binary="${destination}/${basename}.framework/${basename}" 33 | if ! [ -r "$binary" ]; then 34 | binary="${destination}/${basename}" 35 | fi 36 | 37 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 38 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 39 | strip_invalid_archs "$binary" 40 | fi 41 | 42 | # Resign the code if required by the build settings to avoid unstable apps 43 | code_sign_if_enabled "${destination}/$(basename "$1")" 44 | 45 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 46 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 47 | local swift_runtime_libs 48 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) 49 | for lib in $swift_runtime_libs; do 50 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 51 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 52 | code_sign_if_enabled "${destination}/${lib}" 53 | done 54 | fi 55 | } 56 | 57 | # Signs a framework with the provided identity 58 | code_sign_if_enabled() { 59 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 60 | # Use the current code_sign_identitiy 61 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 62 | echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements \"$1\"" 63 | /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements "$1" 64 | fi 65 | } 66 | 67 | # Strip invalid architectures 68 | strip_invalid_archs() { 69 | binary="$1" 70 | # Get architectures for current file 71 | archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" 72 | stripped="" 73 | for arch in $archs; do 74 | if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then 75 | # Strip non-valid architectures in-place 76 | lipo -remove "$arch" -output "$binary" "$binary" || exit 1 77 | stripped="$stripped $arch" 78 | fi 79 | done 80 | if [[ "$stripped" ]]; then 81 | echo "Stripped $binary of architectures:$stripped" 82 | fi 83 | } 84 | 85 | 86 | if [[ "$CONFIGURATION" == "Debug" ]]; then 87 | install_framework "Pods-Dictater/ProgressKit.framework" 88 | fi 89 | if [[ "$CONFIGURATION" == "Release" ]]; then 90 | install_framework "Pods-Dictater/ProgressKit.framework" 91 | fi 92 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Dictater/Pods-Dictater-resources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 5 | 6 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt 7 | > "$RESOURCES_TO_COPY" 8 | 9 | XCASSET_FILES=() 10 | 11 | realpath() { 12 | DIRECTORY="$(cd "${1%/*}" && pwd)" 13 | FILENAME="${1##*/}" 14 | echo "$DIRECTORY/$FILENAME" 15 | } 16 | 17 | install_resource() 18 | { 19 | case $1 in 20 | *.storyboard) 21 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}" 22 | ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" 23 | ;; 24 | *.xib) 25 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}" 26 | ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" 27 | ;; 28 | *.framework) 29 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 30 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 31 | echo "rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 32 | rsync -av "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 33 | ;; 34 | *.xcdatamodel) 35 | echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1"`.mom\"" 36 | xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodel`.mom" 37 | ;; 38 | *.xcdatamodeld) 39 | echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd\"" 40 | xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd" 41 | ;; 42 | *.xcmappingmodel) 43 | echo "xcrun mapc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm\"" 44 | xcrun mapc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm" 45 | ;; 46 | *.xcassets) 47 | ABSOLUTE_XCASSET_FILE=$(realpath "${PODS_ROOT}/$1") 48 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 49 | ;; 50 | /*) 51 | echo "$1" 52 | echo "$1" >> "$RESOURCES_TO_COPY" 53 | ;; 54 | *) 55 | echo "${PODS_ROOT}/$1" 56 | echo "${PODS_ROOT}/$1" >> "$RESOURCES_TO_COPY" 57 | ;; 58 | esac 59 | } 60 | 61 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 62 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 63 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then 64 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 65 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 66 | fi 67 | rm -f "$RESOURCES_TO_COPY" 68 | 69 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] 70 | then 71 | case "${TARGETED_DEVICE_FAMILY}" in 72 | 1,2) 73 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 74 | ;; 75 | 1) 76 | TARGET_DEVICE_ARGS="--target-device iphone" 77 | ;; 78 | 2) 79 | TARGET_DEVICE_ARGS="--target-device ipad" 80 | ;; 81 | *) 82 | TARGET_DEVICE_ARGS="--target-device mac" 83 | ;; 84 | esac 85 | 86 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 87 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 88 | while read line; do 89 | if [[ $line != "`realpath $PODS_ROOT`*" ]]; then 90 | XCASSET_FILES+=("$line") 91 | fi 92 | done <<<"$OTHER_XCASSETS" 93 | 94 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${IPHONEOS_DEPLOYMENT_TARGET}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 95 | fi 96 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Dictater/Pods-Dictater-umbrella.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | 4 | FOUNDATION_EXPORT double Pods_DictaterVersionNumber; 5 | FOUNDATION_EXPORT const unsigned char Pods_DictaterVersionString[]; 6 | 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Dictater/Pods-Dictater.debug.xcconfig: -------------------------------------------------------------------------------- 1 | CODE_SIGN_IDENTITY = 2 | EMBEDDED_CONTENT_CONTAINS_SWIFT = YES 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/../Frameworks' '@loader_path/Frameworks' 5 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 6 | PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods-Dictater 7 | PODS_ROOT = ${SRCROOT}/Pods 8 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Dictater/Pods-Dictater.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_Dictater { 2 | umbrella header "Pods-Dictater-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-Dictater/Pods-Dictater.release.xcconfig: -------------------------------------------------------------------------------- 1 | CODE_SIGN_IDENTITY = 2 | EMBEDDED_CONTENT_CONTAINS_SWIFT = YES 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/../Frameworks' '@loader_path/Frameworks' 5 | OTHER_CFLAGS = $(inherited) -iquote "$CONFIGURATION_BUILD_DIR/ProgressKit.framework/Headers" 6 | OTHER_LDFLAGS = $(inherited) -framework "ProgressKit" 7 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 8 | PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods-Dictater 9 | PODS_ROOT = ${SRCROOT}/Pods -------------------------------------------------------------------------------- /Pods/Target Support Files/ProgressKit/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 0.4.1 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/ProgressKit/ProgressKit-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_ProgressKit : NSObject 3 | @end 4 | @implementation PodsDummy_ProgressKit 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/ProgressKit/ProgressKit-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | -------------------------------------------------------------------------------- /Pods/Target Support Files/ProgressKit/ProgressKit-umbrella.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | 4 | FOUNDATION_EXPORT double ProgressKitVersionNumber; 5 | FOUNDATION_EXPORT const unsigned char ProgressKitVersionString[]; 6 | 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/ProgressKit/ProgressKit.modulemap: -------------------------------------------------------------------------------- 1 | framework module ProgressKit { 2 | umbrella header "ProgressKit-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/ProgressKit/ProgressKit.xcconfig: -------------------------------------------------------------------------------- 1 | CODE_SIGN_IDENTITY = 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/ProgressKit" "${PODS_ROOT}/Headers/Public" 4 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 5 | PODS_ROOT = ${SRCROOT} 6 | SKIP_INSTALL = YES -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Dictater 2 | - Replacement for OS X's built-in Speech services. 3 | - [Download App](https://github.com/Nosrac/Dictater/releases/latest) 4 | 5 | ## Features 6 | - Pause the audio 7 | - Skip forward by sentences or paragraphs 8 | - Replay sentences 9 | - Progress Indicator 10 | - Teleprompter Mode - Read along with audio 11 | 12 | ![Example Image](https://raw.githubusercontent.com/Nosrac/Dictater/master/example.png) 13 | 14 | ![Teleprompter Example](https://raw.githubusercontent.com/Nosrac/Dictater/master/teleprompter.png) 15 | 16 | ## Usage 17 | - Select text, right click, and choose Dictate! 18 | - Dictate might be under Services, depending on how many services you already have installed 19 | ![Usage Image](https://raw.githubusercontent.com/Nosrac/Dictater/master/Dictater/usage.png) 20 | 21 | ## Scriptability 22 | - If you're comfortable in the Terminal app, you can open Dictater with a command like this: 23 | 24 | `> /Applications/Dictater.app/Contents/MacOS/Dictater "Speak this text!"` 25 | -------------------------------------------------------------------------------- /Updates/AppCast.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Dictater's Changelog 5 | https://raw.githubusercontent.com/Nosrac/Dictater/master/Updates/AppCast.xml 6 | Most recent changes with links to updates. 7 | en 8 | 9 | 10 | Version 1.2 11 | New Features 13 |
    14 |
  • Show remaining duration
  • 15 |
16 | 17 |

Bug Fixes

18 |
    19 |
  • Fix centering of icons
  • 20 |
  • Hide primary window when entering full screen via the teleprompter
  • 21 |
22 | ]]> 23 |
24 | Sun, 27 Sep 2015 16:01:15 -0500 25 | 26 |
27 | 28 | 29 | Version 1.1.1 30 | Bug Fixes 32 |
    33 |
  • Fixed teleprompter content size issue
  • 34 |
  • Fixed blinking scroll bar/cursor when using teleprompter
  • 35 |
36 | ]]> 37 |
38 | Thu, 24 Sep 2015 16:34:17 -0500 39 | 40 |
41 | 42 | 43 | Version 1.1 44 | New Features 46 |
    47 |
  • Support for in-app updates!
  • 48 |
49 | ]]> 50 |
51 | Wed, 23 Sep 2015 17:33:43 -0500 52 | 53 |
54 | 55 |
56 |
57 | -------------------------------------------------------------------------------- /example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/example.png -------------------------------------------------------------------------------- /teleprompter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nosrac/Dictater/42ed905af1b4dae6c05c246d495400831be43b2e/teleprompter.png --------------------------------------------------------------------------------