diff --git a/Account/Sources/Account/AccountManager.swift b/Account/Sources/Account/AccountManager.swift index 2decbd3f4..f3c1fa853 100644 --- a/Account/Sources/Account/AccountManager.swift +++ b/Account/Sources/Account/AccountManager.swift @@ -197,7 +197,7 @@ public final class AccountManager: UnreadCountProvider { return nil } - public func existingFeed(with feedID: FeedIdentifier) -> SidebarItem? { + public func existingFeed(with feedID: SidebarItemIdentifier) -> SidebarItem? { switch feedID { case .folder(let accountID, let folderName): if let account = existingAccount(with: accountID) { diff --git a/Account/Sources/Account/Folder.swift b/Account/Sources/Account/Folder.swift index 5d98c671f..f7d178ed1 100644 --- a/Account/Sources/Account/Folder.swift +++ b/Account/Sources/Account/Folder.swift @@ -24,12 +24,12 @@ public final class Folder: SidebarItem, Renamable, Container, Hashable { return ContainerIdentifier.folder(accountID, nameForDisplay) } - public var feedID: FeedIdentifier? { + public var feedID: SidebarItemIdentifier? { guard let accountID = account?.accountID else { assertionFailure("Expected feed.account, but got nil.") return nil } - return FeedIdentifier.folder(accountID, nameForDisplay) + return SidebarItemIdentifier.folder(accountID, nameForDisplay) } public weak var account: Account? diff --git a/Account/Sources/Account/SidebarItem.swift b/Account/Sources/Account/SidebarItem.swift index fa476d2cf..df717a66a 100644 --- a/Account/Sources/Account/SidebarItem.swift +++ b/Account/Sources/Account/SidebarItem.swift @@ -15,7 +15,7 @@ public enum ReadFilterType { case alwaysRead } -public protocol SidebarItem: FeedIdentifiable, ArticleFetcher, DisplayNameProvider, UnreadCountProvider { +public protocol SidebarItem: SidebarItemIdentifiable, ArticleFetcher, DisplayNameProvider, UnreadCountProvider { var account: Account? { get } var defaultReadFilterType: ReadFilterType { get } @@ -24,7 +24,7 @@ public protocol SidebarItem: FeedIdentifiable, ArticleFetcher, DisplayNameProvid public extension SidebarItem { - func readFiltered(readFilterEnabledTable: [FeedIdentifier: Bool]) -> Bool { + func readFiltered(readFilterEnabledTable: [SidebarItemIdentifier: Bool]) -> Bool { guard defaultReadFilterType != .alwaysRead else { return true } diff --git a/Account/Sources/Account/FeedIdentifier.swift b/Account/Sources/Account/SidebarItemIdentifier.swift similarity index 83% rename from Account/Sources/Account/FeedIdentifier.swift rename to Account/Sources/Account/SidebarItemIdentifier.swift index 05d3d7f23..65e05efd0 100644 --- a/Account/Sources/Account/FeedIdentifier.swift +++ b/Account/Sources/Account/SidebarItemIdentifier.swift @@ -8,11 +8,11 @@ import Foundation -public protocol FeedIdentifiable { - var feedID: FeedIdentifier? { get } +public protocol SidebarItemIdentifiable { + var feedID: SidebarItemIdentifier? { get } } -public enum FeedIdentifier: CustomStringConvertible, Hashable, Equatable { +public enum SidebarItemIdentifier: CustomStringConvertible, Hashable, Equatable { case smartFeed(String) // String is a unique identifier case script(String) // String is a unique identifier @@ -65,16 +65,16 @@ public enum FeedIdentifier: CustomStringConvertible, Hashable, Equatable { switch type { case "smartFeed": guard let id = userInfo["id"] as? String else { return nil } - self = FeedIdentifier.smartFeed(id) + self = SidebarItemIdentifier.smartFeed(id) case "script": guard let id = userInfo["id"] as? String else { return nil } - self = FeedIdentifier.script(id) + self = SidebarItemIdentifier.script(id) case "feed": guard let accountID = userInfo["accountID"] as? String, let webFeedID = userInfo["webFeedID"] as? String else { return nil } - self = FeedIdentifier.webFeed(accountID, webFeedID) + self = SidebarItemIdentifier.webFeed(accountID, webFeedID) case "folder": guard let accountID = userInfo["accountID"] as? String, let folderName = userInfo["folderName"] as? String else { return nil } - self = FeedIdentifier.folder(accountID, folderName) + self = SidebarItemIdentifier.folder(accountID, folderName) default: return nil } diff --git a/Account/Sources/Account/WebFeed.swift b/Account/Sources/Account/WebFeed.swift index b19166ade..1e64dd32c 100644 --- a/Account/Sources/Account/WebFeed.swift +++ b/Account/Sources/Account/WebFeed.swift @@ -17,12 +17,12 @@ public final class WebFeed: SidebarItem, Renamable, Hashable { return .none } - public var feedID: FeedIdentifier? { + public var feedID: SidebarItemIdentifier? { guard let accountID = account?.accountID else { assertionFailure("Expected feed.account, but got nil.") return nil } - return FeedIdentifier.webFeed(accountID, webFeedID) + return SidebarItemIdentifier.webFeed(accountID, webFeedID) } public weak var account: Account? diff --git a/Mac/MainWindow/Sidebar/SidebarViewController.swift b/Mac/MainWindow/Sidebar/SidebarViewController.swift index 68bc03474..91b911c3e 100644 --- a/Mac/MainWindow/Sidebar/SidebarViewController.swift +++ b/Mac/MainWindow/Sidebar/SidebarViewController.swift @@ -111,7 +111,7 @@ protocol SidebarDelegate: AnyObject { return } - let selectedFeedIdentifers = Set(selectedFeedsState.compactMap( { FeedIdentifier(userInfo: $0) })) + let selectedFeedIdentifers = Set(selectedFeedsState.compactMap( { SidebarItemIdentifier(userInfo: $0) })) selectedFeedIdentifers.forEach { treeControllerDelegate.addFilterException($0) } rebuildTreeAndReloadDataIfNeeded() @@ -119,7 +119,7 @@ protocol SidebarDelegate: AnyObject { var selectIndexes = IndexSet() func selectFeedsVisitor(node: Node) { - if let feedID = (node.representedObject as? FeedIdentifiable)?.feedID { + if let feedID = (node.representedObject as? SidebarItemIdentifiable)?.feedID { if selectedFeedIdentifers.contains(feedID) { selectIndexes.insert(outlineView.row(forItem: node) ) } diff --git a/Mac/MainWindow/Timeline/TimelineViewController.swift b/Mac/MainWindow/Timeline/TimelineViewController.swift index a7f76502a..b93903d1d 100644 --- a/Mac/MainWindow/Timeline/TimelineViewController.swift +++ b/Mac/MainWindow/Timeline/TimelineViewController.swift @@ -28,7 +28,7 @@ final class TimelineViewController: NSViewController, UndoableCommandRunner, Unr @IBOutlet var tableView: TimelineTableView! - private var readFilterEnabledTable = [FeedIdentifier: Bool]() + private var readFilterEnabledTable = [SidebarItemIdentifier: Bool]() var isReadFiltered: Bool? { guard representedObjects?.count == 1, let timelineFeed = representedObjects?.first as? SidebarItem else { return nil @@ -287,7 +287,7 @@ final class TimelineViewController: NSViewController, UndoableCommandRunner, Unr } for i in 0.. IconImage? { + func imageFor(_ feedID: SidebarItemIdentifier) -> IconImage? { if let smartFeed = SmartFeedsController.shared.find(by: feedID) { return imageForFeed(smartFeed) } @@ -59,17 +59,17 @@ class IconImageCache { } func emptyCache() { - smartFeedIconImageCache = [FeedIdentifier: IconImage]() - webFeedIconImageCache = [FeedIdentifier: IconImage]() - faviconImageCache = [FeedIdentifier: IconImage]() - smallIconImageCache = [FeedIdentifier: IconImage]() + smartFeedIconImageCache = [SidebarItemIdentifier: IconImage]() + webFeedIconImageCache = [SidebarItemIdentifier: IconImage]() + faviconImageCache = [SidebarItemIdentifier: IconImage]() + smallIconImageCache = [SidebarItemIdentifier: IconImage]() authorIconImageCache = [Author: IconImage]() } } private extension IconImageCache { - func imageForSmartFeed(_ smartFeed: PseudoFeed, _ feedID: FeedIdentifier) -> IconImage? { + func imageForSmartFeed(_ smartFeed: PseudoFeed, _ feedID: SidebarItemIdentifier) -> IconImage? { if let iconImage = smartFeedIconImageCache[feedID] { return iconImage } @@ -80,7 +80,7 @@ private extension IconImageCache { return nil } - func imageForWebFeed(_ webFeed: WebFeed, _ feedID: FeedIdentifier) -> IconImage? { + func imageForWebFeed(_ webFeed: WebFeed, _ feedID: SidebarItemIdentifier) -> IconImage? { if let iconImage = webFeedIconImageCache[feedID] { return iconImage } @@ -98,7 +98,7 @@ private extension IconImageCache { return nil } - func imageForSmallIconProvider(_ provider: SmallIconProvider, _ feedID: FeedIdentifier) -> IconImage? { + func imageForSmallIconProvider(_ provider: SmallIconProvider, _ feedID: SidebarItemIdentifier) -> IconImage? { if let iconImage = smallIconImageCache[feedID] { return iconImage } diff --git a/Shared/SmartFeeds/SearchFeedDelegate.swift b/Shared/SmartFeeds/SearchFeedDelegate.swift index 246ccca75..aa1c633d2 100644 --- a/Shared/SmartFeeds/SearchFeedDelegate.swift +++ b/Shared/SmartFeeds/SearchFeedDelegate.swift @@ -14,8 +14,8 @@ import ArticlesDatabase struct SearchFeedDelegate: SmartFeedDelegate { - var feedID: FeedIdentifier? { - return FeedIdentifier.smartFeed(String(describing: SearchFeedDelegate.self)) + var feedID: SidebarItemIdentifier? { + return SidebarItemIdentifier.smartFeed(String(describing: SearchFeedDelegate.self)) } var nameForDisplay: String { diff --git a/Shared/SmartFeeds/SearchTimelineFeedDelegate.swift b/Shared/SmartFeeds/SearchTimelineFeedDelegate.swift index c186fa838..dac7fb49c 100644 --- a/Shared/SmartFeeds/SearchTimelineFeedDelegate.swift +++ b/Shared/SmartFeeds/SearchTimelineFeedDelegate.swift @@ -14,8 +14,8 @@ import ArticlesDatabase struct SearchTimelineFeedDelegate: SmartFeedDelegate { - var feedID: FeedIdentifier? { - return FeedIdentifier.smartFeed(String(describing: SearchTimelineFeedDelegate.self)) + var feedID: SidebarItemIdentifier? { + return SidebarItemIdentifier.smartFeed(String(describing: SearchTimelineFeedDelegate.self)) } var nameForDisplay: String { diff --git a/Shared/SmartFeeds/SmartFeed.swift b/Shared/SmartFeeds/SmartFeed.swift index e8245a0b9..fac85807a 100644 --- a/Shared/SmartFeeds/SmartFeed.swift +++ b/Shared/SmartFeeds/SmartFeed.swift @@ -20,7 +20,7 @@ final class SmartFeed: PseudoFeed { return .none } - var feedID: FeedIdentifier? { + var feedID: SidebarItemIdentifier? { delegate.feedID } diff --git a/Shared/SmartFeeds/SmartFeedDelegate.swift b/Shared/SmartFeeds/SmartFeedDelegate.swift index a8bb89e96..7f37a2ae6 100644 --- a/Shared/SmartFeeds/SmartFeedDelegate.swift +++ b/Shared/SmartFeeds/SmartFeedDelegate.swift @@ -12,7 +12,7 @@ import Articles import ArticlesDatabase import RSCore -protocol SmartFeedDelegate: FeedIdentifiable, DisplayNameProvider, ArticleFetcher, SmallIconProvider { +protocol SmartFeedDelegate: SidebarItemIdentifiable, DisplayNameProvider, ArticleFetcher, SmallIconProvider { var fetchType: FetchType { get } func fetchUnreadCount(for: Account, completion: @escaping SingleUnreadCountCompletionBlock) } diff --git a/Shared/SmartFeeds/SmartFeedsController.swift b/Shared/SmartFeeds/SmartFeedsController.swift index 0fcf2541c..8ff75f510 100644 --- a/Shared/SmartFeeds/SmartFeedsController.swift +++ b/Shared/SmartFeeds/SmartFeedsController.swift @@ -28,7 +28,7 @@ final class SmartFeedsController: DisplayNameProvider, ContainerIdentifiable { self.smartFeeds = [todayFeed, unreadFeed, starredFeed] } - func find(by identifier: FeedIdentifier) -> PseudoFeed? { + func find(by identifier: SidebarItemIdentifier) -> PseudoFeed? { switch identifier { case .smartFeed(let stringIdentifer): switch stringIdentifer { diff --git a/Shared/SmartFeeds/StarredFeedDelegate.swift b/Shared/SmartFeeds/StarredFeedDelegate.swift index 55770fe36..23d1be80c 100644 --- a/Shared/SmartFeeds/StarredFeedDelegate.swift +++ b/Shared/SmartFeeds/StarredFeedDelegate.swift @@ -16,8 +16,8 @@ import Account struct StarredFeedDelegate: SmartFeedDelegate { - var feedID: FeedIdentifier? { - return FeedIdentifier.smartFeed(String(describing: StarredFeedDelegate.self)) + var feedID: SidebarItemIdentifier? { + return SidebarItemIdentifier.smartFeed(String(describing: StarredFeedDelegate.self)) } let nameForDisplay = NSLocalizedString("Starred", comment: "Starred pseudo-feed title") diff --git a/Shared/SmartFeeds/TodayFeedDelegate.swift b/Shared/SmartFeeds/TodayFeedDelegate.swift index ad6e47977..a3b1bceaf 100644 --- a/Shared/SmartFeeds/TodayFeedDelegate.swift +++ b/Shared/SmartFeeds/TodayFeedDelegate.swift @@ -14,8 +14,8 @@ import Account struct TodayFeedDelegate: SmartFeedDelegate { - var feedID: FeedIdentifier? { - return FeedIdentifier.smartFeed(String(describing: TodayFeedDelegate.self)) + var feedID: SidebarItemIdentifier? { + return SidebarItemIdentifier.smartFeed(String(describing: TodayFeedDelegate.self)) } let nameForDisplay = NSLocalizedString("Today", comment: "Today pseudo-feed title") diff --git a/Shared/SmartFeeds/UnreadFeed.swift b/Shared/SmartFeeds/UnreadFeed.swift index eb9f4fb9c..a758b1876 100644 --- a/Shared/SmartFeeds/UnreadFeed.swift +++ b/Shared/SmartFeeds/UnreadFeed.swift @@ -26,8 +26,8 @@ final class UnreadFeed: PseudoFeed { return .alwaysRead } - var feedID: FeedIdentifier? { - return FeedIdentifier.smartFeed(String(describing: UnreadFeed.self)) + var feedID: SidebarItemIdentifier? { + return SidebarItemIdentifier.smartFeed(String(describing: UnreadFeed.self)) } let nameForDisplay = NSLocalizedString("All Unread", comment: "All Unread pseudo-feed title") diff --git a/Shared/Timeline/FetchRequestOperation.swift b/Shared/Timeline/FetchRequestOperation.swift index 054ff961c..bfaab1439 100644 --- a/Shared/Timeline/FetchRequestOperation.swift +++ b/Shared/Timeline/FetchRequestOperation.swift @@ -19,13 +19,13 @@ typealias FetchRequestOperationResultBlock = (Set
, FetchRequestOperatio final class FetchRequestOperation { let id: Int - let readFilterEnabledTable: [FeedIdentifier: Bool] + let readFilterEnabledTable: [SidebarItemIdentifier: Bool] let resultBlock: FetchRequestOperationResultBlock var isCanceled = false var isFinished = false private let fetchers: [ArticleFetcher] - init(id: Int, readFilterEnabledTable: [FeedIdentifier: Bool], fetchers: [ArticleFetcher], resultBlock: @escaping FetchRequestOperationResultBlock) { + init(id: Int, readFilterEnabledTable: [SidebarItemIdentifier: Bool], fetchers: [ArticleFetcher], resultBlock: @escaping FetchRequestOperationResultBlock) { precondition(Thread.isMainThread) self.id = id self.readFilterEnabledTable = readFilterEnabledTable diff --git a/Shared/Tree/WebFeedTreeControllerDelegate.swift b/Shared/Tree/WebFeedTreeControllerDelegate.swift index 60eceef26..1bc6240f8 100644 --- a/Shared/Tree/WebFeedTreeControllerDelegate.swift +++ b/Shared/Tree/WebFeedTreeControllerDelegate.swift @@ -13,15 +13,15 @@ import Account final class WebFeedTreeControllerDelegate: TreeControllerDelegate { - private var filterExceptions = Set() + private var filterExceptions = Set() var isReadFiltered = false - func addFilterException(_ feedID: FeedIdentifier) { + func addFilterException(_ feedID: SidebarItemIdentifier) { filterExceptions.insert(feedID) } func resetFilterExceptions() { - filterExceptions = Set() + filterExceptions = Set() } func treeController(treeController: TreeController, childNodesFor node: Node) -> [Node]? { diff --git a/iOS/SceneCoordinator.swift b/iOS/SceneCoordinator.swift index 9b8ff1e85..e8e26966e 100644 --- a/iOS/SceneCoordinator.swift +++ b/iOS/SceneCoordinator.swift @@ -33,7 +33,7 @@ enum ShowFeedName { struct FeedNode: Hashable { var node: Node - var feedID: FeedIdentifier + var feedID: SidebarItemIdentifier init(_ node: Node) { self.node = node @@ -88,7 +88,7 @@ class SceneCoordinator: NSObject, UndoableCommandRunner { private let fetchRequestQueue = FetchRequestQueue() private var expandedTable = Set() - private var readFilterEnabledTable = [FeedIdentifier: Bool]() + private var readFilterEnabledTable = [SidebarItemIdentifier: Bool]() private var shadowTable = [(sectionID: String, feedNodes: [FeedNode])]() private(set) var preSearchTimelineFeed: SidebarItem? @@ -355,7 +355,7 @@ class SceneCoordinator: NSObject, UndoableCommandRunner { if let readArticlesFilterState = windowState[UserInfoKey.readArticlesFilterState] as? [[AnyHashable: AnyHashable]: Bool] { for key in readArticlesFilterState.keys { - if let feedIdentifier = FeedIdentifier(userInfo: key) { + if let feedIdentifier = SidebarItemIdentifier(userInfo: key) { readFilterEnabledTable[feedIdentifier] = readArticlesFilterState[key] } } @@ -630,7 +630,7 @@ class SceneCoordinator: NSObject, UndoableCommandRunner { refreshTimeline(resetScroll: false) } - func nodeFor(feedID: FeedIdentifier) -> Node? { + func nodeFor(feedID: SidebarItemIdentifier) -> Node? { return treeController.rootNode.descendantNode(where: { node in if let feed = node.representedObject as? SidebarItem { return feed.feedID == feedID @@ -2209,7 +2209,7 @@ private extension SceneCoordinator { func handleSelectFeed(_ userInfo: [AnyHashable : Any]?) { guard let userInfo = userInfo, let feedIdentifierUserInfo = userInfo[UserInfoKey.feedIdentifier] as? [AnyHashable : AnyHashable], - let feedIdentifier = FeedIdentifier(userInfo: feedIdentifierUserInfo) else { + let feedIdentifier = SidebarItemIdentifier(userInfo: feedIdentifierUserInfo) else { return } @@ -2294,7 +2294,7 @@ private extension SceneCoordinator { func restoreFeedSelection(_ userInfo: [AnyHashable : Any], accountID: String, webFeedID: String, articleID: String) -> Bool { guard let feedIdentifierUserInfo = userInfo[UserInfoKey.feedIdentifier] as? [AnyHashable : AnyHashable], - let feedIdentifier = FeedIdentifier(userInfo: feedIdentifierUserInfo), + let feedIdentifier = SidebarItemIdentifier(userInfo: feedIdentifierUserInfo), let isShowingExtractedArticle = userInfo[UserInfoKey.isShowingExtractedArticle] as? Bool, let articleWindowScrollY = userInfo[UserInfoKey.articleWindowScrollY] as? Int else { return false @@ -2352,7 +2352,7 @@ private extension SceneCoordinator { return nil } - func selectFeedAndArticle(feedIdentifier: FeedIdentifier, articleID: String, isShowingExtractedArticle: Bool, articleWindowScrollY: Int) -> Bool { + func selectFeedAndArticle(feedIdentifier: SidebarItemIdentifier, articleID: String, isShowingExtractedArticle: Bool, articleWindowScrollY: Int) -> Bool { guard let feedNode = nodeFor(feedID: feedIdentifier), let feedIndexPath = indexPathFor(feedNode) else { return false } selectFeed(indexPath: feedIndexPath) {