├── .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 | 
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 | 
54 | Progress indicators which animate indefinately are `Indeterminate Progress` Views.
55 |
56 | This are the set of Indeterminate Progress Indicators.
57 |
58 | ## CircularSnail
59 | 
60 |
61 | ## Rainbow
62 | 
63 | ## Crawler
64 | 
65 |
66 | ## Spinner
67 | 
68 |
69 | ## Shooting Stars
70 | 
71 |
72 | ## Rotating Arc
73 | 
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 | 
80 |
81 | ## Progress Bar
82 | 
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 | 
13 |
14 | 
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 | 
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
--------------------------------------------------------------------------------