mirror of
https://github.com/Ranchero-Software/NetNewsWire.git
synced 2025-02-01 19:46:56 +01:00
Rename FeedIdentifier to SidebarItemIdentifier. Rename FeedIdentifiable to SidebarItemIdentifiable.
This commit is contained in:
parent
d5794a7b4e
commit
a75e5eb52a
@ -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) {
|
||||
|
@ -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?
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
@ -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?
|
||||
|
@ -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) )
|
||||
}
|
||||
|
@ -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]
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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 {
|
||||
|
@ -20,7 +20,7 @@ final class SmartFeed: PseudoFeed {
|
||||
return .none
|
||||
}
|
||||
|
||||
var feedID: FeedIdentifier? {
|
||||
var feedID: SidebarItemIdentifier? {
|
||||
delegate.feedID
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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")
|
||||
|
@ -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")
|
||||
|
@ -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")
|
||||
|
@ -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
|
||||
|
@ -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]? {
|
||||
|
@ -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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user