├── .gitignore
└── WelcomeWindow
├── DocumentApp
├── AppDelegate.swift
├── Assets.xcassets
│ ├── AccentColor.colorset
│ │ └── Contents.json
│ ├── AppIcon.appiconset
│ │ ├── Contents.json
│ │ ├── icon_128x128.png
│ │ ├── icon_128x128@2x.png
│ │ ├── icon_16x16.png
│ │ ├── icon_16x16@2x.png
│ │ ├── icon_256x256.png
│ │ ├── icon_256x256@2x.png
│ │ ├── icon_32x32.png
│ │ ├── icon_32x32@2x.png
│ │ ├── icon_512x512.png
│ │ └── icon_512x512@2x.png
│ └── Contents.json
├── Base.lproj
│ ├── Document.xib
│ └── MainMenu.xib
├── Document.swift
├── DocumentApp.entitlements
├── DocumentController.swift
└── Info.plist
├── WelcomeFramework
├── Info.plist
└── WelcomeFramework.h
├── WelcomeWindow.xcodeproj
├── project.pbxproj
└── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ └── IDEWorkspaceChecks.plist
└── WelcomeWindow
├── AppDelegate.swift
├── Assets.xcassets
├── AccentColor.colorset
│ └── Contents.json
├── AppIcon.appiconset
│ └── Contents.json
├── Contents.json
├── Xcode.imageset
│ ├── Contents.json
│ └── Xcode.png
├── close.imageset
│ ├── Contents.json
│ ├── close.png
│ └── close@2x.png
└── close_hover.imageset
│ ├── Contents.json
│ ├── close_hover.png
│ └── close_hover@2x.png
├── Base.lproj
└── MainMenu.xib
├── Bundle+Extensions.swift
├── Defaults.swift
├── FileTableCellView.swift
├── FileTableCellView.xib
├── HoverButton.swift
├── Info.plist
├── MainWelcomeViewController.swift
├── MainWelcomeViewController.xib
├── RecentsTableViewController.swift
├── RecentsTableViewController.xib
├── SplitViewController.swift
├── TableView.swift
├── WelcomeConfiguration.swift
├── WelcomeWindow.entitlements
├── WelcomeWindowController.swift
└── WelcomeWindowController.xib
/.gitignore:
--------------------------------------------------------------------------------
1 | # Xcode
2 | #
3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
4 |
5 | ## Build generated
6 | build/
7 | DerivedData/
8 |
9 | ## Various settings
10 | *.pbxuser
11 | !default.pbxuser
12 | *.mode1v3
13 | !default.mode1v3
14 | *.mode2v3
15 | !default.mode2v3
16 | *.perspectivev3
17 | !default.perspectivev3
18 | xcuserdata/
19 | .DS_Store
20 |
21 | ## Other
22 | *.moved-aside
23 | *.xcuserstate
24 |
25 | ## Obj-C/Swift specific
26 | *.hmap
27 | *.ipa
28 | *.dSYM.zip
29 | *.dSYM
30 |
31 | # CocoaPods
32 | #
33 | # We recommend against adding the Pods directory to your .gitignore. However
34 | # you should judge for yourself, the pros and cons are mentioned at:
35 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
36 | #
37 | # Pods/
38 |
39 | # Carthage
40 | #
41 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
42 | # Carthage/Checkouts
43 |
44 | Carthage/Build
45 |
46 | # fastlane
47 | #
48 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
49 | # screenshots whenever they are needed.
50 | # For more information about the recommended setup visit:
51 | # https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md
52 |
53 | fastlane/report.xml
54 | fastlane/Preview.html
55 | fastlane/screenshots
56 | fastlane/test_output
57 |
58 | # Code Injection
59 | #
60 | # After new code Injection tools there's a generated folder /iOSInjectionProject
61 | # https://github.com/johnno1962/injectionforxcode
62 |
63 | iOSInjectionProject/
--------------------------------------------------------------------------------
/WelcomeWindow/DocumentApp/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // DocumentApp
4 | //
5 | // Created by Lucas Derraugh on 5/7/21.
6 | //
7 |
8 | import Cocoa
9 | import WelcomeFramework
10 |
11 | @main
12 | class AppDelegate: NSObject, NSApplicationDelegate {
13 |
14 | lazy var windowController = WelcomeWindowController(configuration: .defaultConfiguration())
15 |
16 | var documentController: DocumentController {
17 | return NSDocumentController.shared as! DocumentController
18 | }
19 |
20 | func applicationWillFinishLaunching(_ notification: Notification) {
21 | _ = DocumentController()
22 | }
23 |
24 | func applicationDidFinishLaunching(_ aNotification: Notification) {
25 | if !documentController.hasOpenedDocument {
26 | windowController.showWindow()
27 | }
28 | }
29 |
30 | func applicationWillTerminate(_ aNotification: Notification) {
31 | // Insert code here to tear down your application
32 | }
33 |
34 | func applicationShouldOpenUntitledFile(_ sender: NSApplication) -> Bool {
35 | false
36 | }
37 |
38 | func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool {
39 | if !flag {
40 | windowController.showWindow(force: true)
41 | }
42 | return true
43 | }
44 | }
45 |
46 |
--------------------------------------------------------------------------------
/WelcomeWindow/DocumentApp/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/WelcomeWindow/DocumentApp/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "icon_16x16.png",
5 | "idiom" : "mac",
6 | "scale" : "1x",
7 | "size" : "16x16"
8 | },
9 | {
10 | "filename" : "icon_16x16@2x.png",
11 | "idiom" : "mac",
12 | "scale" : "2x",
13 | "size" : "16x16"
14 | },
15 | {
16 | "filename" : "icon_32x32.png",
17 | "idiom" : "mac",
18 | "scale" : "1x",
19 | "size" : "32x32"
20 | },
21 | {
22 | "filename" : "icon_32x32@2x.png",
23 | "idiom" : "mac",
24 | "scale" : "2x",
25 | "size" : "32x32"
26 | },
27 | {
28 | "filename" : "icon_128x128.png",
29 | "idiom" : "mac",
30 | "scale" : "1x",
31 | "size" : "128x128"
32 | },
33 | {
34 | "filename" : "icon_128x128@2x.png",
35 | "idiom" : "mac",
36 | "scale" : "2x",
37 | "size" : "128x128"
38 | },
39 | {
40 | "filename" : "icon_256x256.png",
41 | "idiom" : "mac",
42 | "scale" : "1x",
43 | "size" : "256x256"
44 | },
45 | {
46 | "filename" : "icon_256x256@2x.png",
47 | "idiom" : "mac",
48 | "scale" : "2x",
49 | "size" : "256x256"
50 | },
51 | {
52 | "filename" : "icon_512x512.png",
53 | "idiom" : "mac",
54 | "scale" : "1x",
55 | "size" : "512x512"
56 | },
57 | {
58 | "filename" : "icon_512x512@2x.png",
59 | "idiom" : "mac",
60 | "scale" : "2x",
61 | "size" : "512x512"
62 | }
63 | ],
64 | "info" : {
65 | "author" : "xcode",
66 | "version" : 1
67 | }
68 | }
69 |
--------------------------------------------------------------------------------
/WelcomeWindow/DocumentApp/Assets.xcassets/AppIcon.appiconset/icon_128x128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasderraugh/AppleProg-BuildIt/0035852f9068cf18209eaf1a84b96a1a724dc9a7/WelcomeWindow/DocumentApp/Assets.xcassets/AppIcon.appiconset/icon_128x128.png
--------------------------------------------------------------------------------
/WelcomeWindow/DocumentApp/Assets.xcassets/AppIcon.appiconset/icon_128x128@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasderraugh/AppleProg-BuildIt/0035852f9068cf18209eaf1a84b96a1a724dc9a7/WelcomeWindow/DocumentApp/Assets.xcassets/AppIcon.appiconset/icon_128x128@2x.png
--------------------------------------------------------------------------------
/WelcomeWindow/DocumentApp/Assets.xcassets/AppIcon.appiconset/icon_16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasderraugh/AppleProg-BuildIt/0035852f9068cf18209eaf1a84b96a1a724dc9a7/WelcomeWindow/DocumentApp/Assets.xcassets/AppIcon.appiconset/icon_16x16.png
--------------------------------------------------------------------------------
/WelcomeWindow/DocumentApp/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasderraugh/AppleProg-BuildIt/0035852f9068cf18209eaf1a84b96a1a724dc9a7/WelcomeWindow/DocumentApp/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png
--------------------------------------------------------------------------------
/WelcomeWindow/DocumentApp/Assets.xcassets/AppIcon.appiconset/icon_256x256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasderraugh/AppleProg-BuildIt/0035852f9068cf18209eaf1a84b96a1a724dc9a7/WelcomeWindow/DocumentApp/Assets.xcassets/AppIcon.appiconset/icon_256x256.png
--------------------------------------------------------------------------------
/WelcomeWindow/DocumentApp/Assets.xcassets/AppIcon.appiconset/icon_256x256@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasderraugh/AppleProg-BuildIt/0035852f9068cf18209eaf1a84b96a1a724dc9a7/WelcomeWindow/DocumentApp/Assets.xcassets/AppIcon.appiconset/icon_256x256@2x.png
--------------------------------------------------------------------------------
/WelcomeWindow/DocumentApp/Assets.xcassets/AppIcon.appiconset/icon_32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasderraugh/AppleProg-BuildIt/0035852f9068cf18209eaf1a84b96a1a724dc9a7/WelcomeWindow/DocumentApp/Assets.xcassets/AppIcon.appiconset/icon_32x32.png
--------------------------------------------------------------------------------
/WelcomeWindow/DocumentApp/Assets.xcassets/AppIcon.appiconset/icon_32x32@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasderraugh/AppleProg-BuildIt/0035852f9068cf18209eaf1a84b96a1a724dc9a7/WelcomeWindow/DocumentApp/Assets.xcassets/AppIcon.appiconset/icon_32x32@2x.png
--------------------------------------------------------------------------------
/WelcomeWindow/DocumentApp/Assets.xcassets/AppIcon.appiconset/icon_512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasderraugh/AppleProg-BuildIt/0035852f9068cf18209eaf1a84b96a1a724dc9a7/WelcomeWindow/DocumentApp/Assets.xcassets/AppIcon.appiconset/icon_512x512.png
--------------------------------------------------------------------------------
/WelcomeWindow/DocumentApp/Assets.xcassets/AppIcon.appiconset/icon_512x512@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasderraugh/AppleProg-BuildIt/0035852f9068cf18209eaf1a84b96a1a724dc9a7/WelcomeWindow/DocumentApp/Assets.xcassets/AppIcon.appiconset/icon_512x512@2x.png
--------------------------------------------------------------------------------
/WelcomeWindow/DocumentApp/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/WelcomeWindow/DocumentApp/Base.lproj/Document.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/WelcomeWindow/DocumentApp/Base.lproj/MainMenu.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
677 |
678 |
679 |
--------------------------------------------------------------------------------
/WelcomeWindow/DocumentApp/Document.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Document.swift
3 | // DocumentApp
4 | //
5 | // Created by Lucas Derraugh on 5/7/21.
6 | //
7 |
8 | import Cocoa
9 |
10 | class Document: NSDocument {
11 |
12 | override init() {
13 | super.init()
14 | // Add your subclass-specific initialization here.
15 | }
16 |
17 | override class var autosavesInPlace: Bool {
18 | return true
19 | }
20 |
21 | override var windowNibName: NSNib.Name? {
22 | // Returns the nib file name of the document
23 | // If you need to use a subclass of NSWindowController or if your document supports multiple NSWindowControllers, you should remove this property and override -makeWindowControllers instead.
24 | return NSNib.Name("Document")
25 | }
26 |
27 | override func data(ofType typeName: String) throws -> Data {
28 | // Insert code here to write your document to data of the specified type, throwing an error in case of failure.
29 | // Alternatively, you could remove this method and override fileWrapper(ofType:), write(to:ofType:), or write(to:ofType:for:originalContentsURL:) instead.
30 | return Data()
31 | // throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
32 | }
33 |
34 | override func read(from data: Data, ofType typeName: String) throws {
35 | // Insert code here to read your document from the given data of the specified type, throwing an error in case of failure.
36 | // Alternatively, you could remove this method and override read(from:ofType:) instead.
37 | // If you do, you should also override isEntireFileLoaded to return false if the contents are lazily loaded.
38 | // throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
39 | }
40 |
41 |
42 | }
43 |
44 |
--------------------------------------------------------------------------------
/WelcomeWindow/DocumentApp/DocumentApp.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.security.app-sandbox
6 |
7 | com.apple.security.files.user-selected.read-write
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/WelcomeWindow/DocumentApp/DocumentController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DocumentController.swift
3 | // DocumentApp
4 | //
5 | // Created by Lucas Derraugh on 5/7/21.
6 | //
7 |
8 | import Cocoa
9 |
10 | class DocumentController: NSDocumentController {
11 |
12 | var hasOpenedDocument = false
13 |
14 | override func openDocument(withContentsOf url: URL, display displayDocument: Bool, completionHandler: @escaping (NSDocument?, Bool, Error?) -> Void) {
15 | hasOpenedDocument = true
16 | super.openDocument(withContentsOf: url, display: displayDocument, completionHandler: completionHandler)
17 | }
18 |
19 | override func reopenDocument(for urlOrNil: URL?, withContentsOf contentsURL: URL, display displayDocument: Bool, completionHandler: @escaping (NSDocument?, Bool, Error?) -> Void) {
20 | hasOpenedDocument = true
21 | super.reopenDocument(for: urlOrNil, withContentsOf: contentsURL, display: displayDocument, completionHandler: completionHandler)
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/WelcomeWindow/DocumentApp/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleDocumentTypes
8 |
9 |
10 | CFBundleTypeRole
11 | Editor
12 | LSItemContentTypes
13 |
14 | com.example.plain-text
15 |
16 | NSDocumentClass
17 | $(PRODUCT_MODULE_NAME).Document
18 |
19 |
20 | CFBundleExecutable
21 | $(EXECUTABLE_NAME)
22 | CFBundleIconFile
23 |
24 | CFBundleIdentifier
25 | $(PRODUCT_BUNDLE_IDENTIFIER)
26 | CFBundleInfoDictionaryVersion
27 | 6.0
28 | CFBundleName
29 | $(PRODUCT_NAME)
30 | CFBundlePackageType
31 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
32 | CFBundleShortVersionString
33 | 1.0
34 | CFBundleVersion
35 | 1
36 | LSMinimumSystemVersion
37 | $(MACOSX_DEPLOYMENT_TARGET)
38 | NSMainNibFile
39 | MainMenu
40 | NSPrincipalClass
41 | NSApplication
42 | UTImportedTypeDeclarations
43 |
44 |
45 | UTTypeConformsTo
46 |
47 | public.plain-text
48 |
49 | UTTypeDescription
50 | Example Text
51 | UTTypeIdentifier
52 | com.example.plain-text
53 | UTTypeTagSpecification
54 |
55 | public.filename-extension
56 |
57 | exampletext
58 |
59 |
60 |
61 |
62 |
63 |
64 |
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeFramework/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | $(CURRENT_PROJECT_VERSION)
21 |
22 |
23 |
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeFramework/WelcomeFramework.h:
--------------------------------------------------------------------------------
1 | //
2 | // WelcomeFramework.h
3 | // WelcomeFramework
4 | //
5 | // Created by Lucas Derraugh on 5/7/21.
6 | //
7 |
8 | #import
9 |
10 | //! Project version number for WelcomeFramework.
11 | FOUNDATION_EXPORT double WelcomeFrameworkVersionNumber;
12 |
13 | //! Project version string for WelcomeFramework.
14 | FOUNDATION_EXPORT const unsigned char WelcomeFrameworkVersionString[];
15 |
16 | // In this header, you should import all the public headers of your framework using statements like #import
17 |
18 |
19 |
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 50;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 1D0D2CE62645DB8000CF6162 /* WelcomeFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D590F1F2645D4F800202774 /* WelcomeFramework.framework */; };
11 | 1D0D2CE72645DB8000CF6162 /* WelcomeFramework.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1D590F1F2645D4F800202774 /* WelcomeFramework.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
12 | 1D0D2CEC2645DE3B00CF6162 /* DocumentController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D0D2CEB2645DE3B00CF6162 /* DocumentController.swift */; };
13 | 1D0D2CEE2645DF8D00CF6162 /* WelcomeConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D0D2CED2645DF8D00CF6162 /* WelcomeConfiguration.swift */; };
14 | 1D0D2CEF2645DF9000CF6162 /* WelcomeConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D0D2CED2645DF8D00CF6162 /* WelcomeConfiguration.swift */; };
15 | 1D590F232645D4F800202774 /* WelcomeFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D590F212645D4F800202774 /* WelcomeFramework.h */; settings = {ATTRIBUTES = (Public, ); }; };
16 | 1D590F262645D4F800202774 /* WelcomeFramework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D590F1F2645D4F800202774 /* WelcomeFramework.framework */; };
17 | 1D590F272645D4F800202774 /* WelcomeFramework.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1D590F1F2645D4F800202774 /* WelcomeFramework.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
18 | 1D590F2C2645D52700202774 /* WelcomeWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1D7C419925E7E7A8001EB157 /* WelcomeWindowController.xib */; };
19 | 1D590F2D2645D52700202774 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1D7C418B25E7E6FC001EB157 /* Assets.xcassets */; };
20 | 1D590F2E2645D52700202774 /* FileTableCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DA9948125FA63E400357A06 /* FileTableCellView.swift */; };
21 | 1D590F2F2645D52800202774 /* FileTableCellView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1DA9948225FA63E400357A06 /* FileTableCellView.xib */; };
22 | 1D590F302645D52800202774 /* Defaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DF42D052645C94A00FEF6ED /* Defaults.swift */; };
23 | 1D590F312645D52800202774 /* WelcomeWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D7C419825E7E7A8001EB157 /* WelcomeWindowController.swift */; };
24 | 1D590F322645D52800202774 /* MainWelcomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D7C419D25E7E92E001EB157 /* MainWelcomeViewController.swift */; };
25 | 1D590F332645D52800202774 /* TableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DA9947E25FA5F6100357A06 /* TableView.swift */; };
26 | 1D590F342645D52800202774 /* RecentsTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D7C41A225E7E93B001EB157 /* RecentsTableViewController.swift */; };
27 | 1D590F352645D52800202774 /* HoverButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DDDD4A925F129FF00C078EA /* HoverButton.swift */; };
28 | 1D590F362645D52800202774 /* Bundle+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DF42D042645C94A00FEF6ED /* Bundle+Extensions.swift */; };
29 | 1D590F372645D52800202774 /* RecentsTableViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1D7C41A325E7E93B001EB157 /* RecentsTableViewController.xib */; };
30 | 1D590F382645D52800202774 /* SplitViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D7C41A725E7EA0A001EB157 /* SplitViewController.swift */; };
31 | 1D590F392645D52800202774 /* MainWelcomeViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1D7C419E25E7E92E001EB157 /* MainWelcomeViewController.xib */; };
32 | 1D590F412645D55100202774 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D590F402645D55100202774 /* AppDelegate.swift */; };
33 | 1D590F432645D55100202774 /* Document.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D590F422645D55100202774 /* Document.swift */; };
34 | 1D590F462645D55100202774 /* Document.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1D590F442645D55100202774 /* Document.xib */; };
35 | 1D590F482645D55200202774 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1D590F472645D55200202774 /* Assets.xcassets */; };
36 | 1D590F4B2645D55200202774 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1D590F492645D55200202774 /* MainMenu.xib */; };
37 | 1D7C418A25E7E6FB001EB157 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D7C418925E7E6FB001EB157 /* AppDelegate.swift */; };
38 | 1D7C418C25E7E6FC001EB157 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1D7C418B25E7E6FC001EB157 /* Assets.xcassets */; };
39 | 1D7C418F25E7E6FC001EB157 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1D7C418D25E7E6FC001EB157 /* MainMenu.xib */; };
40 | 1D7C419A25E7E7A8001EB157 /* WelcomeWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D7C419825E7E7A8001EB157 /* WelcomeWindowController.swift */; };
41 | 1D7C419B25E7E7A8001EB157 /* WelcomeWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1D7C419925E7E7A8001EB157 /* WelcomeWindowController.xib */; };
42 | 1D7C419F25E7E92E001EB157 /* MainWelcomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D7C419D25E7E92E001EB157 /* MainWelcomeViewController.swift */; };
43 | 1D7C41A025E7E92E001EB157 /* MainWelcomeViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1D7C419E25E7E92E001EB157 /* MainWelcomeViewController.xib */; };
44 | 1D7C41A425E7E93B001EB157 /* RecentsTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D7C41A225E7E93B001EB157 /* RecentsTableViewController.swift */; };
45 | 1D7C41A525E7E93B001EB157 /* RecentsTableViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1D7C41A325E7E93B001EB157 /* RecentsTableViewController.xib */; };
46 | 1D7C41A825E7EA0A001EB157 /* SplitViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D7C41A725E7EA0A001EB157 /* SplitViewController.swift */; };
47 | 1DA9947F25FA5F6100357A06 /* TableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DA9947E25FA5F6100357A06 /* TableView.swift */; };
48 | 1DA9948325FA63E400357A06 /* FileTableCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DA9948125FA63E400357A06 /* FileTableCellView.swift */; };
49 | 1DA9948425FA63E400357A06 /* FileTableCellView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1DA9948225FA63E400357A06 /* FileTableCellView.xib */; };
50 | 1DDDD4AA25F129FF00C078EA /* HoverButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DDDD4A925F129FF00C078EA /* HoverButton.swift */; };
51 | 1DF42D062645C94A00FEF6ED /* Bundle+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DF42D042645C94A00FEF6ED /* Bundle+Extensions.swift */; };
52 | 1DF42D072645C94A00FEF6ED /* Defaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DF42D052645C94A00FEF6ED /* Defaults.swift */; };
53 | /* End PBXBuildFile section */
54 |
55 | /* Begin PBXContainerItemProxy section */
56 | 1D0D2CE82645DB8000CF6162 /* PBXContainerItemProxy */ = {
57 | isa = PBXContainerItemProxy;
58 | containerPortal = 1D7C417E25E7E6FB001EB157 /* Project object */;
59 | proxyType = 1;
60 | remoteGlobalIDString = 1D590F1E2645D4F800202774;
61 | remoteInfo = WelcomeFramework;
62 | };
63 | 1D590F242645D4F800202774 /* PBXContainerItemProxy */ = {
64 | isa = PBXContainerItemProxy;
65 | containerPortal = 1D7C417E25E7E6FB001EB157 /* Project object */;
66 | proxyType = 1;
67 | remoteGlobalIDString = 1D590F1E2645D4F800202774;
68 | remoteInfo = WelcomeFramework;
69 | };
70 | /* End PBXContainerItemProxy section */
71 |
72 | /* Begin PBXCopyFilesBuildPhase section */
73 | 1D0D2CEA2645DB8000CF6162 /* Embed Frameworks */ = {
74 | isa = PBXCopyFilesBuildPhase;
75 | buildActionMask = 2147483647;
76 | dstPath = "";
77 | dstSubfolderSpec = 10;
78 | files = (
79 | 1D0D2CE72645DB8000CF6162 /* WelcomeFramework.framework in Embed Frameworks */,
80 | );
81 | name = "Embed Frameworks";
82 | runOnlyForDeploymentPostprocessing = 0;
83 | };
84 | 1D590F282645D4F800202774 /* Embed Frameworks */ = {
85 | isa = PBXCopyFilesBuildPhase;
86 | buildActionMask = 2147483647;
87 | dstPath = "";
88 | dstSubfolderSpec = 10;
89 | files = (
90 | 1D590F272645D4F800202774 /* WelcomeFramework.framework in Embed Frameworks */,
91 | );
92 | name = "Embed Frameworks";
93 | runOnlyForDeploymentPostprocessing = 0;
94 | };
95 | /* End PBXCopyFilesBuildPhase section */
96 |
97 | /* Begin PBXFileReference section */
98 | 1D0D2CEB2645DE3B00CF6162 /* DocumentController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DocumentController.swift; sourceTree = ""; };
99 | 1D0D2CED2645DF8D00CF6162 /* WelcomeConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeConfiguration.swift; sourceTree = ""; };
100 | 1D590F1F2645D4F800202774 /* WelcomeFramework.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = WelcomeFramework.framework; sourceTree = BUILT_PRODUCTS_DIR; };
101 | 1D590F212645D4F800202774 /* WelcomeFramework.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WelcomeFramework.h; sourceTree = ""; };
102 | 1D590F222645D4F800202774 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
103 | 1D590F3E2645D55100202774 /* DocumentApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DocumentApp.app; sourceTree = BUILT_PRODUCTS_DIR; };
104 | 1D590F402645D55100202774 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
105 | 1D590F422645D55100202774 /* Document.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Document.swift; sourceTree = ""; };
106 | 1D590F452645D55100202774 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/Document.xib; sourceTree = ""; };
107 | 1D590F472645D55200202774 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
108 | 1D590F4A2645D55200202774 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; };
109 | 1D590F4C2645D55200202774 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
110 | 1D590F4D2645D55200202774 /* DocumentApp.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DocumentApp.entitlements; sourceTree = ""; };
111 | 1D7C418625E7E6FB001EB157 /* WelcomeWindow.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WelcomeWindow.app; sourceTree = BUILT_PRODUCTS_DIR; };
112 | 1D7C418925E7E6FB001EB157 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
113 | 1D7C418B25E7E6FC001EB157 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
114 | 1D7C418E25E7E6FC001EB157 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; };
115 | 1D7C419025E7E6FC001EB157 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
116 | 1D7C419125E7E6FC001EB157 /* WelcomeWindow.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = WelcomeWindow.entitlements; sourceTree = ""; };
117 | 1D7C419825E7E7A8001EB157 /* WelcomeWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeWindowController.swift; sourceTree = ""; };
118 | 1D7C419925E7E7A8001EB157 /* WelcomeWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = WelcomeWindowController.xib; sourceTree = ""; };
119 | 1D7C419D25E7E92E001EB157 /* MainWelcomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainWelcomeViewController.swift; sourceTree = ""; };
120 | 1D7C419E25E7E92E001EB157 /* MainWelcomeViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainWelcomeViewController.xib; sourceTree = ""; };
121 | 1D7C41A225E7E93B001EB157 /* RecentsTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecentsTableViewController.swift; sourceTree = ""; };
122 | 1D7C41A325E7E93B001EB157 /* RecentsTableViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = RecentsTableViewController.xib; sourceTree = ""; };
123 | 1D7C41A725E7EA0A001EB157 /* SplitViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplitViewController.swift; sourceTree = ""; };
124 | 1DA9947E25FA5F6100357A06 /* TableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableView.swift; sourceTree = ""; };
125 | 1DA9948125FA63E400357A06 /* FileTableCellView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FileTableCellView.swift; sourceTree = ""; };
126 | 1DA9948225FA63E400357A06 /* FileTableCellView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = FileTableCellView.xib; sourceTree = ""; };
127 | 1DDDD4A925F129FF00C078EA /* HoverButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HoverButton.swift; sourceTree = ""; };
128 | 1DF42D042645C94A00FEF6ED /* Bundle+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Bundle+Extensions.swift"; sourceTree = ""; };
129 | 1DF42D052645C94A00FEF6ED /* Defaults.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Defaults.swift; sourceTree = ""; };
130 | /* End PBXFileReference section */
131 |
132 | /* Begin PBXFrameworksBuildPhase section */
133 | 1D590F1C2645D4F800202774 /* Frameworks */ = {
134 | isa = PBXFrameworksBuildPhase;
135 | buildActionMask = 2147483647;
136 | files = (
137 | );
138 | runOnlyForDeploymentPostprocessing = 0;
139 | };
140 | 1D590F3B2645D55100202774 /* Frameworks */ = {
141 | isa = PBXFrameworksBuildPhase;
142 | buildActionMask = 2147483647;
143 | files = (
144 | 1D0D2CE62645DB8000CF6162 /* WelcomeFramework.framework in Frameworks */,
145 | );
146 | runOnlyForDeploymentPostprocessing = 0;
147 | };
148 | 1D7C418325E7E6FB001EB157 /* Frameworks */ = {
149 | isa = PBXFrameworksBuildPhase;
150 | buildActionMask = 2147483647;
151 | files = (
152 | 1D590F262645D4F800202774 /* WelcomeFramework.framework in Frameworks */,
153 | );
154 | runOnlyForDeploymentPostprocessing = 0;
155 | };
156 | /* End PBXFrameworksBuildPhase section */
157 |
158 | /* Begin PBXGroup section */
159 | 1D590F202645D4F800202774 /* WelcomeFramework */ = {
160 | isa = PBXGroup;
161 | children = (
162 | 1D590F212645D4F800202774 /* WelcomeFramework.h */,
163 | 1D590F222645D4F800202774 /* Info.plist */,
164 | );
165 | path = WelcomeFramework;
166 | sourceTree = "";
167 | };
168 | 1D590F3F2645D55100202774 /* DocumentApp */ = {
169 | isa = PBXGroup;
170 | children = (
171 | 1D590F402645D55100202774 /* AppDelegate.swift */,
172 | 1D0D2CEB2645DE3B00CF6162 /* DocumentController.swift */,
173 | 1D590F422645D55100202774 /* Document.swift */,
174 | 1D590F442645D55100202774 /* Document.xib */,
175 | 1D590F472645D55200202774 /* Assets.xcassets */,
176 | 1D590F492645D55200202774 /* MainMenu.xib */,
177 | 1D590F4C2645D55200202774 /* Info.plist */,
178 | 1D590F4D2645D55200202774 /* DocumentApp.entitlements */,
179 | );
180 | path = DocumentApp;
181 | sourceTree = "";
182 | };
183 | 1D590F512645D74D00202774 /* Frameworks */ = {
184 | isa = PBXGroup;
185 | children = (
186 | );
187 | name = Frameworks;
188 | sourceTree = "";
189 | };
190 | 1D7C417D25E7E6FB001EB157 = {
191 | isa = PBXGroup;
192 | children = (
193 | 1D7C418825E7E6FB001EB157 /* WelcomeWindow */,
194 | 1D590F202645D4F800202774 /* WelcomeFramework */,
195 | 1D590F3F2645D55100202774 /* DocumentApp */,
196 | 1D7C418725E7E6FB001EB157 /* Products */,
197 | 1D590F512645D74D00202774 /* Frameworks */,
198 | );
199 | sourceTree = "";
200 | };
201 | 1D7C418725E7E6FB001EB157 /* Products */ = {
202 | isa = PBXGroup;
203 | children = (
204 | 1D7C418625E7E6FB001EB157 /* WelcomeWindow.app */,
205 | 1D590F1F2645D4F800202774 /* WelcomeFramework.framework */,
206 | 1D590F3E2645D55100202774 /* DocumentApp.app */,
207 | );
208 | name = Products;
209 | sourceTree = "";
210 | };
211 | 1D7C418825E7E6FB001EB157 /* WelcomeWindow */ = {
212 | isa = PBXGroup;
213 | children = (
214 | 1D7C418925E7E6FB001EB157 /* AppDelegate.swift */,
215 | 1D0D2CED2645DF8D00CF6162 /* WelcomeConfiguration.swift */,
216 | 1D7C419825E7E7A8001EB157 /* WelcomeWindowController.swift */,
217 | 1D7C419925E7E7A8001EB157 /* WelcomeWindowController.xib */,
218 | 1D7C419D25E7E92E001EB157 /* MainWelcomeViewController.swift */,
219 | 1D7C419E25E7E92E001EB157 /* MainWelcomeViewController.xib */,
220 | 1D7C41A225E7E93B001EB157 /* RecentsTableViewController.swift */,
221 | 1D7C41A325E7E93B001EB157 /* RecentsTableViewController.xib */,
222 | 1D7C41A725E7EA0A001EB157 /* SplitViewController.swift */,
223 | 1DA9948125FA63E400357A06 /* FileTableCellView.swift */,
224 | 1DA9948225FA63E400357A06 /* FileTableCellView.xib */,
225 | 1DDDD4A925F129FF00C078EA /* HoverButton.swift */,
226 | 1DA9947E25FA5F6100357A06 /* TableView.swift */,
227 | 1DF42D042645C94A00FEF6ED /* Bundle+Extensions.swift */,
228 | 1DF42D052645C94A00FEF6ED /* Defaults.swift */,
229 | 1D7C418B25E7E6FC001EB157 /* Assets.xcassets */,
230 | 1D7C418D25E7E6FC001EB157 /* MainMenu.xib */,
231 | 1D7C419025E7E6FC001EB157 /* Info.plist */,
232 | 1D7C419125E7E6FC001EB157 /* WelcomeWindow.entitlements */,
233 | );
234 | path = WelcomeWindow;
235 | sourceTree = "";
236 | };
237 | /* End PBXGroup section */
238 |
239 | /* Begin PBXHeadersBuildPhase section */
240 | 1D590F1A2645D4F800202774 /* Headers */ = {
241 | isa = PBXHeadersBuildPhase;
242 | buildActionMask = 2147483647;
243 | files = (
244 | 1D590F232645D4F800202774 /* WelcomeFramework.h in Headers */,
245 | );
246 | runOnlyForDeploymentPostprocessing = 0;
247 | };
248 | /* End PBXHeadersBuildPhase section */
249 |
250 | /* Begin PBXNativeTarget section */
251 | 1D590F1E2645D4F800202774 /* WelcomeFramework */ = {
252 | isa = PBXNativeTarget;
253 | buildConfigurationList = 1D590F2B2645D4F800202774 /* Build configuration list for PBXNativeTarget "WelcomeFramework" */;
254 | buildPhases = (
255 | 1D590F1A2645D4F800202774 /* Headers */,
256 | 1D590F1B2645D4F800202774 /* Sources */,
257 | 1D590F1C2645D4F800202774 /* Frameworks */,
258 | 1D590F1D2645D4F800202774 /* Resources */,
259 | );
260 | buildRules = (
261 | );
262 | dependencies = (
263 | );
264 | name = WelcomeFramework;
265 | productName = WelcomeFramework;
266 | productReference = 1D590F1F2645D4F800202774 /* WelcomeFramework.framework */;
267 | productType = "com.apple.product-type.framework";
268 | };
269 | 1D590F3D2645D55100202774 /* DocumentApp */ = {
270 | isa = PBXNativeTarget;
271 | buildConfigurationList = 1D590F4E2645D55200202774 /* Build configuration list for PBXNativeTarget "DocumentApp" */;
272 | buildPhases = (
273 | 1D590F3A2645D55100202774 /* Sources */,
274 | 1D590F3B2645D55100202774 /* Frameworks */,
275 | 1D590F3C2645D55100202774 /* Resources */,
276 | 1D0D2CEA2645DB8000CF6162 /* Embed Frameworks */,
277 | );
278 | buildRules = (
279 | );
280 | dependencies = (
281 | 1D0D2CE92645DB8000CF6162 /* PBXTargetDependency */,
282 | );
283 | name = DocumentApp;
284 | productName = DocumentApp;
285 | productReference = 1D590F3E2645D55100202774 /* DocumentApp.app */;
286 | productType = "com.apple.product-type.application";
287 | };
288 | 1D7C418525E7E6FB001EB157 /* WelcomeWindow */ = {
289 | isa = PBXNativeTarget;
290 | buildConfigurationList = 1D7C419425E7E6FC001EB157 /* Build configuration list for PBXNativeTarget "WelcomeWindow" */;
291 | buildPhases = (
292 | 1D7C418225E7E6FB001EB157 /* Sources */,
293 | 1D7C418325E7E6FB001EB157 /* Frameworks */,
294 | 1D7C418425E7E6FB001EB157 /* Resources */,
295 | 1D590F282645D4F800202774 /* Embed Frameworks */,
296 | );
297 | buildRules = (
298 | );
299 | dependencies = (
300 | 1D590F252645D4F800202774 /* PBXTargetDependency */,
301 | );
302 | name = WelcomeWindow;
303 | productName = WelcomeWindow;
304 | productReference = 1D7C418625E7E6FB001EB157 /* WelcomeWindow.app */;
305 | productType = "com.apple.product-type.application";
306 | };
307 | /* End PBXNativeTarget section */
308 |
309 | /* Begin PBXProject section */
310 | 1D7C417E25E7E6FB001EB157 /* Project object */ = {
311 | isa = PBXProject;
312 | attributes = {
313 | LastSwiftUpdateCheck = 1250;
314 | LastUpgradeCheck = 1240;
315 | TargetAttributes = {
316 | 1D590F1E2645D4F800202774 = {
317 | CreatedOnToolsVersion = 12.5;
318 | };
319 | 1D590F3D2645D55100202774 = {
320 | CreatedOnToolsVersion = 12.5;
321 | };
322 | 1D7C418525E7E6FB001EB157 = {
323 | CreatedOnToolsVersion = 12.4;
324 | };
325 | };
326 | };
327 | buildConfigurationList = 1D7C418125E7E6FB001EB157 /* Build configuration list for PBXProject "WelcomeWindow" */;
328 | compatibilityVersion = "Xcode 9.3";
329 | developmentRegion = en;
330 | hasScannedForEncodings = 0;
331 | knownRegions = (
332 | en,
333 | Base,
334 | );
335 | mainGroup = 1D7C417D25E7E6FB001EB157;
336 | productRefGroup = 1D7C418725E7E6FB001EB157 /* Products */;
337 | projectDirPath = "";
338 | projectRoot = "";
339 | targets = (
340 | 1D7C418525E7E6FB001EB157 /* WelcomeWindow */,
341 | 1D590F1E2645D4F800202774 /* WelcomeFramework */,
342 | 1D590F3D2645D55100202774 /* DocumentApp */,
343 | );
344 | };
345 | /* End PBXProject section */
346 |
347 | /* Begin PBXResourcesBuildPhase section */
348 | 1D590F1D2645D4F800202774 /* Resources */ = {
349 | isa = PBXResourcesBuildPhase;
350 | buildActionMask = 2147483647;
351 | files = (
352 | 1D590F2D2645D52700202774 /* Assets.xcassets in Resources */,
353 | 1D590F2C2645D52700202774 /* WelcomeWindowController.xib in Resources */,
354 | 1D590F372645D52800202774 /* RecentsTableViewController.xib in Resources */,
355 | 1D590F2F2645D52800202774 /* FileTableCellView.xib in Resources */,
356 | 1D590F392645D52800202774 /* MainWelcomeViewController.xib in Resources */,
357 | );
358 | runOnlyForDeploymentPostprocessing = 0;
359 | };
360 | 1D590F3C2645D55100202774 /* Resources */ = {
361 | isa = PBXResourcesBuildPhase;
362 | buildActionMask = 2147483647;
363 | files = (
364 | 1D590F482645D55200202774 /* Assets.xcassets in Resources */,
365 | 1D590F462645D55100202774 /* Document.xib in Resources */,
366 | 1D590F4B2645D55200202774 /* MainMenu.xib in Resources */,
367 | );
368 | runOnlyForDeploymentPostprocessing = 0;
369 | };
370 | 1D7C418425E7E6FB001EB157 /* Resources */ = {
371 | isa = PBXResourcesBuildPhase;
372 | buildActionMask = 2147483647;
373 | files = (
374 | 1D7C418C25E7E6FC001EB157 /* Assets.xcassets in Resources */,
375 | 1D7C418F25E7E6FC001EB157 /* MainMenu.xib in Resources */,
376 | 1D7C41A525E7E93B001EB157 /* RecentsTableViewController.xib in Resources */,
377 | 1D7C41A025E7E92E001EB157 /* MainWelcomeViewController.xib in Resources */,
378 | 1D7C419B25E7E7A8001EB157 /* WelcomeWindowController.xib in Resources */,
379 | 1DA9948425FA63E400357A06 /* FileTableCellView.xib in Resources */,
380 | );
381 | runOnlyForDeploymentPostprocessing = 0;
382 | };
383 | /* End PBXResourcesBuildPhase section */
384 |
385 | /* Begin PBXSourcesBuildPhase section */
386 | 1D590F1B2645D4F800202774 /* Sources */ = {
387 | isa = PBXSourcesBuildPhase;
388 | buildActionMask = 2147483647;
389 | files = (
390 | 1D590F2E2645D52700202774 /* FileTableCellView.swift in Sources */,
391 | 1D590F332645D52800202774 /* TableView.swift in Sources */,
392 | 1D590F342645D52800202774 /* RecentsTableViewController.swift in Sources */,
393 | 1D0D2CEF2645DF9000CF6162 /* WelcomeConfiguration.swift in Sources */,
394 | 1D590F312645D52800202774 /* WelcomeWindowController.swift in Sources */,
395 | 1D590F352645D52800202774 /* HoverButton.swift in Sources */,
396 | 1D590F382645D52800202774 /* SplitViewController.swift in Sources */,
397 | 1D590F322645D52800202774 /* MainWelcomeViewController.swift in Sources */,
398 | 1D590F302645D52800202774 /* Defaults.swift in Sources */,
399 | 1D590F362645D52800202774 /* Bundle+Extensions.swift in Sources */,
400 | );
401 | runOnlyForDeploymentPostprocessing = 0;
402 | };
403 | 1D590F3A2645D55100202774 /* Sources */ = {
404 | isa = PBXSourcesBuildPhase;
405 | buildActionMask = 2147483647;
406 | files = (
407 | 1D590F432645D55100202774 /* Document.swift in Sources */,
408 | 1D590F412645D55100202774 /* AppDelegate.swift in Sources */,
409 | 1D0D2CEC2645DE3B00CF6162 /* DocumentController.swift in Sources */,
410 | );
411 | runOnlyForDeploymentPostprocessing = 0;
412 | };
413 | 1D7C418225E7E6FB001EB157 /* Sources */ = {
414 | isa = PBXSourcesBuildPhase;
415 | buildActionMask = 2147483647;
416 | files = (
417 | 1DDDD4AA25F129FF00C078EA /* HoverButton.swift in Sources */,
418 | 1D7C41A825E7EA0A001EB157 /* SplitViewController.swift in Sources */,
419 | 1D7C41A425E7E93B001EB157 /* RecentsTableViewController.swift in Sources */,
420 | 1DF42D062645C94A00FEF6ED /* Bundle+Extensions.swift in Sources */,
421 | 1D0D2CEE2645DF8D00CF6162 /* WelcomeConfiguration.swift in Sources */,
422 | 1DA9947F25FA5F6100357A06 /* TableView.swift in Sources */,
423 | 1D7C419A25E7E7A8001EB157 /* WelcomeWindowController.swift in Sources */,
424 | 1DA9948325FA63E400357A06 /* FileTableCellView.swift in Sources */,
425 | 1DF42D072645C94A00FEF6ED /* Defaults.swift in Sources */,
426 | 1D7C418A25E7E6FB001EB157 /* AppDelegate.swift in Sources */,
427 | 1D7C419F25E7E92E001EB157 /* MainWelcomeViewController.swift in Sources */,
428 | );
429 | runOnlyForDeploymentPostprocessing = 0;
430 | };
431 | /* End PBXSourcesBuildPhase section */
432 |
433 | /* Begin PBXTargetDependency section */
434 | 1D0D2CE92645DB8000CF6162 /* PBXTargetDependency */ = {
435 | isa = PBXTargetDependency;
436 | target = 1D590F1E2645D4F800202774 /* WelcomeFramework */;
437 | targetProxy = 1D0D2CE82645DB8000CF6162 /* PBXContainerItemProxy */;
438 | };
439 | 1D590F252645D4F800202774 /* PBXTargetDependency */ = {
440 | isa = PBXTargetDependency;
441 | target = 1D590F1E2645D4F800202774 /* WelcomeFramework */;
442 | targetProxy = 1D590F242645D4F800202774 /* PBXContainerItemProxy */;
443 | };
444 | /* End PBXTargetDependency section */
445 |
446 | /* Begin PBXVariantGroup section */
447 | 1D590F442645D55100202774 /* Document.xib */ = {
448 | isa = PBXVariantGroup;
449 | children = (
450 | 1D590F452645D55100202774 /* Base */,
451 | );
452 | name = Document.xib;
453 | sourceTree = "";
454 | };
455 | 1D590F492645D55200202774 /* MainMenu.xib */ = {
456 | isa = PBXVariantGroup;
457 | children = (
458 | 1D590F4A2645D55200202774 /* Base */,
459 | );
460 | name = MainMenu.xib;
461 | sourceTree = "";
462 | };
463 | 1D7C418D25E7E6FC001EB157 /* MainMenu.xib */ = {
464 | isa = PBXVariantGroup;
465 | children = (
466 | 1D7C418E25E7E6FC001EB157 /* Base */,
467 | );
468 | name = MainMenu.xib;
469 | sourceTree = "";
470 | };
471 | /* End PBXVariantGroup section */
472 |
473 | /* Begin XCBuildConfiguration section */
474 | 1D590F292645D4F800202774 /* Debug */ = {
475 | isa = XCBuildConfiguration;
476 | buildSettings = {
477 | CODE_SIGN_STYLE = Automatic;
478 | COMBINE_HIDPI_IMAGES = YES;
479 | CURRENT_PROJECT_VERSION = 1;
480 | DEFINES_MODULE = YES;
481 | DEVELOPMENT_TEAM = FP44AY6HHW;
482 | DYLIB_COMPATIBILITY_VERSION = 1;
483 | DYLIB_CURRENT_VERSION = 1;
484 | DYLIB_INSTALL_NAME_BASE = "@rpath";
485 | INFOPLIST_FILE = WelcomeFramework/Info.plist;
486 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
487 | LD_RUNPATH_SEARCH_PATHS = (
488 | "$(inherited)",
489 | "@executable_path/../Frameworks",
490 | "@loader_path/Frameworks",
491 | );
492 | MACOSX_DEPLOYMENT_TARGET = 11.3;
493 | PRODUCT_BUNDLE_IDENTIFIER = com.lucasderraugh.WelcomeFramework;
494 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
495 | SKIP_INSTALL = YES;
496 | SWIFT_VERSION = 5.0;
497 | VERSIONING_SYSTEM = "apple-generic";
498 | VERSION_INFO_PREFIX = "";
499 | };
500 | name = Debug;
501 | };
502 | 1D590F2A2645D4F800202774 /* Release */ = {
503 | isa = XCBuildConfiguration;
504 | buildSettings = {
505 | CODE_SIGN_STYLE = Automatic;
506 | COMBINE_HIDPI_IMAGES = YES;
507 | CURRENT_PROJECT_VERSION = 1;
508 | DEFINES_MODULE = YES;
509 | DEVELOPMENT_TEAM = FP44AY6HHW;
510 | DYLIB_COMPATIBILITY_VERSION = 1;
511 | DYLIB_CURRENT_VERSION = 1;
512 | DYLIB_INSTALL_NAME_BASE = "@rpath";
513 | INFOPLIST_FILE = WelcomeFramework/Info.plist;
514 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
515 | LD_RUNPATH_SEARCH_PATHS = (
516 | "$(inherited)",
517 | "@executable_path/../Frameworks",
518 | "@loader_path/Frameworks",
519 | );
520 | MACOSX_DEPLOYMENT_TARGET = 11.3;
521 | PRODUCT_BUNDLE_IDENTIFIER = com.lucasderraugh.WelcomeFramework;
522 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
523 | SKIP_INSTALL = YES;
524 | SWIFT_VERSION = 5.0;
525 | VERSIONING_SYSTEM = "apple-generic";
526 | VERSION_INFO_PREFIX = "";
527 | };
528 | name = Release;
529 | };
530 | 1D590F4F2645D55200202774 /* Debug */ = {
531 | isa = XCBuildConfiguration;
532 | buildSettings = {
533 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
534 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
535 | CODE_SIGN_ENTITLEMENTS = DocumentApp/DocumentApp.entitlements;
536 | CODE_SIGN_STYLE = Automatic;
537 | COMBINE_HIDPI_IMAGES = YES;
538 | DEVELOPMENT_TEAM = FP44AY6HHW;
539 | ENABLE_HARDENED_RUNTIME = YES;
540 | INFOPLIST_FILE = DocumentApp/Info.plist;
541 | LD_RUNPATH_SEARCH_PATHS = (
542 | "$(inherited)",
543 | "@executable_path/../Frameworks",
544 | );
545 | MACOSX_DEPLOYMENT_TARGET = 11.3;
546 | PRODUCT_BUNDLE_IDENTIFIER = com.lucasderraugh.DocumentApp;
547 | PRODUCT_NAME = "$(TARGET_NAME)";
548 | SWIFT_VERSION = 5.0;
549 | };
550 | name = Debug;
551 | };
552 | 1D590F502645D55200202774 /* Release */ = {
553 | isa = XCBuildConfiguration;
554 | buildSettings = {
555 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
556 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
557 | CODE_SIGN_ENTITLEMENTS = DocumentApp/DocumentApp.entitlements;
558 | CODE_SIGN_STYLE = Automatic;
559 | COMBINE_HIDPI_IMAGES = YES;
560 | DEVELOPMENT_TEAM = FP44AY6HHW;
561 | ENABLE_HARDENED_RUNTIME = YES;
562 | INFOPLIST_FILE = DocumentApp/Info.plist;
563 | LD_RUNPATH_SEARCH_PATHS = (
564 | "$(inherited)",
565 | "@executable_path/../Frameworks",
566 | );
567 | MACOSX_DEPLOYMENT_TARGET = 11.3;
568 | PRODUCT_BUNDLE_IDENTIFIER = com.lucasderraugh.DocumentApp;
569 | PRODUCT_NAME = "$(TARGET_NAME)";
570 | SWIFT_VERSION = 5.0;
571 | };
572 | name = Release;
573 | };
574 | 1D7C419225E7E6FC001EB157 /* Debug */ = {
575 | isa = XCBuildConfiguration;
576 | buildSettings = {
577 | ALWAYS_SEARCH_USER_PATHS = NO;
578 | CLANG_ANALYZER_NONNULL = YES;
579 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
580 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
581 | CLANG_CXX_LIBRARY = "libc++";
582 | CLANG_ENABLE_MODULES = YES;
583 | CLANG_ENABLE_OBJC_ARC = YES;
584 | CLANG_ENABLE_OBJC_WEAK = YES;
585 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
586 | CLANG_WARN_BOOL_CONVERSION = YES;
587 | CLANG_WARN_COMMA = YES;
588 | CLANG_WARN_CONSTANT_CONVERSION = YES;
589 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
590 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
591 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
592 | CLANG_WARN_EMPTY_BODY = YES;
593 | CLANG_WARN_ENUM_CONVERSION = YES;
594 | CLANG_WARN_INFINITE_RECURSION = YES;
595 | CLANG_WARN_INT_CONVERSION = YES;
596 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
597 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
598 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
599 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
600 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
601 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
602 | CLANG_WARN_STRICT_PROTOTYPES = YES;
603 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
604 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
605 | CLANG_WARN_UNREACHABLE_CODE = YES;
606 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
607 | COPY_PHASE_STRIP = NO;
608 | DEBUG_INFORMATION_FORMAT = dwarf;
609 | ENABLE_STRICT_OBJC_MSGSEND = YES;
610 | ENABLE_TESTABILITY = YES;
611 | GCC_C_LANGUAGE_STANDARD = gnu11;
612 | GCC_DYNAMIC_NO_PIC = NO;
613 | GCC_NO_COMMON_BLOCKS = YES;
614 | GCC_OPTIMIZATION_LEVEL = 0;
615 | GCC_PREPROCESSOR_DEFINITIONS = (
616 | "DEBUG=1",
617 | "$(inherited)",
618 | );
619 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
620 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
621 | GCC_WARN_UNDECLARED_SELECTOR = YES;
622 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
623 | GCC_WARN_UNUSED_FUNCTION = YES;
624 | GCC_WARN_UNUSED_VARIABLE = YES;
625 | MACOSX_DEPLOYMENT_TARGET = 11.1;
626 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
627 | MTL_FAST_MATH = YES;
628 | ONLY_ACTIVE_ARCH = YES;
629 | SDKROOT = macosx;
630 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
631 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
632 | };
633 | name = Debug;
634 | };
635 | 1D7C419325E7E6FC001EB157 /* Release */ = {
636 | isa = XCBuildConfiguration;
637 | buildSettings = {
638 | ALWAYS_SEARCH_USER_PATHS = NO;
639 | CLANG_ANALYZER_NONNULL = YES;
640 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
641 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
642 | CLANG_CXX_LIBRARY = "libc++";
643 | CLANG_ENABLE_MODULES = YES;
644 | CLANG_ENABLE_OBJC_ARC = YES;
645 | CLANG_ENABLE_OBJC_WEAK = YES;
646 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
647 | CLANG_WARN_BOOL_CONVERSION = YES;
648 | CLANG_WARN_COMMA = YES;
649 | CLANG_WARN_CONSTANT_CONVERSION = YES;
650 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
651 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
652 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
653 | CLANG_WARN_EMPTY_BODY = YES;
654 | CLANG_WARN_ENUM_CONVERSION = YES;
655 | CLANG_WARN_INFINITE_RECURSION = YES;
656 | CLANG_WARN_INT_CONVERSION = YES;
657 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
658 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
659 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
660 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
661 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
662 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
663 | CLANG_WARN_STRICT_PROTOTYPES = YES;
664 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
665 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
666 | CLANG_WARN_UNREACHABLE_CODE = YES;
667 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
668 | COPY_PHASE_STRIP = NO;
669 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
670 | ENABLE_NS_ASSERTIONS = NO;
671 | ENABLE_STRICT_OBJC_MSGSEND = YES;
672 | GCC_C_LANGUAGE_STANDARD = gnu11;
673 | GCC_NO_COMMON_BLOCKS = YES;
674 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
675 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
676 | GCC_WARN_UNDECLARED_SELECTOR = YES;
677 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
678 | GCC_WARN_UNUSED_FUNCTION = YES;
679 | GCC_WARN_UNUSED_VARIABLE = YES;
680 | MACOSX_DEPLOYMENT_TARGET = 11.1;
681 | MTL_ENABLE_DEBUG_INFO = NO;
682 | MTL_FAST_MATH = YES;
683 | SDKROOT = macosx;
684 | SWIFT_COMPILATION_MODE = wholemodule;
685 | SWIFT_OPTIMIZATION_LEVEL = "-O";
686 | };
687 | name = Release;
688 | };
689 | 1D7C419525E7E6FC001EB157 /* Debug */ = {
690 | isa = XCBuildConfiguration;
691 | buildSettings = {
692 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
693 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
694 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
695 | CODE_SIGN_ENTITLEMENTS = WelcomeWindow/WelcomeWindow.entitlements;
696 | CODE_SIGN_STYLE = Automatic;
697 | COMBINE_HIDPI_IMAGES = YES;
698 | DEVELOPMENT_TEAM = FP44AY6HHW;
699 | ENABLE_HARDENED_RUNTIME = YES;
700 | INFOPLIST_FILE = WelcomeWindow/Info.plist;
701 | LD_RUNPATH_SEARCH_PATHS = (
702 | "$(inherited)",
703 | "@executable_path/../Frameworks",
704 | );
705 | PRODUCT_BUNDLE_IDENTIFIER = com.lucasderraugh.WelcomeWindow;
706 | PRODUCT_NAME = "$(TARGET_NAME)";
707 | SWIFT_VERSION = 5.0;
708 | };
709 | name = Debug;
710 | };
711 | 1D7C419625E7E6FC001EB157 /* Release */ = {
712 | isa = XCBuildConfiguration;
713 | buildSettings = {
714 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
715 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
716 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
717 | CODE_SIGN_ENTITLEMENTS = WelcomeWindow/WelcomeWindow.entitlements;
718 | CODE_SIGN_STYLE = Automatic;
719 | COMBINE_HIDPI_IMAGES = YES;
720 | DEVELOPMENT_TEAM = FP44AY6HHW;
721 | ENABLE_HARDENED_RUNTIME = YES;
722 | INFOPLIST_FILE = WelcomeWindow/Info.plist;
723 | LD_RUNPATH_SEARCH_PATHS = (
724 | "$(inherited)",
725 | "@executable_path/../Frameworks",
726 | );
727 | PRODUCT_BUNDLE_IDENTIFIER = com.lucasderraugh.WelcomeWindow;
728 | PRODUCT_NAME = "$(TARGET_NAME)";
729 | SWIFT_VERSION = 5.0;
730 | };
731 | name = Release;
732 | };
733 | /* End XCBuildConfiguration section */
734 |
735 | /* Begin XCConfigurationList section */
736 | 1D590F2B2645D4F800202774 /* Build configuration list for PBXNativeTarget "WelcomeFramework" */ = {
737 | isa = XCConfigurationList;
738 | buildConfigurations = (
739 | 1D590F292645D4F800202774 /* Debug */,
740 | 1D590F2A2645D4F800202774 /* Release */,
741 | );
742 | defaultConfigurationIsVisible = 0;
743 | defaultConfigurationName = Release;
744 | };
745 | 1D590F4E2645D55200202774 /* Build configuration list for PBXNativeTarget "DocumentApp" */ = {
746 | isa = XCConfigurationList;
747 | buildConfigurations = (
748 | 1D590F4F2645D55200202774 /* Debug */,
749 | 1D590F502645D55200202774 /* Release */,
750 | );
751 | defaultConfigurationIsVisible = 0;
752 | defaultConfigurationName = Release;
753 | };
754 | 1D7C418125E7E6FB001EB157 /* Build configuration list for PBXProject "WelcomeWindow" */ = {
755 | isa = XCConfigurationList;
756 | buildConfigurations = (
757 | 1D7C419225E7E6FC001EB157 /* Debug */,
758 | 1D7C419325E7E6FC001EB157 /* Release */,
759 | );
760 | defaultConfigurationIsVisible = 0;
761 | defaultConfigurationName = Release;
762 | };
763 | 1D7C419425E7E6FC001EB157 /* Build configuration list for PBXNativeTarget "WelcomeWindow" */ = {
764 | isa = XCConfigurationList;
765 | buildConfigurations = (
766 | 1D7C419525E7E6FC001EB157 /* Debug */,
767 | 1D7C419625E7E6FC001EB157 /* Release */,
768 | );
769 | defaultConfigurationIsVisible = 0;
770 | defaultConfigurationName = Release;
771 | };
772 | /* End XCConfigurationList section */
773 | };
774 | rootObject = 1D7C417E25E7E6FB001EB157 /* Project object */;
775 | }
776 |
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // WelcomeWindow
4 | //
5 | // Created by Lucas Derraugh on 2/25/21.
6 | //
7 |
8 | import Cocoa
9 |
10 | @main
11 | class AppDelegate: NSObject, NSApplicationDelegate {
12 |
13 | lazy var welcomeWindowController = WelcomeWindowController()
14 |
15 | func applicationDidFinishLaunching(_ aNotification: Notification) {
16 | welcomeWindowController.showWindow(force: true)
17 | }
18 | }
19 |
20 |
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "mac",
5 | "scale" : "1x",
6 | "size" : "16x16"
7 | },
8 | {
9 | "idiom" : "mac",
10 | "scale" : "2x",
11 | "size" : "16x16"
12 | },
13 | {
14 | "idiom" : "mac",
15 | "scale" : "1x",
16 | "size" : "32x32"
17 | },
18 | {
19 | "idiom" : "mac",
20 | "scale" : "2x",
21 | "size" : "32x32"
22 | },
23 | {
24 | "idiom" : "mac",
25 | "scale" : "1x",
26 | "size" : "128x128"
27 | },
28 | {
29 | "idiom" : "mac",
30 | "scale" : "2x",
31 | "size" : "128x128"
32 | },
33 | {
34 | "idiom" : "mac",
35 | "scale" : "1x",
36 | "size" : "256x256"
37 | },
38 | {
39 | "idiom" : "mac",
40 | "scale" : "2x",
41 | "size" : "256x256"
42 | },
43 | {
44 | "idiom" : "mac",
45 | "scale" : "1x",
46 | "size" : "512x512"
47 | },
48 | {
49 | "idiom" : "mac",
50 | "scale" : "2x",
51 | "size" : "512x512"
52 | }
53 | ],
54 | "info" : {
55 | "author" : "xcode",
56 | "version" : 1
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow/Assets.xcassets/Xcode.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "Xcode.png",
5 | "idiom" : "universal"
6 | }
7 | ],
8 | "info" : {
9 | "author" : "xcode",
10 | "version" : 1
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow/Assets.xcassets/Xcode.imageset/Xcode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasderraugh/AppleProg-BuildIt/0035852f9068cf18209eaf1a84b96a1a724dc9a7/WelcomeWindow/WelcomeWindow/Assets.xcassets/Xcode.imageset/Xcode.png
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow/Assets.xcassets/close.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "close.png",
5 | "idiom" : "mac",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "close@2x.png",
10 | "idiom" : "mac",
11 | "scale" : "2x"
12 | }
13 | ],
14 | "info" : {
15 | "author" : "xcode",
16 | "version" : 1
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow/Assets.xcassets/close.imageset/close.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasderraugh/AppleProg-BuildIt/0035852f9068cf18209eaf1a84b96a1a724dc9a7/WelcomeWindow/WelcomeWindow/Assets.xcassets/close.imageset/close.png
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow/Assets.xcassets/close.imageset/close@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasderraugh/AppleProg-BuildIt/0035852f9068cf18209eaf1a84b96a1a724dc9a7/WelcomeWindow/WelcomeWindow/Assets.xcassets/close.imageset/close@2x.png
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow/Assets.xcassets/close_hover.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "filename" : "close_hover.png",
5 | "idiom" : "mac",
6 | "scale" : "1x"
7 | },
8 | {
9 | "filename" : "close_hover@2x.png",
10 | "idiom" : "mac",
11 | "scale" : "2x"
12 | }
13 | ],
14 | "info" : {
15 | "author" : "xcode",
16 | "version" : 1
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow/Assets.xcassets/close_hover.imageset/close_hover.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasderraugh/AppleProg-BuildIt/0035852f9068cf18209eaf1a84b96a1a724dc9a7/WelcomeWindow/WelcomeWindow/Assets.xcassets/close_hover.imageset/close_hover.png
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow/Assets.xcassets/close_hover.imageset/close_hover@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasderraugh/AppleProg-BuildIt/0035852f9068cf18209eaf1a84b96a1a724dc9a7/WelcomeWindow/WelcomeWindow/Assets.xcassets/close_hover.imageset/close_hover@2x.png
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow/Base.lproj/MainMenu.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
259 |
260 |
261 |
262 |
263 |
264 |
265 |
266 |
267 |
268 |
269 |
270 |
271 |
272 |
273 |
274 |
275 |
276 |
277 |
278 |
279 |
280 |
281 |
282 |
283 |
284 |
285 |
286 |
287 |
288 |
289 |
290 |
291 |
292 |
293 |
294 |
295 |
296 |
297 |
298 |
299 |
300 |
301 |
302 |
303 |
304 |
305 |
306 |
307 |
308 |
309 |
310 |
311 |
312 |
313 |
314 |
315 |
316 |
317 |
318 |
319 |
320 |
321 |
322 |
323 |
324 |
325 |
326 |
327 |
328 |
329 |
330 |
331 |
332 |
333 |
334 |
335 |
336 |
337 |
338 |
339 |
340 |
341 |
342 |
343 |
344 |
345 |
346 |
347 |
348 |
349 |
350 |
351 |
352 |
353 |
354 |
355 |
356 |
357 |
358 |
359 |
360 |
361 |
362 |
363 |
364 |
365 |
366 |
367 |
368 |
369 |
370 |
371 |
372 |
373 |
374 |
375 |
376 |
377 |
378 |
379 |
380 |
381 |
382 |
383 |
384 |
385 |
386 |
387 |
388 |
389 |
390 |
391 |
392 |
393 |
394 |
395 |
396 |
397 |
398 |
399 |
400 |
401 |
402 |
403 |
404 |
405 |
406 |
407 |
408 |
409 |
410 |
411 |
412 |
413 |
414 |
415 |
416 |
417 |
418 |
419 |
420 |
421 |
422 |
423 |
424 |
425 |
426 |
427 |
428 |
429 |
430 |
431 |
432 |
433 |
434 |
435 |
436 |
437 |
438 |
439 |
440 |
441 |
442 |
443 |
444 |
445 |
446 |
447 |
448 |
449 |
450 |
451 |
452 |
453 |
454 |
455 |
456 |
457 |
458 |
459 |
460 |
461 |
462 |
463 |
464 |
465 |
466 |
467 |
468 |
469 |
470 |
471 |
472 |
473 |
474 |
475 |
476 |
477 |
478 |
479 |
480 |
481 |
482 |
483 |
484 |
485 |
486 |
487 |
488 |
489 |
490 |
491 |
492 |
493 |
494 |
495 |
496 |
497 |
498 |
499 |
500 |
501 |
502 |
503 |
504 |
505 |
506 |
507 |
508 |
509 |
510 |
511 |
512 |
513 |
514 |
515 |
516 |
517 |
518 |
519 |
520 |
521 |
522 |
523 |
524 |
525 |
526 |
527 |
528 |
529 |
530 |
531 |
532 |
533 | Default
534 |
535 |
536 |
537 |
538 |
539 |
540 | Left to Right
541 |
542 |
543 |
544 |
545 |
546 |
547 | Right to Left
548 |
549 |
550 |
551 |
552 |
553 |
554 |
555 |
556 |
557 |
558 | Default
559 |
560 |
561 |
562 |
563 |
564 |
565 | Left to Right
566 |
567 |
568 |
569 |
570 |
571 |
572 | Right to Left
573 |
574 |
575 |
576 |
577 |
578 |
579 |
580 |
581 |
582 |
583 |
584 |
585 |
586 |
587 |
588 |
589 |
590 |
591 |
592 |
593 |
594 |
595 |
596 |
597 |
598 |
599 |
600 |
601 |
602 |
603 |
604 |
605 |
606 |
607 |
608 |
609 |
610 |
611 |
612 |
613 |
614 |
615 |
616 |
617 |
618 |
619 |
620 |
621 |
622 |
623 |
624 |
625 |
626 |
627 |
628 |
629 |
630 |
631 |
632 |
633 |
634 |
635 |
636 |
637 |
638 |
639 |
640 |
641 |
642 |
643 |
644 |
645 |
646 |
647 |
648 |
649 |
650 |
651 |
652 |
653 |
654 |
655 |
656 |
657 |
658 |
659 |
660 |
661 |
662 |
663 |
664 |
665 |
666 |
667 |
668 |
669 |
670 |
671 |
672 |
673 |
674 |
675 |
676 |
677 |
678 |
679 |
680 |
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow/Bundle+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Bundle+Extensions.swift
3 | // WelcomeWindow
4 | //
5 | // Created by Lucas Derraugh on 4/21/21.
6 | //
7 |
8 | import AppKit
9 |
10 | extension Bundle {
11 | static let framework = Bundle(identifier: "com.lucasderraugh.WelcomeFramework")
12 |
13 | public var icon: NSImage? {
14 | guard let name = infoDictionary?["CFBundleIconName"] as? String else {
15 | return nil
16 | }
17 | return NSImage(named: name)
18 | }
19 |
20 | public var appName: String {
21 | infoDictionary?["CFBundleName"] as? String ?? ""
22 | }
23 |
24 | public var version: String {
25 | infoDictionary?["CFBundleShortVersionString"] as? String ?? ""
26 | }
27 |
28 | }
29 |
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow/Defaults.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Defaults.swift
3 | // WelcomeWindow
4 | //
5 | // Created by Lucas Derraugh on 4/22/21.
6 | //
7 |
8 | import Foundation
9 |
10 | struct Defaults {
11 | static func registerDefaults() {
12 | UserDefaults.standard.register(defaults: [showOnLaunchKey: true])
13 | }
14 |
15 | private static let showOnLaunchKey = "WelcomeWindowShowOnLaunch"
16 | static var showOnLaunch: Bool {
17 | get {
18 | UserDefaults.standard.bool(forKey: showOnLaunchKey)
19 | }
20 | set {
21 | UserDefaults.standard.set(newValue, forKey: showOnLaunchKey)
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow/FileTableCellView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // FileTableCellView.swift
3 | // WelcomeWindow
4 | //
5 | // Created by Lucas Derraugh on 2/20/21.
6 | //
7 |
8 | import Cocoa
9 |
10 | class FileTableCellView: NSTableCellView {
11 |
12 | /// Both imageView and textField are linked
13 | @IBOutlet private weak var subtitleLabel: NSTextField!
14 |
15 | func configure(with url: URL) {
16 | imageView?.image = NSWorkspace.shared.icon(forFile: url.path)
17 | textField?.stringValue = url.deletingPathExtension().lastPathComponent
18 | subtitleLabel.stringValue = (url.deletingLastPathComponent().path as NSString).abbreviatingWithTildeInPath
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow/FileTableCellView.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow/HoverButton.swift:
--------------------------------------------------------------------------------
1 | //
2 | // HoverButton.swift
3 | // WelcomeWindow
4 | //
5 | // Created by Lucas Derraugh on 2/15/21.
6 | //
7 |
8 | import Cocoa
9 |
10 | class HoverButton: NSButton {
11 |
12 | /// Image used when hovering over
13 | @IBInspectable var hoveringImage: NSImage?
14 | @IBInspectable var notHoveringImage: NSImage? {
15 | didSet {
16 | image = notHoveringImage
17 | }
18 | }
19 |
20 | override init(frame frameRect: NSRect) {
21 | super.init(frame: frameRect)
22 | addTrackingArea()
23 | }
24 |
25 | required init?(coder: NSCoder) {
26 | super.init(coder: coder)
27 | addTrackingArea()
28 | }
29 |
30 | private func addTrackingArea() {
31 | addTrackingArea(NSTrackingArea(rect: .zero, options: [.mouseEnteredAndExited, .activeAlways, .inVisibleRect], owner: self, userInfo: nil))
32 | }
33 |
34 | override func mouseEntered(with event: NSEvent) {
35 | image = hoveringImage
36 | }
37 |
38 | override func mouseExited(with event: NSEvent) {
39 | image = notHoveringImage
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIconFile
10 |
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
19 | CFBundleShortVersionString
20 | 1.0
21 | CFBundleVersion
22 | 1
23 | LSMinimumSystemVersion
24 | $(MACOSX_DEPLOYMENT_TARGET)
25 | NSMainNibFile
26 | MainMenu
27 | NSPrincipalClass
28 | NSApplication
29 |
30 |
31 |
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow/MainWelcomeViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MainWelcomeViewController.swift
3 | // WelcomeWindow
4 | //
5 | // Created by Lucas Derraugh on 2/25/21.
6 | //
7 |
8 | import Cocoa
9 |
10 | class MainWelcomeViewController: NSViewController {
11 |
12 | @IBOutlet private weak var closeButton: HoverButton!
13 | @IBOutlet private weak var showOnLaunchCheckBox: NSButton!
14 |
15 | @IBOutlet weak var imageView: NSImageView!
16 | @IBOutlet weak var titleLabel: NSTextField!
17 | @IBOutlet weak var subtitleLabel: NSTextField!
18 | @IBOutlet private weak var firstButton: NSButton!
19 | @IBOutlet private weak var secondButton: NSButton!
20 | @IBOutlet private weak var thirdButton: NSButton!
21 |
22 | let configuration: WelcomeConfiguration
23 |
24 | private struct Button {
25 | let title: String
26 | let subtitle: String
27 | }
28 |
29 | override func viewDidLoad() {
30 | super.viewDidLoad()
31 |
32 | view.addTrackingArea(NSTrackingArea(rect: .zero, options: [.mouseEnteredAndExited, .activeAlways, .inVisibleRect], owner: self, userInfo: nil))
33 |
34 | setup()
35 | }
36 |
37 | public init(configuration: WelcomeConfiguration) {
38 | self.configuration = configuration
39 | super.init(nibName: NSNib.Name(String(describing: Self.self)), bundle: .framework)
40 | }
41 |
42 | @available(*, unavailable)
43 | required init?(coder: NSCoder) {
44 | fatalError("init(coder:) has not been implemented")
45 | }
46 |
47 | private func setup() {
48 | imageView.image = configuration.image
49 | titleLabel.stringValue = configuration.title
50 | subtitleLabel.stringValue = configuration.subtitle
51 | showOnLaunchCheckBox.state = Defaults.showOnLaunch ? .on : .off
52 |
53 | let models = [
54 | Button(title: "Create a new Xcode project", subtitle: "Create an app for iPhone, iPad, Mac, Apple Watch, or Apple TV"),
55 | Button(title: "Clone an existing project", subtitle: "Start working on something from a Git repository."),
56 | Button(title: "Open a project or file", subtitle: "Open an existing project or file on your Mac.")
57 | ]
58 |
59 | let buttons: [NSButton] = [firstButton, secondButton, thirdButton]
60 |
61 | for (model, button) in zip(models, buttons) {
62 | let text = NSMutableAttributedString(string: " \(model.title)\n ", attributes: [
63 | .font: NSFont.boldSystemFont(ofSize: 13),
64 | .foregroundColor: NSColor.labelColor
65 | ])
66 | text.append(NSAttributedString(string: model.subtitle, attributes: [
67 | .font: NSFont.systemFont(ofSize: 12),
68 | .foregroundColor: NSColor.labelColor
69 | ]))
70 |
71 | button.attributedTitle = text
72 | }
73 | }
74 |
75 | override func mouseEntered(with event: NSEvent) {
76 | closeButton.alphaValue = 1
77 | showOnLaunchCheckBox.alphaValue = 1
78 | }
79 |
80 | override func mouseExited(with event: NSEvent) {
81 | closeButton.animator().alphaValue = 0
82 | showOnLaunchCheckBox.animator().alphaValue = 0
83 | }
84 |
85 | @IBAction private func closeWindow(_ sender: Any) {
86 | view.window?.close()
87 | }
88 |
89 | @IBAction func showOnLaunchClicked(_ sender: NSButton) {
90 | Defaults.showOnLaunch = sender.state == .on
91 | }
92 | }
93 |
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow/MainWelcomeViewController.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
77 |
85 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow/RecentsTableViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RecentsTableViewController.swift
3 | // WelcomeWindow
4 | //
5 | // Created by Lucas Derraugh on 2/25/21.
6 | //
7 |
8 | import Cocoa
9 |
10 | private let cellIdentifier = NSUserInterfaceItemIdentifier("FileTableCellView")
11 |
12 | class RecentsTableViewController: NSViewController {
13 |
14 | @IBOutlet private weak var noRecentsLabel: NSTextField!
15 | @IBOutlet private weak var tableView: NSTableView!
16 | private var tableViewDS: NSTableViewDiffableDataSource!
17 | private let urls: [URL]
18 |
19 | init(urls: [URL]) {
20 | self.urls = urls
21 | super.init(nibName: String(describing: Self.self), bundle: .framework)
22 | }
23 |
24 | @available(*, unavailable)
25 | required init?(coder: NSCoder) {
26 | fatalError("init(coder:) has not been implemented")
27 | }
28 |
29 | override func viewDidLoad() {
30 | super.viewDidLoad()
31 |
32 | tableView.target = self
33 | tableView.doubleAction = #selector(doubleAction(_:))
34 | tableView.register(NSNib(nibNamed: "FileTableCellView", bundle: .framework), forIdentifier: cellIdentifier)
35 |
36 | tableViewDS = NSTableViewDiffableDataSource(tableView: tableView, cellProvider: { (tableView, column, section, url) -> NSView in
37 | guard let cell = tableView.makeView(withIdentifier: cellIdentifier, owner: nil) as? FileTableCellView else {
38 | return NSView()
39 | }
40 | cell.configure(with: url)
41 | return cell
42 | })
43 |
44 | var snapshot = NSDiffableDataSourceSnapshot()
45 | snapshot.appendSections([0])
46 | snapshot.appendItems(urls)
47 | tableViewDS.apply(snapshot, animatingDifferences: false)
48 |
49 | let containsURLs = !urls.isEmpty
50 | noRecentsLabel.isHidden = containsURLs
51 | if containsURLs {
52 | tableView.selectRowIndexes([0], byExtendingSelection: false)
53 | }
54 | }
55 |
56 | @objc private func doubleAction(_ sender: NSTableView) {
57 | let selectedRow = sender.selectedRow
58 | NSDocumentController.shared.openDocument(withContentsOf: urls[selectedRow], display: true) { _,_,_ in }
59 | }
60 |
61 | }
62 |
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow/RecentsTableViewController.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow/SplitViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SplitViewController.swift
3 | // WelcomeWindow
4 | //
5 | // Created by Lucas Derraugh on 2/25/21.
6 | //
7 |
8 | import Cocoa
9 |
10 | final class SplitViewController: NSSplitViewController {
11 |
12 | override func loadView() {
13 | let splitView = SplitView()
14 | splitView.isVertical = true
15 | self.splitView = splitView
16 | super.loadView()
17 | }
18 |
19 | override func splitView(_ splitView: NSSplitView, effectiveRect proposedEffectiveRect: NSRect, forDrawnRect drawnRect: NSRect, ofDividerAt dividerIndex: Int) -> NSRect {
20 | .zero
21 | }
22 | }
23 |
24 | final class SplitView: NSSplitView {
25 | override var dividerThickness: CGFloat {
26 | 0
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow/TableView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TableView.swift
3 | // WelcomeWindow
4 | //
5 | // Created by Lucas Derraugh on 2/20/21.
6 | //
7 |
8 | import Cocoa
9 |
10 | /// Handles return key events through `doubleAction`.
11 | class TableView: NSTableView {
12 |
13 | override func keyDown(with event: NSEvent) {
14 | if event.characters?.count == 1, event.keyCode == 36 {
15 | sendAction(doubleAction, to: target)
16 | } else {
17 | super.keyDown(with: event)
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow/WelcomeConfiguration.swift:
--------------------------------------------------------------------------------
1 | //
2 | // WelcomeConfiguration.swift
3 | // WelcomeWindow
4 | //
5 | // Created by Lucas Derraugh on 5/7/21.
6 | //
7 |
8 | import AppKit
9 |
10 | public struct WelcomeConfiguration {
11 | var image: NSImage?
12 | var title: String
13 | var subtitle: String
14 |
15 | public static func defaultConfiguration() -> Self {
16 | let main = Bundle.main
17 | return .init(image: main.icon, title: "Welcome to \(main.appName)", subtitle: "Version \(main.version)")
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow/WelcomeWindow.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.security.app-sandbox
6 |
7 | com.apple.security.files.user-selected.read-only
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow/WelcomeWindowController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // WelcomeWindowController.swift
3 | // WelcomeWindow
4 | //
5 | // Created by Lucas Derraugh on 2/25/21.
6 | //
7 |
8 | import Cocoa
9 |
10 | public class WelcomeWindowController: NSWindowController {
11 |
12 | var configuration = WelcomeConfiguration.defaultConfiguration()
13 |
14 | public override func windowDidLoad() {
15 | super.windowDidLoad()
16 |
17 | window?.isMovableByWindowBackground = true
18 |
19 | let splitViewController = SplitViewController()
20 | splitViewController.addSplitViewItem(NSSplitViewItem(viewController: MainWelcomeViewController(configuration: configuration)))
21 | splitViewController.addSplitViewItem(NSSplitViewItem(viewController: RecentsTableViewController(urls: NSDocumentController.shared.recentDocumentURLs)))
22 | contentViewController = splitViewController
23 | }
24 |
25 | public convenience init(configuration: WelcomeConfiguration) {
26 | Defaults.registerDefaults()
27 |
28 | self.init(windowNibName: NSNib.Name(String(describing: Self.self)))
29 | self.configuration = configuration
30 | }
31 |
32 | public func showWindow(force: Bool = false) {
33 | if force || Defaults.showOnLaunch {
34 | super.showWindow(nil)
35 | }
36 | }
37 |
38 | @available(*, unavailable)
39 | override public func showWindow(_ sender: Any?) {}
40 | }
41 |
--------------------------------------------------------------------------------
/WelcomeWindow/WelcomeWindow/WelcomeWindowController.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------