diff --git a/Evergreen/MainWindow/Timeline/TimelineViewController.swift b/Evergreen/MainWindow/Timeline/TimelineViewController.swift index 218bdd752..0725f118e 100644 --- a/Evergreen/MainWindow/Timeline/TimelineViewController.swift +++ b/Evergreen/MainWindow/Timeline/TimelineViewController.swift @@ -367,64 +367,46 @@ class TimelineViewController: NSViewController, NSTableViewDelegate, NSTableView private func articleComparator(_ article1: Article, article2: Article) -> Bool { - return article1.logicalDatePublished.compare(article2.logicalDatePublished) == .orderedDescending + return article1.logicalDatePublished < article2.logicalDatePublished } + private func articlesSortedByDate(_ articles: Set
) -> [Article] { + + return Array(articles).sorted(by: articleComparator) + } + // MARK: Fetching Articles + private func emptyTheTimeline() { + + if !articles.isEmpty { + articles = [Article]() + } + } + private func fetchArticles() { -// guard let representedObjects = representedObjects else { -// if !articles.isEmpty { -// articles = [Article]() -// } -// return -// } -// -// var accountsDictionary = [String: [AnyObject]]() -// -// func addToAccountArray(accountID: String, object: AnyObject) { -// -// if let accountArray = accountsDictionary[accountID] { -// if !accountArray.contains(where: { $0 === object }) { -// accountsDictionary[accountID] = accountArray + [object] -// } -// } -// else { -// accountsDictionary[accountID] = [object] -// } -// } -// -// for oneObject in representedObjects { -// -// if let oneFeed = oneObject as? Feed { -// addToAccountArray(accountID: oneFeed.account.accountID, object: oneFeed) -// } -// else if let oneFolder = oneObject as? Folder, let accountID = oneFolder.account?.accountID { -// addToAccountArray(accountID: accountID, object: oneFolder) -// } -// } -// -// var fetchedArticles = [Article]() -// for (accountID, objects) in accountsDictionary { -// -// guard let oneAccount = accountWithID(accountID) else { -// continue -// } -// -// let oneFetchedArticles = oneAccount.fetchArticles(for: objects) -// for oneFetchedArticle in oneFetchedArticles { -// if !fetchedArticles.contains(where: { $0 === oneFetchedArticle }) { -// fetchedArticles += [oneFetchedArticle] -// } -// } -// } -// -// fetchedArticles.sort(by: articleComparator) -// -// if articles != fetchedArticles { -// articles = fetchedArticles -// } + guard let representedObjects = representedObjects else { + emptyTheTimeline() + return + } + + var fetchedArticles = Set
() + + for object in representedObjects { + + if let feed = object as? Feed { + fetchedArticles.formUnion(feed.fetchArticles()) + } + else if let folder = object as? Folder { + fetchedArticles.formUnion(folder.fetchArticles()) + } + } + + let sortedArticles = articlesSortedByDate(fetchedArticles) + if articles != sortedArticles { + articles = sortedArticles + } } // MARK: Cell Configuring diff --git a/Frameworks/Account/Account.swift b/Frameworks/Account/Account.swift index 93c308fdd..33b56ce47 100644 --- a/Frameworks/Account/Account.swift +++ b/Frameworks/Account/Account.swift @@ -242,6 +242,16 @@ public final class Account: DisplayNameProvider, Container, Hashable { } } + public func fetchArticles(for feed: Feed) -> Set
{ + + return database.fetchArticles(for: feed) + } + + public func fetchArticles(folder: Folder) -> Set
{ + + return database.fetchUnreadArticles(for: folder.flattenedFeeds()) + } + // MARK: - Notifications @objc func downloadProgressDidChange(_ note: Notification) { diff --git a/Frameworks/Account/AccountManager.swift b/Frameworks/Account/AccountManager.swift index 6a1cfb02d..e9d964c74 100644 --- a/Frameworks/Account/AccountManager.swift +++ b/Frameworks/Account/AccountManager.swift @@ -208,16 +208,20 @@ private struct AccountSpecifier { init?(folderPath: String) { - self.folderPath = folderPath - self.folderName = NSString(string: folderPath).lastPathComponent - - let nameComponents = self.folderName.components(separatedBy: "-") - let satisfyCompilerFolderName = self.folderName - assert(nameComponents.count == 2, "Can’t determine account info from \(satisfyCompilerFolderName)") + if !FileManager.default.rs_fileIsFolder(folderPath) { + return nil + } + let name = NSString(string: folderPath).lastPathComponent + if name.hasPrefix(".") { + return nil + } + let nameComponents = name.components(separatedBy: "-") if nameComponents.count != 2 { return nil } + self.folderPath = folderPath + self.folderName = name self.type = nameComponents[0] self.identifier = nameComponents[1] diff --git a/Frameworks/Account/DataExtensions.swift b/Frameworks/Account/DataExtensions.swift index 3a313faad..5325b3c88 100644 --- a/Frameworks/Account/DataExtensions.swift +++ b/Frameworks/Account/DataExtensions.swift @@ -11,11 +11,20 @@ import Data public extension Feed { - var account: Account? { + public var account: Account? { get { return AccountManager.shared.existingAccount(with: accountID) } } + + public func fetchArticles() -> Set
{ + + guard let account = account else { + assertionFailure("Expected feed.account.") + return Set
() + } + return account.fetchArticles(for: self) + } } public extension Article { diff --git a/Frameworks/Account/Folder.swift b/Frameworks/Account/Folder.swift index 2c7a8df01..addeab88a 100644 --- a/Frameworks/Account/Folder.swift +++ b/Frameworks/Account/Folder.swift @@ -16,6 +16,13 @@ public final class Folder: DisplayNameProvider, Container, UnreadCountProvider { var name: String? static let untitledName = NSLocalizedString("Untitled ƒ", comment: "Folder name") + // MARK: - Fetching Articles + + public func fetchArticles() -> Set
{ + + return account.fetchArticles(folder: self) + } + // MARK: - DisplayNameProvider public var nameForDisplay: String {