├── .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 | 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 | 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 | -------------------------------------------------------------------------------- /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 | 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 | 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 | 67 | 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 | --------------------------------------------------------------------------------