From e7ce12869c0a15d0bdaa67e7c0b7c1da0ec399d3 Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Sat, 3 Feb 2018 10:56:12 -0800 Subject: [PATCH 01/18] Disable commands to add a feed or add a folder if the window is already displaying a sheet. Fix #319. --- Evergreen/AppDelegate.swift | 10 +++++++++- Evergreen/Base.lproj/MainWindow.storyboard | 4 ++-- Evergreen/MainWindow/MainWindowController.swift | 7 +++++++ 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/Evergreen/AppDelegate.swift b/Evergreen/AppDelegate.swift index 36f04da16..1c9567e92 100644 --- a/Evergreen/AppDelegate.swift +++ b/Evergreen/AppDelegate.swift @@ -249,15 +249,20 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserInterfaceValidations, func validateUserInterfaceItem(_ item: NSValidatedUserInterfaceItem) -> Bool { + let isDisplayingSheet = mainWindowController?.isDisplayingSheet ?? false + if item.action == #selector(refreshAll(_:)) { return !AccountManager.shared.refreshInProgress } if item.action == #selector(addAppNews(_:)) { - return !AccountManager.shared.anyAccountHasFeedWithURL(appNewsURLString) + return !isDisplayingSheet && !AccountManager.shared.anyAccountHasFeedWithURL(appNewsURLString) } if item.action == #selector(sortByNewestArticleOnTop(_:)) || item.action == #selector(sortByOldestArticleOnTop(_:)) { return mainWindowController?.isOpen ?? false } + if item.action == #selector(showAddFeedWindow(_:)) || item.action == #selector(showAddFolderWindow(_:)) { + return !isDisplayingSheet + } return true } @@ -266,6 +271,9 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserInterfaceValidations, func addFeed(_ urlString: String?, _ name: String? = nil) { createAndShowMainWindow() + if mainWindowController!.isDisplayingSheet { + return + } addFeedController = AddFeedController(hostWindow: mainWindowController!.window!) addFeedController?.showAddFeedSheet(urlString, name) diff --git a/Evergreen/Base.lproj/MainWindow.storyboard b/Evergreen/Base.lproj/MainWindow.storyboard index 49801d380..a2232733d 100644 --- a/Evergreen/Base.lproj/MainWindow.storyboard +++ b/Evergreen/Base.lproj/MainWindow.storyboard @@ -1,7 +1,7 @@ - + - + diff --git a/Evergreen/MainWindow/MainWindowController.swift b/Evergreen/MainWindow/MainWindowController.swift index c31e811d2..fc3710bef 100644 --- a/Evergreen/MainWindow/MainWindowController.swift +++ b/Evergreen/MainWindow/MainWindowController.swift @@ -18,6 +18,13 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations { return isWindowLoaded && window!.isVisible } + var isDisplayingSheet: Bool { + if let _ = window?.attachedSheet { + return true + } + return false + } + // MARK: NSWindowController private let windowAutosaveName = NSWindow.FrameAutosaveName(rawValue: kWindowFrameKey) From a03562eee8a374842ce8b24f1900dee7ad3b4203 Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Sat, 3 Feb 2018 16:05:59 -0800 Subject: [PATCH 02/18] Make further progress on the rename sheet. --- Evergreen/Base.lproj/RenameSheet.xib | 3 +++ .../Renaming/RenameWindowController.swift | 25 ++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/Evergreen/Base.lproj/RenameSheet.xib b/Evergreen/Base.lproj/RenameSheet.xib index 6722eaaeb..ea16cc5e9 100644 --- a/Evergreen/Base.lproj/RenameSheet.xib +++ b/Evergreen/Base.lproj/RenameSheet.xib @@ -41,6 +41,9 @@ + + + diff --git a/Evergreen/MainWindow/ContextualMenus/MainWindowController+ContextualMenus.swift b/Evergreen/MainWindow/ContextualMenus/MainWindowController+ContextualMenus.swift index 58729d69e..6230bee6e 100644 --- a/Evergreen/MainWindow/ContextualMenus/MainWindowController+ContextualMenus.swift +++ b/Evergreen/MainWindow/ContextualMenus/MainWindowController+ContextualMenus.swift @@ -63,6 +63,24 @@ extension MainWindowController { @objc func renameFromContextualMenu(_ sender: Any?) { + guard let window = window, let menuItem = sender as? NSMenuItem, let object = menuItem.representedObject as? DisplayNameProvider, object is Feed || object is Folder else { + return + } + + renameWindowController = RenameWindowController(originalTitle: object.nameForDisplay) { (newTitle) in + guard let newTitle = newTitle else { + return + } + if let feed = object as? Feed { + feed.editedName = newTitle + } + else if let folder = object as? Folder { + folder.name = newTitle + } + self.renameWindowController = nil + } + + renameWindowController!.runSheetOnWindow(window) } } diff --git a/Evergreen/MainWindow/MainWindowController.swift b/Evergreen/MainWindow/MainWindowController.swift index fc3710bef..654a8f115 100644 --- a/Evergreen/MainWindow/MainWindowController.swift +++ b/Evergreen/MainWindow/MainWindowController.swift @@ -25,6 +25,8 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations { return false } + var renameWindowController: RenameWindowController? + // MARK: NSWindowController private let windowAutosaveName = NSWindow.FrameAutosaveName(rawValue: kWindowFrameKey) diff --git a/Evergreen/MainWindow/Sidebar/Renaming/RenameWindowController.swift b/Evergreen/MainWindow/Sidebar/Renaming/RenameWindowController.swift index 439cd057a..8deda9538 100644 --- a/Evergreen/MainWindow/Sidebar/Renaming/RenameWindowController.swift +++ b/Evergreen/MainWindow/Sidebar/Renaming/RenameWindowController.swift @@ -15,18 +15,52 @@ final class RenameWindowController: NSWindowController { @IBOutlet var renameButton: NSButton! private var originalTitle: String! + private var hostWindow: NSWindow! + private var callback: ((String?) -> Void)? - convenience init(originalTitle: String) { + convenience init(originalTitle: String, callback: @escaping ((String?) -> Void)) { self.init(windowNibName: NSNib.Name(rawValue: "RenameSheet")) self.originalTitle = originalTitle + self.callback = callback } override func windowDidLoad() { newTitleTextField.stringValue = originalTitle + + let prompt = NSLocalizedString("Rename %@ to:", comment: "Rename sheet") + let localizedPrompt = NSString.localizedStringWithFormat(prompt as NSString, originalTitle) + renamePrompt.stringValue = localizedPrompt as String + updateUI() } + + func runSheetOnWindow(_ w: NSWindow) { + + guard let window = window else { + return + } + + hostWindow = w + hostWindow.beginSheet(window) { (returnCode: NSApplication.ModalResponse) -> Void in + } + } + + // MARK: Actions + + @IBAction func cancel(_ sender: AnyObject) { + + callback?(nil) + hostWindow!.endSheet(window!, returnCode: .cancel) + } + + @IBAction func rename(_ sender: AnyObject) { + + callback?(newTitleTextField.stringValue) + hostWindow!.endSheet(window!, returnCode: .OK) + } + } extension RenameWindowController: NSTextFieldDelegate { From 7dee959988741fa37f9e760c9219de0b767b7a26 Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Sat, 3 Feb 2018 19:06:40 -0800 Subject: [PATCH 06/18] Remove a duplicate reference to the iOS project. --- Evergreen.xcworkspace/contents.xcworkspacedata | 3 --- 1 file changed, 3 deletions(-) diff --git a/Evergreen.xcworkspace/contents.xcworkspacedata b/Evergreen.xcworkspace/contents.xcworkspacedata index 68a6d75c2..7de5702b5 100644 --- a/Evergreen.xcworkspace/contents.xcworkspacedata +++ b/Evergreen.xcworkspace/contents.xcworkspacedata @@ -1,9 +1,6 @@ - - From ae840b31bc1704ccbcc56f05a8e2090a63371410 Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Sat, 3 Feb 2018 20:30:23 -0800 Subject: [PATCH 07/18] Continue progress on rename sheet. --- .../ContextualMenus/MainWindowController+ContextualMenus.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Evergreen/MainWindow/ContextualMenus/MainWindowController+ContextualMenus.swift b/Evergreen/MainWindow/ContextualMenus/MainWindowController+ContextualMenus.swift index 6230bee6e..feab2b0ed 100644 --- a/Evergreen/MainWindow/ContextualMenus/MainWindowController+ContextualMenus.swift +++ b/Evergreen/MainWindow/ContextualMenus/MainWindowController+ContextualMenus.swift @@ -80,7 +80,7 @@ extension MainWindowController { self.renameWindowController = nil } - renameWindowController!.runSheetOnWindow(window) + renameWindowController?.runSheetOnWindow(window) } } From 68d0885b0d041f82dc27025ba927a47e2178693a Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Sat, 3 Feb 2018 21:04:28 -0800 Subject: [PATCH 08/18] Get rename sheet working, finally. --- Evergreen/Base.lproj/RenameSheet.xib | 2 +- ...MainWindowController+ContextualMenus.swift | 28 +++++++------ .../Renaming/RenameWindowController.swift | 41 +++++++++---------- 3 files changed, 36 insertions(+), 35 deletions(-) diff --git a/Evergreen/Base.lproj/RenameSheet.xib b/Evergreen/Base.lproj/RenameSheet.xib index d9462606f..e76af7899 100644 --- a/Evergreen/Base.lproj/RenameSheet.xib +++ b/Evergreen/Base.lproj/RenameSheet.xib @@ -15,7 +15,7 @@ - + diff --git a/Evergreen/MainWindow/ContextualMenus/MainWindowController+ContextualMenus.swift b/Evergreen/MainWindow/ContextualMenus/MainWindowController+ContextualMenus.swift index feab2b0ed..4a0a99885 100644 --- a/Evergreen/MainWindow/ContextualMenus/MainWindowController+ContextualMenus.swift +++ b/Evergreen/MainWindow/ContextualMenus/MainWindowController+ContextualMenus.swift @@ -67,20 +67,24 @@ extension MainWindowController { return } - renameWindowController = RenameWindowController(originalTitle: object.nameForDisplay) { (newTitle) in - guard let newTitle = newTitle else { - return - } - if let feed = object as? Feed { - feed.editedName = newTitle - } - else if let folder = object as? Folder { - folder.name = newTitle - } - self.renameWindowController = nil + renameWindowController = RenameWindowController(originalTitle: object.nameForDisplay, representedObject: object, delegate: self) + guard let renameSheet = renameWindowController?.window else { + return } + window.beginSheet(renameSheet) + } +} - renameWindowController?.runSheetOnWindow(window) +extension MainWindowController: RenameWindowControllerDelegate { + + func renameWindowController(_ windowController: RenameWindowController, didRenameObject object: Any, withNewName name: String) { + + if let feed = object as? Feed { + feed.editedName = name + } + else if let folder = object as? Folder { + folder.name = name + } } } diff --git a/Evergreen/MainWindow/Sidebar/Renaming/RenameWindowController.swift b/Evergreen/MainWindow/Sidebar/Renaming/RenameWindowController.swift index 8deda9538..c88dca2c5 100644 --- a/Evergreen/MainWindow/Sidebar/Renaming/RenameWindowController.swift +++ b/Evergreen/MainWindow/Sidebar/Renaming/RenameWindowController.swift @@ -8,57 +8,54 @@ import AppKit +protocol RenameWindowControllerDelegate { + + func renameWindowController(_ windowController: RenameWindowController, didRenameObject: Any, withNewName: String) +} + final class RenameWindowController: NSWindowController { @IBOutlet var renamePrompt: NSTextField! @IBOutlet var newTitleTextField: NSTextField! @IBOutlet var renameButton: NSButton! - private var originalTitle: String! - private var hostWindow: NSWindow! - private var callback: ((String?) -> Void)? + private var originalTitle: String? + private var representedObject: Any? + private var delegate: RenameWindowControllerDelegate? - convenience init(originalTitle: String, callback: @escaping ((String?) -> Void)) { + convenience init(originalTitle: String, representedObject: Any, delegate: RenameWindowControllerDelegate) { self.init(windowNibName: NSNib.Name(rawValue: "RenameSheet")) self.originalTitle = originalTitle - self.callback = callback + self.representedObject = representedObject + self.delegate = delegate } override func windowDidLoad() { - newTitleTextField.stringValue = originalTitle + newTitleTextField.stringValue = originalTitle! let prompt = NSLocalizedString("Rename %@ to:", comment: "Rename sheet") - let localizedPrompt = NSString.localizedStringWithFormat(prompt as NSString, originalTitle) + let localizedPrompt = NSString.localizedStringWithFormat(prompt as NSString, originalTitle!) renamePrompt.stringValue = localizedPrompt as String updateUI() } - func runSheetOnWindow(_ w: NSWindow) { - - guard let window = window else { - return - } - - hostWindow = w - hostWindow.beginSheet(window) { (returnCode: NSApplication.ModalResponse) -> Void in - } - } - // MARK: Actions @IBAction func cancel(_ sender: AnyObject) { - callback?(nil) - hostWindow!.endSheet(window!, returnCode: .cancel) + window?.sheetParent?.endSheet(window!, returnCode: .cancel) } @IBAction func rename(_ sender: AnyObject) { - callback?(newTitleTextField.stringValue) - hostWindow!.endSheet(window!, returnCode: .OK) + guard let representedObject = representedObject else { + return + } + delegate?.renameWindowController(self, didRenameObject: representedObject, withNewName: newTitleTextField.stringValue) + window?.sheetParent?.endSheet(window!, returnCode: .OK) } } From 27c5ffa5eb7fcff61dbba2a95be07ca892804673 Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Sat, 3 Feb 2018 21:30:30 -0800 Subject: [PATCH 09/18] =?UTF-8?q?Add=20new-feed=20and=20new-folder=20comma?= =?UTF-8?q?nds=20to=20the=20sidebar=20gear=20menu=20when=20there=E2=80=99s?= =?UTF-8?q?=20no=20selection.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Evergreen/AppDelegate.swift | 9 +++++++-- .../MainWindowController+ContextualMenus.swift | 13 ++++++++++++- Evergreen/MainWindow/MainWindowController.swift | 7 ++++++- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/Evergreen/AppDelegate.swift b/Evergreen/AppDelegate.swift index 1c9567e92..9ac432399 100644 --- a/Evergreen/AppDelegate.swift +++ b/Evergreen/AppDelegate.swift @@ -101,6 +101,12 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserInterfaceValidations, addFolderWindowController!.runSheetOnWindow(window) } + func showAddFeedSheetOnWindow(_ window: NSWindow, urlString: String?, name: String?) { + + addFeedController = AddFeedController(hostWindow: window) + addFeedController?.showAddFeedSheet(urlString, name) + } + // MARK: - NSApplicationDelegate func applicationDidFinishLaunching(_ note: Notification) { @@ -275,8 +281,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserInterfaceValidations, return } - addFeedController = AddFeedController(hostWindow: mainWindowController!.window!) - addFeedController?.showAddFeedSheet(urlString, name) + showAddFeedSheetOnWindow(mainWindowController!.window!, urlString: urlString, name: name) } // MARK: - Actions diff --git a/Evergreen/MainWindow/ContextualMenus/MainWindowController+ContextualMenus.swift b/Evergreen/MainWindow/ContextualMenus/MainWindowController+ContextualMenus.swift index 4a0a99885..2f6253210 100644 --- a/Evergreen/MainWindow/ContextualMenus/MainWindowController+ContextualMenus.swift +++ b/Evergreen/MainWindow/ContextualMenus/MainWindowController+ContextualMenus.swift @@ -16,7 +16,7 @@ extension MainWindowController { func menu(for objects: [Any]?) -> NSMenu? { guard let objects = objects, objects.count > 0 else { - return nil + return menuForNoSelection() } if objects.count == 1 { @@ -55,6 +55,7 @@ extension MainWindowController { @objc func markObjectsReadFromContextualMenu(_ sender: Any?) { + } @objc func deleteFromContextualMenu(_ sender: Any?) { @@ -92,6 +93,16 @@ extension MainWindowController: RenameWindowControllerDelegate { private extension MainWindowController { + func menuForNoSelection() -> NSMenu { + + let menu = NSMenu(title: "") + + menu.addItem(withTitle: NSLocalizedString("New Feed", comment: "Command"), action: #selector(showAddFeedWindow(_:)), keyEquivalent: "") + menu.addItem(withTitle: NSLocalizedString("New Folder", comment: "Command"), action: #selector(showAddFolderWindow(_:)), keyEquivalent: "") + + return menu + } + func menuForFeed(_ feed: Feed) -> NSMenu? { let menu = NSMenu(title: "") diff --git a/Evergreen/MainWindow/MainWindowController.swift b/Evergreen/MainWindow/MainWindowController.swift index 654a8f115..cd9c5402d 100644 --- a/Evergreen/MainWindow/MainWindowController.swift +++ b/Evergreen/MainWindow/MainWindowController.swift @@ -177,7 +177,12 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations { appDelegate.showAddFolderSheetOnWindow(window!) } - + + @IBAction func showAddFeedWindow(_ sender: Any) { + + appDelegate.showAddFeedSheetOnWindow(window!, urlString: nil, name: nil) + } + @IBAction func openArticleInBrowser(_ sender: Any?) { if let link = currentLink { From a6db249ab6f2a26c0bd3a53364a8362f2aa8d4d5 Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Sun, 4 Feb 2018 10:57:41 -0800 Subject: [PATCH 10/18] Add ArticleFetcher protocol. Add Feed and Folder extensions for it. --- Frameworks/Account/Account.swift | 9 ++- .../Account/Account.xcodeproj/project.pbxproj | 4 ++ Frameworks/Account/ArticleFetcher.swift | 55 +++++++++++++++++++ Frameworks/Account/DataExtensions.swift | 9 --- Frameworks/Account/Folder.swift | 10 ---- 5 files changed, 67 insertions(+), 20 deletions(-) create mode 100644 Frameworks/Account/ArticleFetcher.swift diff --git a/Frameworks/Account/Account.swift b/Frameworks/Account/Account.swift index 4f723d5aa..b547ef459 100644 --- a/Frameworks/Account/Account.swift +++ b/Frameworks/Account/Account.swift @@ -333,7 +333,14 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container, validateUnreadCount(feed, articles) return articles } - + + public func fetchUnreadArticles(for feed: Feed) -> Set
{ + + let articles = database.fetchUnreadArticles(for: Set([feed])) + validateUnreadCount(feed, articles) + return articles + } + public func fetchArticles(folder: Folder) -> Set
{ let feeds = folder.flattenedFeeds() diff --git a/Frameworks/Account/Account.xcodeproj/project.pbxproj b/Frameworks/Account/Account.xcodeproj/project.pbxproj index c4934b57f..41d7dbda3 100644 --- a/Frameworks/Account/Account.xcodeproj/project.pbxproj +++ b/Frameworks/Account/Account.xcodeproj/project.pbxproj @@ -28,6 +28,7 @@ 84C3654A1F899F3B001EC85C /* CombinedRefreshProgress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C365491F899F3B001EC85C /* CombinedRefreshProgress.swift */; }; 84C8B3F41F89DE430053CCA6 /* DataExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C8B3F31F89DE430053CCA6 /* DataExtensions.swift */; }; 84CAD7161FDF2E22000F0755 /* FeedbinArticle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84CAD7151FDF2E22000F0755 /* FeedbinArticle.swift */; }; + 84F73CF1202788D90000BCEF /* ArticleFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F73CF0202788D80000BCEF /* ArticleFetcher.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -128,6 +129,7 @@ 84C365491F899F3B001EC85C /* CombinedRefreshProgress.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CombinedRefreshProgress.swift; sourceTree = ""; }; 84C8B3F31F89DE430053CCA6 /* DataExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataExtensions.swift; sourceTree = ""; }; 84CAD7151FDF2E22000F0755 /* FeedbinArticle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbinArticle.swift; sourceTree = ""; }; + 84F73CF0202788D80000BCEF /* ArticleFetcher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArticleFetcher.swift; sourceTree = ""; }; D511EEB5202422BB00712EC3 /* Account_project_debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Account_project_debug.xcconfig; sourceTree = ""; }; D511EEB6202422BB00712EC3 /* Account_target.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Account_target.xcconfig; sourceTree = ""; }; D511EEB7202422BB00712EC3 /* Account_project_release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Account_project_release.xcconfig; sourceTree = ""; }; @@ -237,6 +239,7 @@ 84B99C9E1FAE8D3200ECDEDB /* ContainerPath.swift */, 84C365491F899F3B001EC85C /* CombinedRefreshProgress.swift */, 84C8B3F31F89DE430053CCA6 /* DataExtensions.swift */, + 84F73CF0202788D80000BCEF /* ArticleFetcher.swift */, 8419740D1F6DD25F006346C4 /* Container.swift */, 8419742B1F6DDE84006346C4 /* LocalAccount */, 84245C7D1FDDD2580074AFBB /* Feedbin */, @@ -476,6 +479,7 @@ 84C3654A1F899F3B001EC85C /* CombinedRefreshProgress.swift in Sources */, 8469F81C1F6DD15E0084783E /* Account.swift in Sources */, 846E77451F6EF9B900A165E2 /* Container.swift in Sources */, + 84F73CF1202788D90000BCEF /* ArticleFetcher.swift in Sources */, 84245C7F1FDDD2580074AFBB /* FeedbinAccountDelegate.swift in Sources */, 841974251F6DDCE4006346C4 /* AccountDelegate.swift in Sources */, 846E77541F6F00E300A165E2 /* AccountManager.swift in Sources */, diff --git a/Frameworks/Account/ArticleFetcher.swift b/Frameworks/Account/ArticleFetcher.swift new file mode 100644 index 000000000..0b8188b03 --- /dev/null +++ b/Frameworks/Account/ArticleFetcher.swift @@ -0,0 +1,55 @@ +// +// ArticleFetcher.swift +// Account +// +// Created by Brent Simmons on 2/4/18. +// Copyright © 2018 Ranchero Software, LLC. All rights reserved. +// + +import Foundation +import Data + +public protocol ArticleFetcher { + + func fetchArticles() -> Set
+ func fetchUnreadArticles() -> Set
+} + +extension Feed: ArticleFetcher { + + public func fetchArticles() -> Set
{ + + guard let account = account else { + assertionFailure("Expected feed.account, but got nil.") + return Set
() + } + return account.fetchArticles(for: self) + } + + public func fetchUnreadArticles() -> Set
{ + + guard let account = account else { + assertionFailure("Expected feed.account, but got nil.") + return Set
() + } + return account.fetchUnreadArticles(for: self) + } +} + +extension Folder: ArticleFetcher { + + public func fetchArticles() -> Set
{ + + return fetchUnreadArticles() + } + + public func fetchUnreadArticles() -> Set
{ + + guard let account = account else { + assertionFailure("Expected folder.account, but got nil.") + return Set
() + } + + return account.fetchArticles(folder: self) + } +} diff --git a/Frameworks/Account/DataExtensions.swift b/Frameworks/Account/DataExtensions.swift index 9e565a73a..7f813cba7 100644 --- a/Frameworks/Account/DataExtensions.swift +++ b/Frameworks/Account/DataExtensions.swift @@ -23,15 +23,6 @@ public extension Feed { } } - public func fetchArticles() -> Set
{ - - guard let account = account else { - assertionFailure("Expected feed.account.") - return Set
() - } - return account.fetchArticles(for: self) - } - public func takeSettings(from parsedFeed: ParsedFeed) { var didChangeAtLeastOneSetting = false diff --git a/Frameworks/Account/Folder.swift b/Frameworks/Account/Folder.swift index 442ada83f..85d411b06 100644 --- a/Frameworks/Account/Folder.swift +++ b/Frameworks/Account/Folder.swift @@ -26,16 +26,6 @@ public final class Folder: DisplayNameProvider, Container, UnreadCountProvider, static var incrementingID = 0 public let hashValue: Int - // MARK: - Fetching Articles - - public func fetchArticles() -> Set
{ - - guard let account = account else { - return Set
() - } - return account.fetchArticles(folder: self) - } - // MARK: - DisplayNameProvider public var nameForDisplay: String { From 29996415728dd7c6bd362dd7f5dd95c91ea99685 Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Sun, 4 Feb 2018 11:19:24 -0800 Subject: [PATCH 11/18] Move MainWindowController+ContextualMenus to SidebarViewController+ContextualMenus, where it always should have been. --- Evergreen.xcodeproj/project.pbxproj | 16 ++++------------ Evergreen/MainWindow/MainWindowController.swift | 2 -- .../SidebarViewController+ContextualMenus.swift} | 16 ++++++++-------- .../Sidebar/SidebarViewController.swift | 7 +++---- 4 files changed, 15 insertions(+), 26 deletions(-) rename Evergreen/MainWindow/{ContextualMenus/MainWindowController+ContextualMenus.swift => Sidebar/SidebarViewController+ContextualMenus.swift} (89%) diff --git a/Evergreen.xcodeproj/project.pbxproj b/Evergreen.xcodeproj/project.pbxproj index eb46d8676..70a5f6e6c 100644 --- a/Evergreen.xcodeproj/project.pbxproj +++ b/Evergreen.xcodeproj/project.pbxproj @@ -108,7 +108,7 @@ 84B06FFE1ED3818D00F0B54B /* RSTree.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84B06FFA1ED3818000F0B54B /* RSTree.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 84B0700A1ED3822600F0B54B /* RSTextDrawing.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84B070071ED3821900F0B54B /* RSTextDrawing.framework */; }; 84B0700B1ED3822600F0B54B /* RSTextDrawing.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84B070071ED3821900F0B54B /* RSTextDrawing.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 84B7178C201E66580091657D /* MainWindowController+ContextualMenus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84B7178B201E66580091657D /* MainWindowController+ContextualMenus.swift */; }; + 84B7178C201E66580091657D /* SidebarViewController+ContextualMenus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84B7178B201E66580091657D /* SidebarViewController+ContextualMenus.swift */; }; 84B99C671FAE35E600ECDEDB /* FeedListTreeControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84B99C661FAE35E600ECDEDB /* FeedListTreeControllerDelegate.swift */; }; 84B99C691FAE36B800ECDEDB /* FeedListFolder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84B99C681FAE36B800ECDEDB /* FeedListFolder.swift */; }; 84B99C6B1FAE370B00ECDEDB /* FeedListFeed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84B99C6A1FAE370B00ECDEDB /* FeedListFeed.swift */; }; @@ -584,7 +584,7 @@ 84B06FF41ED3818000F0B54B /* RSTree.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RSTree.xcodeproj; path = Frameworks/RSTree/RSTree.xcodeproj; sourceTree = ""; }; 84B070011ED3821800F0B54B /* RSTextDrawing.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RSTextDrawing.xcodeproj; path = Frameworks/RSTextDrawing/RSTextDrawing.xcodeproj; sourceTree = ""; }; 84B23425202689F5007C5900 /* Evergreen-iOS.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = "Evergreen-iOS.xcodeproj"; sourceTree = ""; }; - 84B7178B201E66580091657D /* MainWindowController+ContextualMenus.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "MainWindowController+ContextualMenus.swift"; sourceTree = ""; }; + 84B7178B201E66580091657D /* SidebarViewController+ContextualMenus.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SidebarViewController+ContextualMenus.swift"; sourceTree = ""; }; 84B99C661FAE35E600ECDEDB /* FeedListTreeControllerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedListTreeControllerDelegate.swift; sourceTree = ""; }; 84B99C681FAE36B800ECDEDB /* FeedListFolder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedListFolder.swift; sourceTree = ""; }; 84B99C6A1FAE370B00ECDEDB /* FeedListFeed.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedListFeed.swift; sourceTree = ""; }; @@ -699,7 +699,6 @@ 849A977C1ED9EC42007D329B /* Detail */, 849A97551ED9EAC3007D329B /* Add Feed */, 849A97411ED9EAA9007D329B /* Add Folder */, - 84B7178A201E66580091657D /* ContextualMenus */, ); name = MainWindow; path = Evergreen/MainWindow; @@ -840,6 +839,7 @@ isa = PBXGroup; children = ( 849A97621ED9EB96007D329B /* SidebarViewController.swift */, + 84B7178B201E66580091657D /* SidebarViewController+ContextualMenus.swift */, 849A97601ED9EB96007D329B /* SidebarOutlineView.swift */, 849A97611ED9EB96007D329B /* SidebarTreeControllerDelegate.swift */, 849A97631ED9EB96007D329B /* UnreadCountView.swift */, @@ -1124,14 +1124,6 @@ name = Products; sourceTree = ""; }; - 84B7178A201E66580091657D /* ContextualMenus */ = { - isa = PBXGroup; - children = ( - 84B7178B201E66580091657D /* MainWindowController+ContextualMenus.swift */, - ); - path = ContextualMenus; - sourceTree = ""; - }; 84BB4B621F1174D400858766 /* Products */ = { isa = PBXGroup; children = ( @@ -1693,7 +1685,7 @@ 84A14FF320048CA70046AD9A /* SendToMicroBlogCommand.swift in Sources */, 849A97891ED9ECEF007D329B /* ArticleStyle.swift in Sources */, 84FF69B11FC3793300DC198E /* FaviconURLFinder.swift in Sources */, - 84B7178C201E66580091657D /* MainWindowController+ContextualMenus.swift in Sources */, + 84B7178C201E66580091657D /* SidebarViewController+ContextualMenus.swift in Sources */, 842611A21FCB769D0086A189 /* RSHTMLMetadata+Extension.swift in Sources */, 84A1500520048DDF0046AD9A /* SendToMarsEditCommand.swift in Sources */, D5907DB22004BB37005947E5 /* ScriptingObjectContainer.swift in Sources */, diff --git a/Evergreen/MainWindow/MainWindowController.swift b/Evergreen/MainWindow/MainWindowController.swift index cd9c5402d..3132c8149 100644 --- a/Evergreen/MainWindow/MainWindowController.swift +++ b/Evergreen/MainWindow/MainWindowController.swift @@ -25,8 +25,6 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations { return false } - var renameWindowController: RenameWindowController? - // MARK: NSWindowController private let windowAutosaveName = NSWindow.FrameAutosaveName(rawValue: kWindowFrameKey) diff --git a/Evergreen/MainWindow/ContextualMenus/MainWindowController+ContextualMenus.swift b/Evergreen/MainWindow/Sidebar/SidebarViewController+ContextualMenus.swift similarity index 89% rename from Evergreen/MainWindow/ContextualMenus/MainWindowController+ContextualMenus.swift rename to Evergreen/MainWindow/Sidebar/SidebarViewController+ContextualMenus.swift index 2f6253210..8f91fcfa4 100644 --- a/Evergreen/MainWindow/ContextualMenus/MainWindowController+ContextualMenus.swift +++ b/Evergreen/MainWindow/Sidebar/SidebarViewController+ContextualMenus.swift @@ -1,5 +1,5 @@ // -// MainWindowController+ContextualMenus.swift +// SidebarViewController+ContextualMenus.swift // Evergreen // // Created by Brent Simmons on 1/28/18. @@ -11,7 +11,7 @@ import Data import Account import RSCore -extension MainWindowController { +extension SidebarViewController { func menu(for objects: [Any]?) -> NSMenu? { @@ -35,7 +35,7 @@ extension MainWindowController { // MARK: Contextual Menu Actions -extension MainWindowController { +extension SidebarViewController { @objc func openHomePageFromContextualMenu(_ sender: Any?) { @@ -64,7 +64,7 @@ extension MainWindowController { @objc func renameFromContextualMenu(_ sender: Any?) { - guard let window = window, let menuItem = sender as? NSMenuItem, let object = menuItem.representedObject as? DisplayNameProvider, object is Feed || object is Folder else { + guard let window = view.window, let menuItem = sender as? NSMenuItem, let object = menuItem.representedObject as? DisplayNameProvider, object is Feed || object is Folder else { return } @@ -76,7 +76,7 @@ extension MainWindowController { } } -extension MainWindowController: RenameWindowControllerDelegate { +extension SidebarViewController: RenameWindowControllerDelegate { func renameWindowController(_ windowController: RenameWindowController, didRenameObject object: Any, withNewName name: String) { @@ -91,14 +91,14 @@ extension MainWindowController: RenameWindowControllerDelegate { // MARK: Build Contextual Menus -private extension MainWindowController { +private extension SidebarViewController { func menuForNoSelection() -> NSMenu { let menu = NSMenu(title: "") - menu.addItem(withTitle: NSLocalizedString("New Feed", comment: "Command"), action: #selector(showAddFeedWindow(_:)), keyEquivalent: "") - menu.addItem(withTitle: NSLocalizedString("New Folder", comment: "Command"), action: #selector(showAddFolderWindow(_:)), keyEquivalent: "") + menu.addItem(withTitle: NSLocalizedString("New Feed", comment: "Command"), action: #selector(MainWindowController.showAddFeedWindow(_:)), keyEquivalent: "") + menu.addItem(withTitle: NSLocalizedString("New Folder", comment: "Command"), action: #selector(MainWindowController.showAddFolderWindow(_:)), keyEquivalent: "") return menu } diff --git a/Evergreen/MainWindow/Sidebar/SidebarViewController.swift b/Evergreen/MainWindow/Sidebar/SidebarViewController.swift index 58721cefa..788051ae5 100644 --- a/Evergreen/MainWindow/Sidebar/SidebarViewController.swift +++ b/Evergreen/MainWindow/Sidebar/SidebarViewController.swift @@ -25,6 +25,8 @@ import RSCore private var animatingChanges = false private var sidebarCellAppearance: SidebarCellAppearance! + var renameWindowController: RenameWindowController? + var selectedObjects: [AnyObject] { return selectedNodes.representedObjects() } @@ -195,10 +197,7 @@ import RSCore func contextualMenuForSelectedObjects() -> NSMenu? { - guard let mainWindowController = view.window?.windowController as? MainWindowController else { - return nil - } - return mainWindowController.menu(for: selectedObjects) + return menu(for: selectedObjects) } // MARK: NSOutlineViewDelegate From c26c705de078d9676c880cfb68d93b7d978a6044 Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Sun, 4 Feb 2018 11:45:51 -0800 Subject: [PATCH 12/18] Make Mark All as Read command in sidebar gear menu work. --- ...idebarViewController+ContextualMenus.swift | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/Evergreen/MainWindow/Sidebar/SidebarViewController+ContextualMenus.swift b/Evergreen/MainWindow/Sidebar/SidebarViewController+ContextualMenus.swift index 8f91fcfa4..7c381b812 100644 --- a/Evergreen/MainWindow/Sidebar/SidebarViewController+ContextualMenus.swift +++ b/Evergreen/MainWindow/Sidebar/SidebarViewController+ContextualMenus.swift @@ -55,7 +55,19 @@ extension SidebarViewController { @objc func markObjectsReadFromContextualMenu(_ sender: Any?) { + guard let menuItem = sender as? NSMenuItem, let objects = menuItem.representedObject as? [Any] else { + return + } + + let articles = unreadArticles(for: objects) + if articles.isEmpty { + return + } + guard let undoManager = undoManager, let markReadCommand = MarkReadOrUnreadCommand(initialArticles: Array(articles), markingRead: true, undoManager: undoManager) else { + return + } + runCommand(markReadCommand) } @objc func deleteFromContextualMenu(_ sender: Any?) { @@ -215,5 +227,16 @@ private extension SidebarViewController { item.target = self return item } + + func unreadArticles(for objects: [Any]) -> Set
{ + + var articles = Set
() + for object in objects { + if let articleFetcher = object as? ArticleFetcher { + articles.formUnion(articleFetcher.fetchUnreadArticles()) + } + } + return articles + } } From 6b14d6e8d31dd1b50134741e920c7d559411d207 Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Sun, 4 Feb 2018 12:15:59 -0800 Subject: [PATCH 13/18] Remove temporarily the Delete menu item from the sidebar gear menu. --- .../Sidebar/SidebarViewController+ContextualMenus.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Evergreen/MainWindow/Sidebar/SidebarViewController+ContextualMenus.swift b/Evergreen/MainWindow/Sidebar/SidebarViewController+ContextualMenus.swift index 7c381b812..70e79fac6 100644 --- a/Evergreen/MainWindow/Sidebar/SidebarViewController+ContextualMenus.swift +++ b/Evergreen/MainWindow/Sidebar/SidebarViewController+ContextualMenus.swift @@ -140,7 +140,7 @@ private extension SidebarViewController { menu.addItem(NSMenuItem.separator()) menu.addItem(renameMenuItem(feed)) - menu.addItem(deleteMenuItem([feed])) +// menu.addItem(deleteMenuItem([feed])) return menu } @@ -155,7 +155,7 @@ private extension SidebarViewController { } menu.addItem(renameMenuItem(folder)) - menu.addItem(deleteMenuItem([folder])) +// menu.addItem(deleteMenuItem([folder])) return menu.numberOfItems > 0 ? menu : nil } @@ -170,10 +170,10 @@ private extension SidebarViewController { if anyObjectInArrayHasNonZeroUnreadCount(objects) { menu.addItem(markAllReadMenuItem(objects)) - menu.addItem(NSMenuItem.separator()) +// menu.addItem(NSMenuItem.separator()) } - menu.addItem(deleteMenuItem(objects)) +// menu.addItem(deleteMenuItem(objects)) return menu.numberOfItems > 0 ? menu : nil } From d6eb6e2f1df3bcda2f4087bc6d5aae79faa834d4 Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Sun, 4 Feb 2018 12:18:28 -0800 Subject: [PATCH 14/18] Bump version number. --- Evergreen/Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Evergreen/Info.plist b/Evergreen/Info.plist index 955ced730..7100a1767 100644 --- a/Evergreen/Info.plist +++ b/Evergreen/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.0d34 + 1.0d35 CFBundleVersion 522 LSMinimumSystemVersion From 9cbd5a621734a8374a35b0147a6a1784b65b50f2 Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Sun, 4 Feb 2018 12:32:56 -0800 Subject: [PATCH 15/18] Update appcast for 1.0d35. --- Appcasts/evergreen-beta.xml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/Appcasts/evergreen-beta.xml b/Appcasts/evergreen-beta.xml index 5af72ee22..c216a76d6 100755 --- a/Appcasts/evergreen-beta.xml +++ b/Appcasts/evergreen-beta.xml @@ -6,6 +6,28 @@ Most recent Evergreen changes with links to updates. en + + Evergreen 1.0d35 + Sidebar Gear Menu +

You can rename, mark as read, and copy URLs.

+

(Delete isn’t there yet, but it’s planned for 1.0.)

+ +

Misc.

+

You can sort the timeline by newest on top or oldest on top. See the View > Sort By menu.

+

Share menu now supports EagleFiler Impot and Add to Reading List. (Thanks to a contribution by Michael Tsai.)

+

Go > Today, Unread, Starred commands work, including keyboard shortcuts. (Nothing appears yet, though. That’s a separate bug.)

+

Fixed a bug where the add-feed command wouldn’t disable when a sheet was already displaying.

+

Removed Debug menu when running a Release build.

+

Punted multiple window support till after 1.0.

+ + ]]>
+ Sun, 04 Feb 2018 12:00:00 -0800 + + 10.13 +
+ Evergreen 1.0d34 Date: Sun, 4 Feb 2018 13:45:26 -0800 Subject: [PATCH 16/18] Reorder UTI types in FeedPasteboardWriter to be like the order in ArticlePasteboardWriter. --- Evergreen/MainWindow/Sidebar/FeedPasteboardWriter.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Evergreen/MainWindow/Sidebar/FeedPasteboardWriter.swift b/Evergreen/MainWindow/Sidebar/FeedPasteboardWriter.swift index bfeba3f1f..6554d0281 100644 --- a/Evergreen/MainWindow/Sidebar/FeedPasteboardWriter.swift +++ b/Evergreen/MainWindow/Sidebar/FeedPasteboardWriter.swift @@ -26,7 +26,7 @@ import Data func writableTypes(for pasteboard: NSPasteboard) -> [NSPasteboard.PasteboardType] { - return [.string, .URL, FeedPasteboardWriter.feedUTIType, FeedPasteboardWriter.feedUTIInternalType] + return [FeedPasteboardWriter.feedUTIType, .URL, .string, FeedPasteboardWriter.feedUTIInternalType] } func pasteboardPropertyList(forType type: NSPasteboard.PasteboardType) -> Any? { From 26fd71e5d189d353122310b34de361f8556a599f Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Mon, 5 Feb 2018 13:20:26 -0800 Subject: [PATCH 17/18] Remove iOS project. Going to make an iOS target instead. --- Evergreen-iOS.xcodeproj/project.pbxproj | 474 ------------------ .../contents.xcworkspacedata | 7 - Evergreen-iOS/Evergreen-iOS/AppDelegate.swift | 61 --- .../AppIcon.appiconset/Contents.json | 98 ---- .../Assets.xcassets/Contents.json | 6 - .../Base.lproj/LaunchScreen.storyboard | 25 - .../Evergreen-iOS/Base.lproj/Main.storyboard | 133 ----- .../Evergreen-iOS/DetailViewController.swift | 45 -- Evergreen-iOS/Evergreen-iOS/Info.plist | 55 -- .../Evergreen-iOS/MasterViewController.swift | 95 ---- .../Evergreen_iOSTests.swift | 36 -- Evergreen-iOS/Evergreen-iOSTests/Info.plist | 22 - Evergreen.xcodeproj/project.pbxproj | 43 -- 13 files changed, 1100 deletions(-) delete mode 100644 Evergreen-iOS.xcodeproj/project.pbxproj delete mode 100644 Evergreen-iOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 Evergreen-iOS/Evergreen-iOS/AppDelegate.swift delete mode 100644 Evergreen-iOS/Evergreen-iOS/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 Evergreen-iOS/Evergreen-iOS/Assets.xcassets/Contents.json delete mode 100644 Evergreen-iOS/Evergreen-iOS/Base.lproj/LaunchScreen.storyboard delete mode 100644 Evergreen-iOS/Evergreen-iOS/Base.lproj/Main.storyboard delete mode 100644 Evergreen-iOS/Evergreen-iOS/DetailViewController.swift delete mode 100644 Evergreen-iOS/Evergreen-iOS/Info.plist delete mode 100644 Evergreen-iOS/Evergreen-iOS/MasterViewController.swift delete mode 100644 Evergreen-iOS/Evergreen-iOSTests/Evergreen_iOSTests.swift delete mode 100644 Evergreen-iOS/Evergreen-iOSTests/Info.plist diff --git a/Evergreen-iOS.xcodeproj/project.pbxproj b/Evergreen-iOS.xcodeproj/project.pbxproj deleted file mode 100644 index c863b0f1c..000000000 --- a/Evergreen-iOS.xcodeproj/project.pbxproj +++ /dev/null @@ -1,474 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 50; - objects = { - -/* Begin PBXBuildFile section */ - 84B233EA202686C8007C5900 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84B233E9202686C8007C5900 /* AppDelegate.swift */; }; - 84B233EC202686CE007C5900 /* MasterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84B233EB202686CE007C5900 /* MasterViewController.swift */; }; - 84B233EE202686D6007C5900 /* DetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84B233ED202686D6007C5900 /* DetailViewController.swift */; }; - 84B233F0202686E1007C5900 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 84B233EF202686E1007C5900 /* Assets.xcassets */; }; - 84B233FA20268739007C5900 /* Evergreen_iOSTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84B233F820268739007C5900 /* Evergreen_iOSTests.swift */; }; - 84B233FB20268739007C5900 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 84B233F920268739007C5900 /* Info.plist */; }; - 84B233FE2026875A007C5900 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 84B233FC2026875A007C5900 /* Main.storyboard */; }; - 84B234012026876A007C5900 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 84B233FF2026876A007C5900 /* LaunchScreen.storyboard */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 84EBBBDD2026866100DEA7DD /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 84EBBBBE2026866000DEA7DD /* Project object */; - proxyType = 1; - remoteGlobalIDString = 84EBBBC52026866000DEA7DD; - remoteInfo = "Evergreen-iOS"; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 84B233E9202686C8007C5900 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = "Evergreen-iOS/AppDelegate.swift"; sourceTree = ""; }; - 84B233EB202686CE007C5900 /* MasterViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MasterViewController.swift; path = "Evergreen-iOS/MasterViewController.swift"; sourceTree = ""; }; - 84B233ED202686D6007C5900 /* DetailViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DetailViewController.swift; path = "Evergreen-iOS/DetailViewController.swift"; sourceTree = ""; }; - 84B233EF202686E1007C5900 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = "Evergreen-iOS/Assets.xcassets"; sourceTree = ""; }; - 84B233F1202686E6007C5900 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = "Evergreen-iOS/Info.plist"; sourceTree = ""; }; - 84B233F820268739007C5900 /* Evergreen_iOSTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Evergreen_iOSTests.swift; sourceTree = ""; }; - 84B233F920268739007C5900 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 84B233FD2026875A007C5900 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = "Evergreen-iOS/Base.lproj/Main.storyboard"; sourceTree = ""; }; - 84B234002026876A007C5900 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = "Evergreen-iOS/Base.lproj/LaunchScreen.storyboard"; sourceTree = ""; }; - 84EBBBC62026866000DEA7DD /* Evergreen.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Evergreen.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 84EBBBDC2026866100DEA7DD /* Evergreen-iOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Evergreen-iOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 84EBBBC32026866000DEA7DD /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 84EBBBD92026866100DEA7DD /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 84B233F720268739007C5900 /* Evergreen-iOSTests */ = { - isa = PBXGroup; - children = ( - 84B233F820268739007C5900 /* Evergreen_iOSTests.swift */, - 84B233F920268739007C5900 /* Info.plist */, - ); - name = "Evergreen-iOSTests"; - path = "Evergreen-iOS/Evergreen-iOSTests"; - sourceTree = ""; - }; - 84EBBBBD2026866000DEA7DD = { - isa = PBXGroup; - children = ( - 84EBBBC82026866000DEA7DD /* Evergreen-iOS */, - 84B233F720268739007C5900 /* Evergreen-iOSTests */, - 84EBBBC72026866000DEA7DD /* Products */, - ); - sourceTree = ""; - }; - 84EBBBC72026866000DEA7DD /* Products */ = { - isa = PBXGroup; - children = ( - 84EBBBC62026866000DEA7DD /* Evergreen.app */, - 84EBBBDC2026866100DEA7DD /* Evergreen-iOSTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 84EBBBC82026866000DEA7DD /* Evergreen-iOS */ = { - isa = PBXGroup; - children = ( - 84B233E9202686C8007C5900 /* AppDelegate.swift */, - 84B233EB202686CE007C5900 /* MasterViewController.swift */, - 84B233ED202686D6007C5900 /* DetailViewController.swift */, - 84B233FC2026875A007C5900 /* Main.storyboard */, - 84B233EF202686E1007C5900 /* Assets.xcassets */, - 84B233FF2026876A007C5900 /* LaunchScreen.storyboard */, - 84B233F1202686E6007C5900 /* Info.plist */, - ); - path = "Evergreen-iOS"; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 84EBBBC52026866000DEA7DD /* Evergreen-iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 84EBBBE52026866100DEA7DD /* Build configuration list for PBXNativeTarget "Evergreen-iOS" */; - buildPhases = ( - 84EBBBC22026866000DEA7DD /* Sources */, - 84EBBBC32026866000DEA7DD /* Frameworks */, - 84EBBBC42026866000DEA7DD /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Evergreen-iOS"; - productName = "Evergreen-iOS"; - productReference = 84EBBBC62026866000DEA7DD /* Evergreen.app */; - productType = "com.apple.product-type.application"; - }; - 84EBBBDB2026866100DEA7DD /* Evergreen-iOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 84EBBBE82026866100DEA7DD /* Build configuration list for PBXNativeTarget "Evergreen-iOSTests" */; - buildPhases = ( - 84EBBBD82026866100DEA7DD /* Sources */, - 84EBBBD92026866100DEA7DD /* Frameworks */, - 84EBBBDA2026866100DEA7DD /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 84EBBBDE2026866100DEA7DD /* PBXTargetDependency */, - ); - name = "Evergreen-iOSTests"; - productName = "Evergreen-iOSTests"; - productReference = 84EBBBDC2026866100DEA7DD /* Evergreen-iOSTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 84EBBBBE2026866000DEA7DD /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0930; - LastUpgradeCheck = 0930; - ORGANIZATIONNAME = "Ranchero Software, LLC"; - TargetAttributes = { - 84EBBBC52026866000DEA7DD = { - CreatedOnToolsVersion = 9.3; - }; - 84EBBBDB2026866100DEA7DD = { - CreatedOnToolsVersion = 9.3; - TestTargetID = 84EBBBC52026866000DEA7DD; - }; - }; - }; - buildConfigurationList = 84EBBBC12026866000DEA7DD /* Build configuration list for PBXProject "Evergreen-iOS" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 84EBBBBD2026866000DEA7DD; - productRefGroup = 84EBBBC72026866000DEA7DD /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 84EBBBC52026866000DEA7DD /* Evergreen-iOS */, - 84EBBBDB2026866100DEA7DD /* Evergreen-iOSTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 84EBBBC42026866000DEA7DD /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 84B233F0202686E1007C5900 /* Assets.xcassets in Resources */, - 84B234012026876A007C5900 /* LaunchScreen.storyboard in Resources */, - 84B233FE2026875A007C5900 /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 84EBBBDA2026866100DEA7DD /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 84B233FB20268739007C5900 /* Info.plist in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 84EBBBC22026866000DEA7DD /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 84B233EC202686CE007C5900 /* MasterViewController.swift in Sources */, - 84B233EA202686C8007C5900 /* AppDelegate.swift in Sources */, - 84B233EE202686D6007C5900 /* DetailViewController.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 84EBBBD82026866100DEA7DD /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 84B233FA20268739007C5900 /* Evergreen_iOSTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 84EBBBDE2026866100DEA7DD /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 84EBBBC52026866000DEA7DD /* Evergreen-iOS */; - targetProxy = 84EBBBDD2026866100DEA7DD /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 84B233FC2026875A007C5900 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 84B233FD2026875A007C5900 /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 84B233FF2026876A007C5900 /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 84B234002026876A007C5900 /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 84EBBBE32026866100DEA7DD /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.3; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 84EBBBE42026866100DEA7DD /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.3; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 84EBBBE62026866100DEA7DD /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = M8L2WTLA8W; - INFOPLIST_FILE = "Evergreen-iOS/Evergreen-iOS/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.ranchero.Evergreen-iOS"; - PRODUCT_NAME = Evergreen; - SWIFT_VERSION = 4.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 84EBBBE72026866100DEA7DD /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = M8L2WTLA8W; - INFOPLIST_FILE = "Evergreen-iOS/Evergreen-iOS/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.ranchero.Evergreen-iOS"; - PRODUCT_NAME = Evergreen; - SWIFT_VERSION = 4.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - 84EBBBE92026866100DEA7DD /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = M8L2WTLA8W; - INFOPLIST_FILE = "Evergreen-iOSTests/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.ranchero.Evergreen-iOSTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Evergreen-iOS.app/Evergreen-iOS"; - }; - name = Debug; - }; - 84EBBBEA2026866100DEA7DD /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = M8L2WTLA8W; - INFOPLIST_FILE = "Evergreen-iOSTests/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.ranchero.Evergreen-iOSTests"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Evergreen-iOS.app/Evergreen-iOS"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 84EBBBC12026866000DEA7DD /* Build configuration list for PBXProject "Evergreen-iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 84EBBBE32026866100DEA7DD /* Debug */, - 84EBBBE42026866100DEA7DD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 84EBBBE52026866100DEA7DD /* Build configuration list for PBXNativeTarget "Evergreen-iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 84EBBBE62026866100DEA7DD /* Debug */, - 84EBBBE72026866100DEA7DD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 84EBBBE82026866100DEA7DD /* Build configuration list for PBXNativeTarget "Evergreen-iOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 84EBBBE92026866100DEA7DD /* Debug */, - 84EBBBEA2026866100DEA7DD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 84EBBBBE2026866000DEA7DD /* Project object */; -} diff --git a/Evergreen-iOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Evergreen-iOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a62..000000000 --- a/Evergreen-iOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/Evergreen-iOS/Evergreen-iOS/AppDelegate.swift b/Evergreen-iOS/Evergreen-iOS/AppDelegate.swift deleted file mode 100644 index f71840fb3..000000000 --- a/Evergreen-iOS/Evergreen-iOS/AppDelegate.swift +++ /dev/null @@ -1,61 +0,0 @@ -// -// AppDelegate.swift -// Evergreen-iOS -// -// Created by Brent Simmons on 2/3/18. -// Copyright © 2018 Ranchero Software, LLC. All rights reserved. -// - -import UIKit - -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDelegate { - - var window: UIWindow? - - - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { - // Override point for customization after application launch. - let splitViewController = window!.rootViewController as! UISplitViewController - let navigationController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] as! UINavigationController - navigationController.topViewController!.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem - splitViewController.delegate = self - return true - } - - func applicationWillResignActive(_ application: UIApplication) { - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. - } - - func applicationDidEnterBackground(_ application: UIApplication) { - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. - } - - func applicationWillEnterForeground(_ application: UIApplication) { - // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. - } - - func applicationDidBecomeActive(_ application: UIApplication) { - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. - } - - func applicationWillTerminate(_ application: UIApplication) { - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. - } - - // MARK: - Split view - - func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController:UIViewController, onto primaryViewController:UIViewController) -> Bool { - guard let secondaryAsNavController = secondaryViewController as? UINavigationController else { return false } - guard let topAsDetailController = secondaryAsNavController.topViewController as? DetailViewController else { return false } - if topAsDetailController.detailItem == nil { - // Return true to indicate that we have handled the collapse by doing nothing; the secondary controller will be discarded. - return true - } - return false - } - -} - diff --git a/Evergreen-iOS/Evergreen-iOS/Assets.xcassets/AppIcon.appiconset/Contents.json b/Evergreen-iOS/Evergreen-iOS/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index d8db8d65f..000000000 --- a/Evergreen-iOS/Evergreen-iOS/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "size" : "20x20", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "20x20", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "29x29", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "29x29", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "40x40", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "40x40", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "60x60", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "60x60", - "scale" : "3x" - }, - { - "idiom" : "ipad", - "size" : "20x20", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "20x20", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "29x29", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "29x29", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "40x40", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "40x40", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "76x76", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "76x76", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "83.5x83.5", - "scale" : "2x" - }, - { - "idiom" : "ios-marketing", - "size" : "1024x1024", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Evergreen-iOS/Evergreen-iOS/Assets.xcassets/Contents.json b/Evergreen-iOS/Evergreen-iOS/Assets.xcassets/Contents.json deleted file mode 100644 index da4a164c9..000000000 --- a/Evergreen-iOS/Evergreen-iOS/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Evergreen-iOS/Evergreen-iOS/Base.lproj/LaunchScreen.storyboard b/Evergreen-iOS/Evergreen-iOS/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index f83f6fd58..000000000 --- a/Evergreen-iOS/Evergreen-iOS/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Evergreen-iOS/Evergreen-iOS/Base.lproj/Main.storyboard b/Evergreen-iOS/Evergreen-iOS/Base.lproj/Main.storyboard deleted file mode 100644 index d78406541..000000000 --- a/Evergreen-iOS/Evergreen-iOS/Base.lproj/Main.storyboard +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Evergreen-iOS/Evergreen-iOS/DetailViewController.swift b/Evergreen-iOS/Evergreen-iOS/DetailViewController.swift deleted file mode 100644 index e1585d3b1..000000000 --- a/Evergreen-iOS/Evergreen-iOS/DetailViewController.swift +++ /dev/null @@ -1,45 +0,0 @@ -// -// DetailViewController.swift -// Evergreen-iOS -// -// Created by Brent Simmons on 2/3/18. -// Copyright © 2018 Ranchero Software, LLC. All rights reserved. -// - -import UIKit - -class DetailViewController: UIViewController { - - @IBOutlet weak var detailDescriptionLabel: UILabel! - - - func configureView() { - // Update the user interface for the detail item. - if let detail = detailItem { - if let label = detailDescriptionLabel { - label.text = detail.description - } - } - } - - override func viewDidLoad() { - super.viewDidLoad() - // Do any additional setup after loading the view, typically from a nib. - configureView() - } - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. - } - - var detailItem: NSDate? { - didSet { - // Update the view. - configureView() - } - } - - -} - diff --git a/Evergreen-iOS/Evergreen-iOS/Info.plist b/Evergreen-iOS/Evergreen-iOS/Info.plist deleted file mode 100644 index 1d6078905..000000000 --- a/Evergreen-iOS/Evergreen-iOS/Info.plist +++ /dev/null @@ -1,55 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - arm64 - - UIStatusBarTintParameters - - UINavigationBar - - Style - UIBarStyleDefault - Translucent - - - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/Evergreen-iOS/Evergreen-iOS/MasterViewController.swift b/Evergreen-iOS/Evergreen-iOS/MasterViewController.swift deleted file mode 100644 index 2fd2891a4..000000000 --- a/Evergreen-iOS/Evergreen-iOS/MasterViewController.swift +++ /dev/null @@ -1,95 +0,0 @@ -// -// MasterViewController.swift -// Evergreen-iOS -// -// Created by Brent Simmons on 2/3/18. -// Copyright © 2018 Ranchero Software, LLC. All rights reserved. -// - -import UIKit - -class MasterViewController: UITableViewController { - - var detailViewController: DetailViewController? = nil - var objects = [Any]() - - - override func viewDidLoad() { - super.viewDidLoad() - // Do any additional setup after loading the view, typically from a nib. - navigationItem.leftBarButtonItem = editButtonItem - - let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(insertNewObject(_:))) - navigationItem.rightBarButtonItem = addButton - if let split = splitViewController { - let controllers = split.viewControllers - detailViewController = (controllers[controllers.count-1] as! UINavigationController).topViewController as? DetailViewController - } - } - - override func viewWillAppear(_ animated: Bool) { - clearsSelectionOnViewWillAppear = splitViewController!.isCollapsed - super.viewWillAppear(animated) - } - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. - } - - @objc - func insertNewObject(_ sender: Any) { - objects.insert(NSDate(), at: 0) - let indexPath = IndexPath(row: 0, section: 0) - tableView.insertRows(at: [indexPath], with: .automatic) - } - - // MARK: - Segues - - override func prepare(for segue: UIStoryboardSegue, sender: Any?) { - if segue.identifier == "showDetail" { - if let indexPath = tableView.indexPathForSelectedRow { - let object = objects[indexPath.row] as! NSDate - let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController - controller.detailItem = object - controller.navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem - controller.navigationItem.leftItemsSupplementBackButton = true - } - } - } - - // MARK: - Table View - - override func numberOfSections(in tableView: UITableView) -> Int { - return 1 - } - - override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return objects.count - } - - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) - - let object = objects[indexPath.row] as! NSDate - cell.textLabel!.text = object.description - return cell - } - - override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { - // Return false if you do not want the specified item to be editable. - return true - } - - override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { - if editingStyle == .delete { - objects.remove(at: indexPath.row) - tableView.deleteRows(at: [indexPath], with: .fade) - } else if editingStyle == .insert { - // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view. - } - } - - -} - diff --git a/Evergreen-iOS/Evergreen-iOSTests/Evergreen_iOSTests.swift b/Evergreen-iOS/Evergreen-iOSTests/Evergreen_iOSTests.swift deleted file mode 100644 index bcd5c0487..000000000 --- a/Evergreen-iOS/Evergreen-iOSTests/Evergreen_iOSTests.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// Evergreen_iOSTests.swift -// Evergreen-iOSTests -// -// Created by Brent Simmons on 2/3/18. -// Copyright © 2018 Ranchero Software, LLC. All rights reserved. -// - -import XCTest -@testable import Evergreen_iOS - -class Evergreen_iOSTests: XCTestCase { - - override func setUp() { - super.setUp() - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDown() { - // Put teardown code here. This method is called after the invocation of each test method in the class. - super.tearDown() - } - - func testExample() { - // This is an example of a functional test case. - // Use XCTAssert and related functions to verify your tests produce the correct results. - } - - func testPerformanceExample() { - // This is an example of a performance test case. - self.measure { - // Put the code you want to measure the time of here. - } - } - -} diff --git a/Evergreen-iOS/Evergreen-iOSTests/Info.plist b/Evergreen-iOS/Evergreen-iOSTests/Info.plist deleted file mode 100644 index 6c40a6cd0..000000000 --- a/Evergreen-iOS/Evergreen-iOSTests/Info.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/Evergreen.xcodeproj/project.pbxproj b/Evergreen.xcodeproj/project.pbxproj index 70a5f6e6c..e339fd3c9 100644 --- a/Evergreen.xcodeproj/project.pbxproj +++ b/Evergreen.xcodeproj/project.pbxproj @@ -405,20 +405,6 @@ remoteGlobalIDString = 8439D9FA1C8937C800E5E4B4; remoteInfo = RSTextDrawing; }; - 84B2342A202689F5007C5900 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 84B23425202689F5007C5900 /* Evergreen-iOS.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 84EBBBC62026866000DEA7DD; - remoteInfo = "Evergreen-iOS"; - }; - 84B2342C202689F5007C5900 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 84B23425202689F5007C5900 /* Evergreen-iOS.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 84EBBBDC2026866100DEA7DD; - remoteInfo = "Evergreen-iOSTests"; - }; 84BB4B671F1174D400858766 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 84BB4B611F1174D400858766 /* Data.xcodeproj */; @@ -583,7 +569,6 @@ 84B06FE01ED3803200F0B54B /* RSFeedFinder.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RSFeedFinder.xcodeproj; path = Frameworks/RSFeedFinder/RSFeedFinder.xcodeproj; sourceTree = ""; }; 84B06FF41ED3818000F0B54B /* RSTree.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RSTree.xcodeproj; path = Frameworks/RSTree/RSTree.xcodeproj; sourceTree = ""; }; 84B070011ED3821800F0B54B /* RSTextDrawing.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RSTextDrawing.xcodeproj; path = Frameworks/RSTextDrawing/RSTextDrawing.xcodeproj; sourceTree = ""; }; - 84B23425202689F5007C5900 /* Evergreen-iOS.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = "Evergreen-iOS.xcodeproj"; sourceTree = ""; }; 84B7178B201E66580091657D /* SidebarViewController+ContextualMenus.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SidebarViewController+ContextualMenus.swift"; sourceTree = ""; }; 84B99C661FAE35E600ECDEDB /* FeedListTreeControllerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedListTreeControllerDelegate.swift; sourceTree = ""; }; 84B99C681FAE36B800ECDEDB /* FeedListFolder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedListFolder.swift; sourceTree = ""; }; @@ -996,7 +981,6 @@ 849C64741ED37A5D003D8FC0 /* EvergreenTests */, D5907CDA2002F084005947E5 /* xcconfig */, 849C64611ED37A5D003D8FC0 /* Products */, - 84B23425202689F5007C5900 /* Evergreen-iOS.xcodeproj */, 846E77301F6EF5D600A165E2 /* Account.xcodeproj */, 846E77161F6EF5D000A165E2 /* Database.xcodeproj */, 84BB4B611F1174D400858766 /* Data.xcodeproj */, @@ -1115,15 +1099,6 @@ name = Products; sourceTree = ""; }; - 84B23426202689F5007C5900 /* Products */ = { - isa = PBXGroup; - children = ( - 84B2342B202689F5007C5900 /* Evergreen.app */, - 84B2342D202689F5007C5900 /* Evergreen-iOSTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; 84BB4B621F1174D400858766 /* Products */ = { isa = PBXGroup; children = ( @@ -1353,10 +1328,6 @@ ProductGroup = 84B06FC71ED37F7200F0B54B /* Products */; ProjectRef = 84B06FC61ED37F7200F0B54B /* DB5.xcodeproj */; }, - { - ProductGroup = 84B23426202689F5007C5900 /* Products */; - ProjectRef = 84B23425202689F5007C5900 /* Evergreen-iOS.xcodeproj */; - }, { ProductGroup = 84B06FA31ED37DAC00F0B54B /* Products */; ProjectRef = 84B06FA21ED37DAC00F0B54B /* RSCore.xcodeproj */; @@ -1556,20 +1527,6 @@ remoteRef = 84B070081ED3821900F0B54B /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - 84B2342B202689F5007C5900 /* Evergreen.app */ = { - isa = PBXReferenceProxy; - fileType = wrapper.application; - path = Evergreen.app; - remoteRef = 84B2342A202689F5007C5900 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 84B2342D202689F5007C5900 /* Evergreen-iOSTests.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = "Evergreen-iOSTests.xctest"; - remoteRef = 84B2342C202689F5007C5900 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; 84BB4B681F1174D400858766 /* Data.framework */ = { isa = PBXReferenceProxy; fileType = wrapper.framework; From fc138990fffbe3172074eb473b4c614eee0f4c9a Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Mon, 5 Feb 2018 13:29:46 -0800 Subject: [PATCH 18/18] Create the iOS app as a separate target rather than as a separate project. --- Evergreen-iOS/AppDelegate.swift | 61 ++ .../AppIcon.appiconset/Contents.json | 98 +++ Evergreen-iOS/Assets.xcassets/Contents.json | 6 + .../Base.lproj/LaunchScreen.storyboard | 25 + Evergreen-iOS/Base.lproj/Main.storyboard | 133 ++++ Evergreen-iOS/DetailViewController.swift | 45 ++ Evergreen-iOS/Info.plist | 55 ++ Evergreen-iOS/MasterViewController.swift | 95 +++ Evergreen-iOSTests/Evergreen_iOSTests.swift | 36 + Evergreen-iOSTests/Info.plist | 22 + .../Evergreen_iOSUITests.swift | 36 + Evergreen-iOSUITests/Info.plist | 22 + Evergreen.xcodeproj/project.pbxproj | 672 +++++++++++++++++- 13 files changed, 1305 insertions(+), 1 deletion(-) create mode 100644 Evergreen-iOS/AppDelegate.swift create mode 100644 Evergreen-iOS/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Evergreen-iOS/Assets.xcassets/Contents.json create mode 100644 Evergreen-iOS/Base.lproj/LaunchScreen.storyboard create mode 100644 Evergreen-iOS/Base.lproj/Main.storyboard create mode 100644 Evergreen-iOS/DetailViewController.swift create mode 100644 Evergreen-iOS/Info.plist create mode 100644 Evergreen-iOS/MasterViewController.swift create mode 100644 Evergreen-iOSTests/Evergreen_iOSTests.swift create mode 100644 Evergreen-iOSTests/Info.plist create mode 100644 Evergreen-iOSUITests/Evergreen_iOSUITests.swift create mode 100644 Evergreen-iOSUITests/Info.plist diff --git a/Evergreen-iOS/AppDelegate.swift b/Evergreen-iOS/AppDelegate.swift new file mode 100644 index 000000000..1eb49e75e --- /dev/null +++ b/Evergreen-iOS/AppDelegate.swift @@ -0,0 +1,61 @@ +// +// AppDelegate.swift +// Evergreen-iOS +// +// Created by Brent Simmons on 2/5/18. +// Copyright © 2018 Ranchero Software. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDelegate { + + var window: UIWindow? + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + let splitViewController = window!.rootViewController as! UISplitViewController + let navigationController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] as! UINavigationController + navigationController.topViewController!.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem + splitViewController.delegate = self + return true + } + + func applicationWillResignActive(_ application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(_ application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(_ application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(_ application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + // MARK: - Split view + + func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController:UIViewController, onto primaryViewController:UIViewController) -> Bool { + guard let secondaryAsNavController = secondaryViewController as? UINavigationController else { return false } + guard let topAsDetailController = secondaryAsNavController.topViewController as? DetailViewController else { return false } + if topAsDetailController.detailItem == nil { + // Return true to indicate that we have handled the collapse by doing nothing; the secondary controller will be discarded. + return true + } + return false + } + +} + diff --git a/Evergreen-iOS/Assets.xcassets/AppIcon.appiconset/Contents.json b/Evergreen-iOS/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..d8db8d65f --- /dev/null +++ b/Evergreen-iOS/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Evergreen-iOS/Assets.xcassets/Contents.json b/Evergreen-iOS/Assets.xcassets/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/Evergreen-iOS/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Evergreen-iOS/Base.lproj/LaunchScreen.storyboard b/Evergreen-iOS/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 000000000..f83f6fd58 --- /dev/null +++ b/Evergreen-iOS/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Evergreen-iOS/Base.lproj/Main.storyboard b/Evergreen-iOS/Base.lproj/Main.storyboard new file mode 100644 index 000000000..d78406541 --- /dev/null +++ b/Evergreen-iOS/Base.lproj/Main.storyboard @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Evergreen-iOS/DetailViewController.swift b/Evergreen-iOS/DetailViewController.swift new file mode 100644 index 000000000..ff7d668b0 --- /dev/null +++ b/Evergreen-iOS/DetailViewController.swift @@ -0,0 +1,45 @@ +// +// DetailViewController.swift +// Evergreen-iOS +// +// Created by Brent Simmons on 2/5/18. +// Copyright © 2018 Ranchero Software. All rights reserved. +// + +import UIKit + +class DetailViewController: UIViewController { + + @IBOutlet weak var detailDescriptionLabel: UILabel! + + + func configureView() { + // Update the user interface for the detail item. + if let detail = detailItem { + if let label = detailDescriptionLabel { + label.text = detail.description + } + } + } + + override func viewDidLoad() { + super.viewDidLoad() + // Do any additional setup after loading the view, typically from a nib. + configureView() + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + var detailItem: NSDate? { + didSet { + // Update the view. + configureView() + } + } + + +} + diff --git a/Evergreen-iOS/Info.plist b/Evergreen-iOS/Info.plist new file mode 100644 index 000000000..1d6078905 --- /dev/null +++ b/Evergreen-iOS/Info.plist @@ -0,0 +1,55 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + arm64 + + UIStatusBarTintParameters + + UINavigationBar + + Style + UIBarStyleDefault + Translucent + + + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Evergreen-iOS/MasterViewController.swift b/Evergreen-iOS/MasterViewController.swift new file mode 100644 index 000000000..8c49a2c90 --- /dev/null +++ b/Evergreen-iOS/MasterViewController.swift @@ -0,0 +1,95 @@ +// +// MasterViewController.swift +// Evergreen-iOS +// +// Created by Brent Simmons on 2/5/18. +// Copyright © 2018 Ranchero Software. All rights reserved. +// + +import UIKit + +class MasterViewController: UITableViewController { + + var detailViewController: DetailViewController? = nil + var objects = [Any]() + + + override func viewDidLoad() { + super.viewDidLoad() + // Do any additional setup after loading the view, typically from a nib. + navigationItem.leftBarButtonItem = editButtonItem + + let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(insertNewObject(_:))) + navigationItem.rightBarButtonItem = addButton + if let split = splitViewController { + let controllers = split.viewControllers + detailViewController = (controllers[controllers.count-1] as! UINavigationController).topViewController as? DetailViewController + } + } + + override func viewWillAppear(_ animated: Bool) { + clearsSelectionOnViewWillAppear = splitViewController!.isCollapsed + super.viewWillAppear(animated) + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + @objc + func insertNewObject(_ sender: Any) { + objects.insert(NSDate(), at: 0) + let indexPath = IndexPath(row: 0, section: 0) + tableView.insertRows(at: [indexPath], with: .automatic) + } + + // MARK: - Segues + + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + if segue.identifier == "showDetail" { + if let indexPath = tableView.indexPathForSelectedRow { + let object = objects[indexPath.row] as! NSDate + let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController + controller.detailItem = object + controller.navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem + controller.navigationItem.leftItemsSupplementBackButton = true + } + } + } + + // MARK: - Table View + + override func numberOfSections(in tableView: UITableView) -> Int { + return 1 + } + + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return objects.count + } + + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) + + let object = objects[indexPath.row] as! NSDate + cell.textLabel!.text = object.description + return cell + } + + override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { + // Return false if you do not want the specified item to be editable. + return true + } + + override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { + if editingStyle == .delete { + objects.remove(at: indexPath.row) + tableView.deleteRows(at: [indexPath], with: .fade) + } else if editingStyle == .insert { + // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view. + } + } + + +} + diff --git a/Evergreen-iOSTests/Evergreen_iOSTests.swift b/Evergreen-iOSTests/Evergreen_iOSTests.swift new file mode 100644 index 000000000..0cbcccfe8 --- /dev/null +++ b/Evergreen-iOSTests/Evergreen_iOSTests.swift @@ -0,0 +1,36 @@ +// +// Evergreen_iOSTests.swift +// Evergreen-iOSTests +// +// Created by Brent Simmons on 2/5/18. +// Copyright © 2018 Ranchero Software. All rights reserved. +// + +import XCTest +@testable import Evergreen_iOS + +class Evergreen_iOSTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measure { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/Evergreen-iOSTests/Info.plist b/Evergreen-iOSTests/Info.plist new file mode 100644 index 000000000..6c40a6cd0 --- /dev/null +++ b/Evergreen-iOSTests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Evergreen-iOSUITests/Evergreen_iOSUITests.swift b/Evergreen-iOSUITests/Evergreen_iOSUITests.swift new file mode 100644 index 000000000..66023b2c1 --- /dev/null +++ b/Evergreen-iOSUITests/Evergreen_iOSUITests.swift @@ -0,0 +1,36 @@ +// +// Evergreen_iOSUITests.swift +// Evergreen-iOSUITests +// +// Created by Brent Simmons on 2/5/18. +// Copyright © 2018 Ranchero Software. All rights reserved. +// + +import XCTest + +class Evergreen_iOSUITests: XCTestCase { + + override func setUp() { + super.setUp() + + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. + XCUIApplication().launch() + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // Use recording to get started writing UI tests. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + +} diff --git a/Evergreen-iOSUITests/Info.plist b/Evergreen-iOSUITests/Info.plist new file mode 100644 index 000000000..6c40a6cd0 --- /dev/null +++ b/Evergreen-iOSUITests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Evergreen.xcodeproj/project.pbxproj b/Evergreen.xcodeproj/project.pbxproj index e339fd3c9..6c6918fe6 100644 --- a/Evergreen.xcodeproj/project.pbxproj +++ b/Evergreen.xcodeproj/project.pbxproj @@ -8,6 +8,14 @@ /* Begin PBXBuildFile section */ 8403E75B201C4A79007F7246 /* FeedListKeyboardDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8403E75A201C4A79007F7246 /* FeedListKeyboardDelegate.swift */; }; + 840D617F2029031C009BC708 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 840D617E2029031C009BC708 /* AppDelegate.swift */; }; + 840D61812029031C009BC708 /* MasterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 840D61802029031C009BC708 /* MasterViewController.swift */; }; + 840D61832029031C009BC708 /* DetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 840D61822029031C009BC708 /* DetailViewController.swift */; }; + 840D61862029031C009BC708 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 840D61842029031C009BC708 /* Main.storyboard */; }; + 840D61882029031D009BC708 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 840D61872029031D009BC708 /* Assets.xcassets */; }; + 840D618B2029031D009BC708 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 840D61892029031D009BC708 /* LaunchScreen.storyboard */; }; + 840D61962029031D009BC708 /* Evergreen_iOSTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 840D61952029031D009BC708 /* Evergreen_iOSTests.swift */; }; + 840D61A12029031E009BC708 /* Evergreen_iOSUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 840D61A02029031E009BC708 /* Evergreen_iOSUITests.swift */; }; 8414AD251FCF5A1E00955102 /* TimelineHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8414AD241FCF5A1E00955102 /* TimelineHeaderView.swift */; }; 841ABA4E20145E7300980E11 /* NothingInspectorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 841ABA4D20145E7300980E11 /* NothingInspectorViewController.swift */; }; 841ABA5E20145E9200980E11 /* FolderInspectorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 841ABA5D20145E9200980E11 /* FolderInspectorViewController.swift */; }; @@ -167,6 +175,20 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + 840D61922029031D009BC708 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 849C64581ED37A5D003D8FC0 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 840D617B2029031C009BC708; + remoteInfo = "Evergreen-iOS"; + }; + 840D619D2029031E009BC708 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 849C64581ED37A5D003D8FC0 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 840D617B2029031C009BC708; + remoteInfo = "Evergreen-iOS"; + }; 846E77201F6EF5D100A165E2 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 846E77161F6EF5D000A165E2 /* Database.xcodeproj */; @@ -471,6 +493,20 @@ /* Begin PBXFileReference section */ 8403E75A201C4A79007F7246 /* FeedListKeyboardDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedListKeyboardDelegate.swift; sourceTree = ""; }; + 840D617C2029031C009BC708 /* Evergreen.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Evergreen.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 840D617E2029031C009BC708 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 840D61802029031C009BC708 /* MasterViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MasterViewController.swift; sourceTree = ""; }; + 840D61822029031C009BC708 /* DetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailViewController.swift; sourceTree = ""; }; + 840D61852029031C009BC708 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 840D61872029031D009BC708 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 840D618A2029031D009BC708 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 840D618C2029031D009BC708 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 840D61912029031D009BC708 /* Evergreen-iOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Evergreen-iOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 840D61952029031D009BC708 /* Evergreen_iOSTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Evergreen_iOSTests.swift; sourceTree = ""; }; + 840D61972029031D009BC708 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 840D619C2029031D009BC708 /* Evergreen-iOSUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Evergreen-iOSUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 840D61A02029031E009BC708 /* Evergreen_iOSUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Evergreen_iOSUITests.swift; sourceTree = ""; }; + 840D61A22029031E009BC708 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 8414AD241FCF5A1E00955102 /* TimelineHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineHeaderView.swift; sourceTree = ""; }; 841ABA4D20145E7300980E11 /* NothingInspectorViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NothingInspectorViewController.swift; sourceTree = ""; }; 841ABA5D20145E9200980E11 /* FolderInspectorViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FolderInspectorViewController.swift; sourceTree = ""; }; @@ -624,6 +660,27 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 840D61792029031C009BC708 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 840D618E2029031D009BC708 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 840D61992029031D009BC708 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 849C645D1ED37A5D003D8FC0 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -653,6 +710,38 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 840D617D2029031C009BC708 /* Evergreen-iOS */ = { + isa = PBXGroup; + children = ( + 840D617E2029031C009BC708 /* AppDelegate.swift */, + 840D61802029031C009BC708 /* MasterViewController.swift */, + 840D61822029031C009BC708 /* DetailViewController.swift */, + 840D61842029031C009BC708 /* Main.storyboard */, + 840D61872029031D009BC708 /* Assets.xcassets */, + 840D61892029031D009BC708 /* LaunchScreen.storyboard */, + 840D618C2029031D009BC708 /* Info.plist */, + ); + path = "Evergreen-iOS"; + sourceTree = ""; + }; + 840D61942029031D009BC708 /* Evergreen-iOSTests */ = { + isa = PBXGroup; + children = ( + 840D61952029031D009BC708 /* Evergreen_iOSTests.swift */, + 840D61972029031D009BC708 /* Info.plist */, + ); + path = "Evergreen-iOSTests"; + sourceTree = ""; + }; + 840D619F2029031E009BC708 /* Evergreen-iOSUITests */ = { + isa = PBXGroup; + children = ( + 840D61A02029031E009BC708 /* Evergreen_iOSUITests.swift */, + 840D61A22029031E009BC708 /* Info.plist */, + ); + path = "Evergreen-iOSUITests"; + sourceTree = ""; + }; 8426119C1FCB6ED40086A189 /* HTMLMetadata */ = { isa = PBXGroup; children = ( @@ -977,6 +1066,9 @@ D5907D6F2004AB67005947E5 /* Scriptability */, D5558FD6200227E60066386B /* AppleEvents */, 849A97991ED9EFB6007D329B /* Resources */, + 840D617D2029031C009BC708 /* Evergreen-iOS */, + 840D61942029031D009BC708 /* Evergreen-iOSTests */, + 840D619F2029031E009BC708 /* Evergreen-iOSUITests */, 84FB9A2C1EDCD6A4003D53B9 /* Frameworks */, 849C64741ED37A5D003D8FC0 /* EvergreenTests */, D5907CDA2002F084005947E5 /* xcconfig */, @@ -1000,6 +1092,9 @@ children = ( 849C64601ED37A5D003D8FC0 /* Evergreen.app */, 849C64711ED37A5D003D8FC0 /* EvergreenTests.xctest */, + 840D617C2029031C009BC708 /* Evergreen.app */, + 840D61912029031D009BC708 /* Evergreen-iOSTests.xctest */, + 840D619C2029031D009BC708 /* Evergreen-iOSUITests.xctest */, ); name = Products; sourceTree = ""; @@ -1228,6 +1323,59 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ + 840D617B2029031C009BC708 /* Evergreen-iOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 840D61A32029031E009BC708 /* Build configuration list for PBXNativeTarget "Evergreen-iOS" */; + buildPhases = ( + 840D61782029031C009BC708 /* Sources */, + 840D61792029031C009BC708 /* Frameworks */, + 840D617A2029031C009BC708 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Evergreen-iOS"; + productName = "Evergreen-iOS"; + productReference = 840D617C2029031C009BC708 /* Evergreen.app */; + productType = "com.apple.product-type.application"; + }; + 840D61902029031D009BC708 /* Evergreen-iOSTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 840D61A62029031E009BC708 /* Build configuration list for PBXNativeTarget "Evergreen-iOSTests" */; + buildPhases = ( + 840D618D2029031D009BC708 /* Sources */, + 840D618E2029031D009BC708 /* Frameworks */, + 840D618F2029031D009BC708 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 840D61932029031D009BC708 /* PBXTargetDependency */, + ); + name = "Evergreen-iOSTests"; + productName = "Evergreen-iOSTests"; + productReference = 840D61912029031D009BC708 /* Evergreen-iOSTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 840D619B2029031D009BC708 /* Evergreen-iOSUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 840D61A92029031E009BC708 /* Build configuration list for PBXNativeTarget "Evergreen-iOSUITests" */; + buildPhases = ( + 840D61982029031D009BC708 /* Sources */, + 840D61992029031D009BC708 /* Frameworks */, + 840D619A2029031D009BC708 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 840D619E2029031E009BC708 /* PBXTargetDependency */, + ); + name = "Evergreen-iOSUITests"; + productName = "Evergreen-iOSUITests"; + productReference = 840D619C2029031D009BC708 /* Evergreen-iOSUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; 849C645F1ED37A5D003D8FC0 /* Evergreen */ = { isa = PBXNativeTarget; buildConfigurationList = 849C647A1ED37A5D003D8FC0 /* Build configuration list for PBXNativeTarget "Evergreen" */; @@ -1283,10 +1431,27 @@ 849C64581ED37A5D003D8FC0 /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 0820; + LastSwiftUpdateCheck = 0930; LastUpgradeCheck = 0930; ORGANIZATIONNAME = "Ranchero Software"; TargetAttributes = { + 840D617B2029031C009BC708 = { + CreatedOnToolsVersion = 9.3; + DevelopmentTeam = 9C84TZ7Q6Z; + ProvisioningStyle = Automatic; + }; + 840D61902029031D009BC708 = { + CreatedOnToolsVersion = 9.3; + DevelopmentTeam = 9C84TZ7Q6Z; + ProvisioningStyle = Automatic; + TestTargetID = 840D617B2029031C009BC708; + }; + 840D619B2029031D009BC708 = { + CreatedOnToolsVersion = 9.3; + DevelopmentTeam = 9C84TZ7Q6Z; + ProvisioningStyle = Automatic; + TestTargetID = 840D617B2029031C009BC708; + }; 849C645F1ED37A5D003D8FC0 = { CreatedOnToolsVersion = 8.2.1; DevelopmentTeam = M8L2WTLA8W; @@ -1361,6 +1526,9 @@ targets = ( 849C645F1ED37A5D003D8FC0 /* Evergreen */, 849C64701ED37A5D003D8FC0 /* EvergreenTests */, + 840D617B2029031C009BC708 /* Evergreen-iOS */, + 840D61902029031D009BC708 /* Evergreen-iOSTests */, + 840D619B2029031D009BC708 /* Evergreen-iOSUITests */, ); }; /* End PBXProject section */ @@ -1544,6 +1712,30 @@ /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ + 840D617A2029031C009BC708 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 840D618B2029031D009BC708 /* LaunchScreen.storyboard in Resources */, + 840D61882029031D009BC708 /* Assets.xcassets in Resources */, + 840D61862029031C009BC708 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 840D618F2029031D009BC708 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 840D619A2029031D009BC708 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 849C645E1ED37A5D003D8FC0 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -1597,6 +1789,32 @@ /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 840D61782029031C009BC708 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 840D61832029031C009BC708 /* DetailViewController.swift in Sources */, + 840D61812029031C009BC708 /* MasterViewController.swift in Sources */, + 840D617F2029031C009BC708 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 840D618D2029031D009BC708 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 840D61962029031D009BC708 /* Evergreen_iOSTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 840D61982029031D009BC708 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 840D61A12029031E009BC708 /* Evergreen_iOSUITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 849C645C1ED37A5D003D8FC0 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1720,6 +1938,16 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ + 840D61932029031D009BC708 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 840D617B2029031C009BC708 /* Evergreen-iOS */; + targetProxy = 840D61922029031D009BC708 /* PBXContainerItemProxy */; + }; + 840D619E2029031E009BC708 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 840D617B2029031C009BC708 /* Evergreen-iOS */; + targetProxy = 840D619D2029031E009BC708 /* PBXContainerItemProxy */; + }; 846E77401F6EF67A00A165E2 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Account; @@ -1783,6 +2011,22 @@ /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ + 840D61842029031C009BC708 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 840D61852029031C009BC708 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 840D61892029031D009BC708 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 840D618A2029031D009BC708 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; 849A97931ED9EF7A007D329B /* IndeterminateProgressWindow.xib */ = { isa = PBXVariantGroup; children = ( @@ -1843,6 +2087,405 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + 840D61A42029031E009BC708 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = 9C84TZ7Q6Z; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = "Evergreen-iOS/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 11.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.ranchero.Evergreen-iOS"; + PRODUCT_NAME = Evergreen; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 840D61A52029031E009BC708 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 9C84TZ7Q6Z; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = "Evergreen-iOS/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 11.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.ranchero.Evergreen-iOS"; + PRODUCT_NAME = Evergreen; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 840D61A72029031E009BC708 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ALWAYS_SEARCH_USER_PATHS = NO; + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = 9C84TZ7Q6Z; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = "Evergreen-iOSTests/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 11.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.ranchero.Evergreen-iOSTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Evergreen-iOS.app/Evergreen-iOS"; + }; + name = Debug; + }; + 840D61A82029031E009BC708 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ALWAYS_SEARCH_USER_PATHS = NO; + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 9C84TZ7Q6Z; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = "Evergreen-iOSTests/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 11.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.ranchero.Evergreen-iOSTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Evergreen-iOS.app/Evergreen-iOS"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 840D61AA2029031E009BC708 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = 9C84TZ7Q6Z; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = "Evergreen-iOSUITests/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 11.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.ranchero.Evergreen-iOSUITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = "Evergreen-iOS"; + }; + name = Debug; + }; + 840D61AB2029031E009BC708 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 9C84TZ7Q6Z; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = "Evergreen-iOSUITests/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 11.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.ranchero.Evergreen-iOSUITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = "Evergreen-iOS"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; 849C64781ED37A5D003D8FC0 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = D5907CDD2002F0BE005947E5 /* Evergreen_project_debug.xcconfig */; @@ -1890,6 +2533,33 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 840D61A32029031E009BC708 /* Build configuration list for PBXNativeTarget "Evergreen-iOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 840D61A42029031E009BC708 /* Debug */, + 840D61A52029031E009BC708 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 840D61A62029031E009BC708 /* Build configuration list for PBXNativeTarget "Evergreen-iOSTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 840D61A72029031E009BC708 /* Debug */, + 840D61A82029031E009BC708 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 840D61A92029031E009BC708 /* Build configuration list for PBXNativeTarget "Evergreen-iOSUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 840D61AA2029031E009BC708 /* Debug */, + 840D61AB2029031E009BC708 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 849C645B1ED37A5D003D8FC0 /* Build configuration list for PBXProject "Evergreen" */ = { isa = XCConfigurationList; buildConfigurations = (