Rename FeedIdentifier to SidebarItemIdentifier. Rename FeedIdentifiable to SidebarItemIdentifiable.

This commit is contained in:
Brent Simmons 2024-02-25 21:17:00 -08:00
parent d5794a7b4e
commit a75e5eb52a
19 changed files with 55 additions and 55 deletions

View File

@ -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) {

View File

@ -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?

View File

@ -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
}

View File

@ -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
}

View File

@ -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?

View File

@ -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) )
}

View File

@ -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..<readArticlesFilterStateKeys.count {
if let feedIdentifier = FeedIdentifier(userInfo: readArticlesFilterStateKeys[i]) {
if let feedIdentifier = SidebarItemIdentifier(userInfo: readArticlesFilterStateKeys[i]) {
readFilterEnabledTable[feedIdentifier] = readArticlesFilterStateValues[i]
}
}

View File

@ -14,13 +14,13 @@ class IconImageCache {
static var shared = IconImageCache()
private var smartFeedIconImageCache = [FeedIdentifier: IconImage]()
private var webFeedIconImageCache = [FeedIdentifier: IconImage]()
private var faviconImageCache = [FeedIdentifier: IconImage]()
private var smallIconImageCache = [FeedIdentifier: IconImage]()
private var smartFeedIconImageCache = [SidebarItemIdentifier: IconImage]()
private var webFeedIconImageCache = [SidebarItemIdentifier: IconImage]()
private var faviconImageCache = [SidebarItemIdentifier: IconImage]()
private var smallIconImageCache = [SidebarItemIdentifier: IconImage]()
private var authorIconImageCache = [Author: IconImage]()
func imageFor(_ feedID: FeedIdentifier) -> 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
}

View File

@ -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 {

View File

@ -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 {

View File

@ -20,7 +20,7 @@ final class SmartFeed: PseudoFeed {
return .none
}
var feedID: FeedIdentifier? {
var feedID: SidebarItemIdentifier? {
delegate.feedID
}

View File

@ -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)
}

View File

@ -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 {

View File

@ -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")

View File

@ -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")

View File

@ -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")

View File

@ -19,13 +19,13 @@ typealias FetchRequestOperationResultBlock = (Set<Article>, 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

View File

@ -13,15 +13,15 @@ import Account
final class WebFeedTreeControllerDelegate: TreeControllerDelegate {
private var filterExceptions = Set<FeedIdentifier>()
private var filterExceptions = Set<SidebarItemIdentifier>()
var isReadFiltered = false
func addFilterException(_ feedID: FeedIdentifier) {
func addFilterException(_ feedID: SidebarItemIdentifier) {
filterExceptions.insert(feedID)
}
func resetFilterExceptions() {
filterExceptions = Set<FeedIdentifier>()
filterExceptions = Set<SidebarItemIdentifier>()
}
func treeController(treeController: TreeController, childNodesFor node: Node) -> [Node]? {

View File

@ -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<ContainerIdentifier>()
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) {