From a6832dd2a580a369b437bd932ff5dafeba67c8b6 Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Tue, 4 Jul 2023 14:41:02 -0700 Subject: [PATCH] Use ItemIdentifier and itemID instead of FeedIdentifier and feedID. (FeedIdentifier was renamed to ItemIdentifier.) --- .../Sidebar/SidebarViewController.swift | 38 +++++++------- .../Timeline/TimelineViewController.swift | 12 ++--- Shared/Activity/ActivityManager.swift | 10 ++-- Shared/IconImageCache.swift | 52 +++++++++---------- Shared/SmartFeeds/SearchFeedDelegate.swift | 4 +- .../SearchTimelineFeedDelegate.swift | 4 +- Shared/SmartFeeds/SmartFeed.swift | 4 +- Shared/SmartFeeds/SmartFeedDelegate.swift | 2 +- Shared/SmartFeeds/SmartFeedsController.swift | 2 +- Shared/SmartFeeds/StarredFeedDelegate.swift | 4 +- Shared/SmartFeeds/TodayFeedDelegate.swift | 4 +- Shared/SmartFeeds/UnreadFeed.swift | 4 +- Shared/Timeline/FetchRequestOperation.swift | 4 +- Shared/Tree/FeedTreeControllerDelegate.swift | 12 ++--- Shared/UserInfoKey.swift | 2 +- iOS/SceneCoordinator.swift | 44 ++++++++-------- 16 files changed, 101 insertions(+), 101 deletions(-) diff --git a/Mac/MainWindow/Sidebar/SidebarViewController.swift b/Mac/MainWindow/Sidebar/SidebarViewController.swift index bcc99f7c0..09e1dd3df 100644 --- a/Mac/MainWindow/Sidebar/SidebarViewController.swift +++ b/Mac/MainWindow/Sidebar/SidebarViewController.swift @@ -100,7 +100,7 @@ protocol SidebarDelegate: AnyObject { func saveState(to state: inout [AnyHashable : Any]) { state[UserInfoKey.readFeedsFilterState] = isReadFiltered state[UserInfoKey.containerExpandedWindowState] = expandedTable.map { $0.userInfo } - state[UserInfoKey.selectedFeedsState] = selectedFeeds.compactMap { $0.feedID?.userInfo } + state[UserInfoKey.selectedFeedsState] = selectedFeeds.compactMap { $0.itemID?.userInfo } } func restoreState(from state: [AnyHashable : Any]) { @@ -114,22 +114,22 @@ protocol SidebarDelegate: AnyObject { return } - let selectedFeedIdentifers = Set(selectedFeedsState.compactMap( { FeedIdentifier(userInfo: $0) })) - selectedFeedIdentifers.forEach { treeControllerDelegate.addFilterException($0) } + let selectedItemIdentifers = Set(selectedFeedsState.compactMap( { ItemIdentifier(userInfo: $0) })) + selectedItemIdentifers.forEach { treeControllerDelegate.addFilterException($0) } rebuildTreeAndReloadDataIfNeeded() var selectIndexes = IndexSet() - func selectFeedsVisitor(node: Node) { - if let feedID = (node.representedObject as? FeedIdentifiable)?.feedID { - if selectedFeedIdentifers.contains(feedID) { + func selectItemsVisitor(node: Node) { + if let itemID = (node.representedObject as? ItemIdentifiable)?.itemID { + if selectedItemIdentifers.contains(itemID) { selectIndexes.insert(outlineView.row(forItem: node) ) } } } - treeController.visitNodes(selectFeedsVisitor(node:)) + treeController.visitNodes(selectItemsVisitor(node:)) outlineView.selectRowIndexes(selectIndexes, byExtendingSelection: false) focus() @@ -456,13 +456,13 @@ protocol SidebarDelegate: AnyObject { // MARK: - API func selectFeed(_ feed: FeedProtocol) { - if isReadFiltered, let feedID = feed.feedID { - self.treeControllerDelegate.addFilterException(feedID) + if isReadFiltered, let itemID = feed.itemID { + self.treeControllerDelegate.addFilterException(itemID) if let webFeed = feed as? WebFeed, let account = webFeed.account { let parentFolder = account.sortedFolders?.first(where: { $0.objectIsChild(webFeed) }) - if let parentFolderFeedID = parentFolder?.feedID { - self.treeControllerDelegate.addFilterException(parentFolderFeedID) + if let parentFolderItemID = parentFolder?.itemID { + self.treeControllerDelegate.addFilterException(parentFolderItemID) } } @@ -544,16 +544,16 @@ private extension SidebarViewController { } func addToFilterExeptionsIfNecessary(_ feed: FeedProtocol?) { - if isReadFiltered, let feedID = feed?.feedID { + if isReadFiltered, let itemID = feed?.itemID { if feed is PseudoFeed { - treeControllerDelegate.addFilterException(feedID) + treeControllerDelegate.addFilterException(itemID) } else if let folderFeed = feed as? Folder { if folderFeed.account?.existingFolder(withID: folderFeed.folderID) != nil { - treeControllerDelegate.addFilterException(feedID) + treeControllerDelegate.addFilterException(itemID) } } else if let webFeed = feed as? WebFeed { if webFeed.account?.existingWebFeed(withWebFeedID: webFeed.webFeedID) != nil { - treeControllerDelegate.addFilterException(feedID) + treeControllerDelegate.addFilterException(itemID) addParentFolderToFilterExceptions(webFeed) } } @@ -563,11 +563,11 @@ private extension SidebarViewController { func addParentFolderToFilterExceptions(_ feed: FeedProtocol) { guard let node = treeController.rootNode.descendantNodeRepresentingObject(feed as AnyObject), let folder = node.parent?.representedObject as? Folder, - let folderFeedID = folder.feedID else { + let folderItemID = folder.itemID else { return } - treeControllerDelegate.addFilterException(folderFeedID) + treeControllerDelegate.addFilterException(folderItemID) } @@ -621,8 +621,8 @@ private extension SidebarViewController { } func addTreeControllerToFilterExceptionsVisitor(node: Node) { - if let feed = node.representedObject as? FeedProtocol, let feedID = feed.feedID { - treeControllerDelegate.addFilterException(feedID) + if let feed = node.representedObject as? FeedProtocol, let itemID = feed.itemID { + treeControllerDelegate.addFilterException(itemID) } } diff --git a/Mac/MainWindow/Timeline/TimelineViewController.swift b/Mac/MainWindow/Timeline/TimelineViewController.swift index 85f53298c..bce01c629 100644 --- a/Mac/MainWindow/Timeline/TimelineViewController.swift +++ b/Mac/MainWindow/Timeline/TimelineViewController.swift @@ -27,7 +27,7 @@ final class TimelineViewController: NSViewController, UndoableCommandRunner, Unr @IBOutlet var tableView: TimelineTableView! - private var readFilterEnabledTable = [FeedIdentifier: Bool]() + private var readFilterEnabledTable = [ItemIdentifier: Bool]() var isReadFiltered: Bool? { guard representedObjects?.count == 1, let timelineFeed = representedObjects?.first as? FeedProtocol else { return nil @@ -35,7 +35,7 @@ final class TimelineViewController: NSViewController, UndoableCommandRunner, Unr guard timelineFeed.defaultReadFilterType != .alwaysRead else { return nil } - if let feedID = timelineFeed.feedID, let readFilterEnabled = readFilterEnabledTable[feedID] { + if let itemID = timelineFeed.itemID, let readFilterEnabled = readFilterEnabledTable[itemID] { return readFilterEnabled } else { return timelineFeed.defaultReadFilterType == .read @@ -281,8 +281,8 @@ final class TimelineViewController: NSViewController, UndoableCommandRunner, Unr } func toggleReadFilter() { - guard let filter = isReadFiltered, let feedID = (representedObjects?.first as? FeedProtocol)?.feedID else { return } - readFilterEnabledTable[feedID] = !filter + guard let filter = isReadFiltered, let itemID = (representedObjects?.first as? FeedProtocol)?.itemID else { return } + readFilterEnabledTable[itemID] = !filter delegate?.timelineInvalidatedRestorationState(self) fetchAndReplacePreservingSelection() } @@ -305,8 +305,8 @@ final class TimelineViewController: NSViewController, UndoableCommandRunner, Unr } for i in 0.. IconImage? { - if let smartFeed = SmartFeedsController.shared.find(by: feedID) { + func imageFor(_ itemID: ItemIdentifier) -> IconImage? { + if let smartFeed = SmartFeedsController.shared.find(by: itemID) { return imageForFeed(smartFeed) } - if let feed = AccountManager.shared.existingFeed(with: feedID) { + if let feed = AccountManager.shared.existingFeed(with: itemID) { return imageForFeed(feed) } return nil } func imageForFeed(_ feed: FeedProtocol) -> IconImage? { - guard let feedID = feed.feedID else { + guard let itemID = feed.itemID else { return nil } if let smartFeed = feed as? PseudoFeed { - return imageForSmartFeed(smartFeed, feedID) + return imageForSmartFeed(smartFeed, itemID) } - if let webFeed = feed as? WebFeed, let iconImage = imageForWebFeed(webFeed, feedID) { + if let webFeed = feed as? WebFeed, let iconImage = imageForWebFeed(webFeed, itemID) { return iconImage } if let smallIconProvider = feed as? SmallIconProvider { - return imageForSmallIconProvider(smallIconProvider, feedID) + return imageForSmallIconProvider(smallIconProvider, itemID) } return nil @@ -59,51 +59,51 @@ class IconImageCache { } func emptyCache() { - smartFeedIconImageCache = [FeedIdentifier: IconImage]() - webFeedIconImageCache = [FeedIdentifier: IconImage]() - faviconImageCache = [FeedIdentifier: IconImage]() - smallIconImageCache = [FeedIdentifier: IconImage]() + smartFeedIconImageCache = [ItemIdentifier: IconImage]() + webFeedIconImageCache = [ItemIdentifier: IconImage]() + faviconImageCache = [ItemIdentifier: IconImage]() + smallIconImageCache = [ItemIdentifier: IconImage]() authorIconImageCache = [Author: IconImage]() } } private extension IconImageCache { - func imageForSmartFeed(_ smartFeed: PseudoFeed, _ feedID: FeedIdentifier) -> IconImage? { - if let iconImage = smartFeedIconImageCache[feedID] { + func imageForSmartFeed(_ smartFeed: PseudoFeed, _ itemID: ItemIdentifier) -> IconImage? { + if let iconImage = smartFeedIconImageCache[itemID] { return iconImage } if let iconImage = smartFeed.smallIcon { - smartFeedIconImageCache[feedID] = iconImage + smartFeedIconImageCache[itemID] = iconImage return iconImage } return nil } - func imageForWebFeed(_ webFeed: WebFeed, _ feedID: FeedIdentifier) -> IconImage? { - if let iconImage = webFeedIconImageCache[feedID] { + func imageForWebFeed(_ webFeed: WebFeed, _ itemID: ItemIdentifier) -> IconImage? { + if let iconImage = webFeedIconImageCache[itemID] { return iconImage } if let iconImage = appDelegate.webFeedIconDownloader.icon(for: webFeed) { - webFeedIconImageCache[feedID] = iconImage + webFeedIconImageCache[itemID] = iconImage return iconImage } - if let faviconImage = faviconImageCache[feedID] { + if let faviconImage = faviconImageCache[itemID] { return faviconImage } if let faviconImage = appDelegate.faviconDownloader.faviconAsIcon(for: webFeed) { - faviconImageCache[feedID] = faviconImage + faviconImageCache[itemID] = faviconImage return faviconImage } return nil } - func imageForSmallIconProvider(_ provider: SmallIconProvider, _ feedID: FeedIdentifier) -> IconImage? { - if let iconImage = smallIconImageCache[feedID] { + func imageForSmallIconProvider(_ provider: SmallIconProvider, _ itemID: ItemIdentifier) -> IconImage? { + if let iconImage = smallIconImageCache[itemID] { return iconImage } if let iconImage = provider.smallIcon { - smallIconImageCache[feedID] = iconImage + smallIconImageCache[itemID] = iconImage return iconImage } return nil diff --git a/Shared/SmartFeeds/SearchFeedDelegate.swift b/Shared/SmartFeeds/SearchFeedDelegate.swift index 90b784d8a..adf838e3a 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 itemID: ItemIdentifier? { + return ItemIdentifier.smartFeed(String(describing: SearchFeedDelegate.self)) } var nameForDisplay: String { diff --git a/Shared/SmartFeeds/SearchTimelineFeedDelegate.swift b/Shared/SmartFeeds/SearchTimelineFeedDelegate.swift index d8de2851a..cd37ae4cc 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 itemID: ItemIdentifier? { + return ItemIdentifier.smartFeed(String(describing: SearchTimelineFeedDelegate.self)) } var nameForDisplay: String { diff --git a/Shared/SmartFeeds/SmartFeed.swift b/Shared/SmartFeeds/SmartFeed.swift index aaa9a5c6a..4caafaced 100644 --- a/Shared/SmartFeeds/SmartFeed.swift +++ b/Shared/SmartFeeds/SmartFeed.swift @@ -20,8 +20,8 @@ final class SmartFeed: PseudoFeed { return .none } - var feedID: FeedIdentifier? { - delegate.feedID + var itemID: ItemIdentifier? { + delegate.itemID } var nameForDisplay: String { diff --git a/Shared/SmartFeeds/SmartFeedDelegate.swift b/Shared/SmartFeeds/SmartFeedDelegate.swift index 1f9f9b1f0..39c85597a 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: ItemIdentifiable, 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 66eed98d8..273c760d9 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: ItemIdentifier) -> PseudoFeed? { switch identifier { case .smartFeed(let stringIdentifer): switch stringIdentifer { diff --git a/Shared/SmartFeeds/StarredFeedDelegate.swift b/Shared/SmartFeeds/StarredFeedDelegate.swift index 012e7a58e..96ebba6ef 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 itemID: ItemIdentifier? { + return ItemIdentifier.smartFeed(String(describing: StarredFeedDelegate.self)) } let nameForDisplay = NSLocalizedString("smartfeed.title.starred", comment: "Starred pseudo-feed title") diff --git a/Shared/SmartFeeds/TodayFeedDelegate.swift b/Shared/SmartFeeds/TodayFeedDelegate.swift index 8d2aa361a..743b0726a 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 itemID: ItemIdentifier? { + return ItemIdentifier.smartFeed(String(describing: TodayFeedDelegate.self)) } let nameForDisplay = NSLocalizedString("smartfeed.title.today", comment: "Today pseudo-feed title") diff --git a/Shared/SmartFeeds/UnreadFeed.swift b/Shared/SmartFeeds/UnreadFeed.swift index b0fe3a44f..1efedff06 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 itemID: ItemIdentifier? { + return ItemIdentifier.smartFeed(String(describing: UnreadFeed.self)) } let nameForDisplay = NSLocalizedString("smartfeed.title.allunread", comment: "All Unread pseudo-feed title") diff --git a/Shared/Timeline/FetchRequestOperation.swift b/Shared/Timeline/FetchRequestOperation.swift index 50f3d51e4..1abb52da9 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: [ItemIdentifier: 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: [ItemIdentifier: Bool], fetchers: [ArticleFetcher], resultBlock: @escaping FetchRequestOperationResultBlock) { precondition(Thread.isMainThread) self.id = id self.readFilterEnabledTable = readFilterEnabledTable diff --git a/Shared/Tree/FeedTreeControllerDelegate.swift b/Shared/Tree/FeedTreeControllerDelegate.swift index 441435d9f..057609b9b 100644 --- a/Shared/Tree/FeedTreeControllerDelegate.swift +++ b/Shared/Tree/FeedTreeControllerDelegate.swift @@ -13,15 +13,15 @@ import Account final class FeedTreeControllerDelegate: TreeControllerDelegate { - private var filterExceptions = Set() + private var filterExceptions = Set() var isReadFiltered = false - func addFilterException(_ feedID: FeedIdentifier) { - filterExceptions.insert(feedID) + func addFilterException(_ itemID: ItemIdentifier) { + filterExceptions.insert(itemID) } func resetFilterExceptions() { - filterExceptions = Set() + filterExceptions = Set() } func treeController(treeController: TreeController, childNodesFor node: Node) -> [Node]? { @@ -67,14 +67,14 @@ private extension FeedTreeControllerDelegate { var children = [AnyObject]() for webFeed in container.topLevelWebFeeds { - if let feedID = webFeed.feedID, !(!filterExceptions.contains(feedID) && isReadFiltered && webFeed.unreadCount == 0) { + if let itemID = webFeed.itemID, !(!filterExceptions.contains(itemID) && isReadFiltered && webFeed.unreadCount == 0) { children.append(webFeed) } } if let folders = container.folders { for folder in folders { - if let feedID = folder.feedID, !(!filterExceptions.contains(feedID) && isReadFiltered && folder.unreadCount == 0) { + if let itemID = folder.itemID, !(!filterExceptions.contains(itemID) && isReadFiltered && folder.unreadCount == 0) { children.append(folder) } } diff --git a/Shared/UserInfoKey.swift b/Shared/UserInfoKey.swift index 07d850895..d52f8158b 100644 --- a/Shared/UserInfoKey.swift +++ b/Shared/UserInfoKey.swift @@ -13,7 +13,7 @@ struct UserInfoKey { static let webFeed = "webFeed" static let url = "url" static let articlePath = "articlePath" - static let feedIdentifier = "feedIdentifier" + static let itemIdentifier = "itemIdentifier" static let windowState = "windowState" static let windowFullScreenState = "windowFullScreenState" diff --git a/iOS/SceneCoordinator.swift b/iOS/SceneCoordinator.swift index 666ab2d81..2d936895c 100644 --- a/iOS/SceneCoordinator.swift +++ b/iOS/SceneCoordinator.swift @@ -39,7 +39,7 @@ enum ShowFeedName { struct FeedNode: Hashable { var node: Node - var feedID: FeedIdentifier + var itemID: ItemIdentifier init?(_ node: Node) { guard let feed = node.representedObject as? FeedProtocol else { return nil } @@ -81,7 +81,7 @@ final class SceneCoordinator: NSObject, UndoableCommandRunner, Logging { private var lastExpandedTable = Set() // Which Feeds have the Read Articles Filter enabled - private var readFilterEnabledTable = [FeedIdentifier: Bool]() + private var readFilterEnabledTable = [ItemIdentifier: Bool]() // Flattened tree structure for the Sidebar private var shadowTable = [(sectionID: String, feedNodes: [FeedNode])]() @@ -345,8 +345,8 @@ final class SceneCoordinator: NSObject, UndoableCommandRunner, Logging { if let readArticlesFilterState = windowState[UserInfoKey.readArticlesFilterState] as? [[AnyHashable: AnyHashable]: Bool] { for key in readArticlesFilterState.keys { - if let feedIdentifier = FeedIdentifier(userInfo: key) { - readFilterEnabledTable[feedIdentifier] = readArticlesFilterState[key] + if let itemIdentifier = ItemIdentifier(userInfo: key) { + readFilterEnabledTable[itemIdentifier] = readArticlesFilterState[key] } } } @@ -618,10 +618,10 @@ final class SceneCoordinator: NSObject, UndoableCommandRunner, Logging { refreshTimeline(resetScroll: false) } - func nodeFor(feedID: FeedIdentifier) -> Node? { + func nodeFor(itemID: ItemIdentifier) -> Node? { return treeController.rootNode.descendantNode(where: { node in if let feed = node.representedObject as? FeedProtocol { - return feed.feedID == feedID + return feed.itemID == itemID } else { return false } @@ -2129,17 +2129,17 @@ 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 itemIdentifierUserInfo = userInfo[UserInfoKey.itemIdentifier] as? [AnyHashable : AnyHashable], + let itemIdentifier = ItemIdentifier(userInfo: itemIdentifierUserInfo) else { return } - treeControllerDelegate.addFilterException(feedIdentifier) + treeControllerDelegate.addFilterException(itemIdentifier) - switch feedIdentifier { + switch itemIdentifier { case .smartFeed: - guard let smartFeed = SmartFeedsController.shared.find(by: feedIdentifier) else { return } + guard let smartFeed = SmartFeedsController.shared.find(by: itemIdentifier) else { return } markExpanded(SmartFeedsController.shared) rebuildBackingStores(initialLoad: true, completion: { @@ -2214,31 +2214,31 @@ 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), + guard let itemIdentifierUserInfo = userInfo[UserInfoKey.itemIdentifier] as? [AnyHashable : AnyHashable], + let itemIdentifier = ItemIdentifier(userInfo: itemIdentifierUserInfo), let isShowingExtractedArticle = userInfo[UserInfoKey.isShowingExtractedArticle] as? Bool, let articleWindowScrollY = userInfo[UserInfoKey.articleWindowScrollY] as? Int else { return false } - switch feedIdentifier { + switch itemIdentifier { case .script: return false case .smartFeed, .folder: - let found = selectFeedAndArticle(feedIdentifier: feedIdentifier, articleID: articleID, isShowingExtractedArticle: isShowingExtractedArticle, articleWindowScrollY: articleWindowScrollY) + let found = selectFeedAndArticle(itemIdentifier: itemIdentifier, articleID: articleID, isShowingExtractedArticle: isShowingExtractedArticle, articleWindowScrollY: articleWindowScrollY) if found { - treeControllerDelegate.addFilterException(feedIdentifier) + treeControllerDelegate.addFilterException(itemIdentifier) } return found case .webFeed: - let found = selectFeedAndArticle(feedIdentifier: feedIdentifier, articleID: articleID, isShowingExtractedArticle: isShowingExtractedArticle, articleWindowScrollY: articleWindowScrollY) + let found = selectFeedAndArticle(itemIdentifier: itemIdentifier, articleID: articleID, isShowingExtractedArticle: isShowingExtractedArticle, articleWindowScrollY: articleWindowScrollY) if found { - treeControllerDelegate.addFilterException(feedIdentifier) - if let webFeedNode = nodeFor(feedID: feedIdentifier), let folder = webFeedNode.parent?.representedObject as? Folder, let folderFeedID = folder.feedID { - treeControllerDelegate.addFilterException(folderFeedID) + treeControllerDelegate.addFilterException(itemIdentifier) + if let webFeedNode = nodeFor(itemID: itemIdentifier), let folder = webFeedNode.parent?.representedObject as? Folder, let folderItemID = folder.itemID { + treeControllerDelegate.addFilterException(folderItemID) } } return found @@ -2273,8 +2273,8 @@ private extension SceneCoordinator { return nil } - func selectFeedAndArticle(feedIdentifier: FeedIdentifier, articleID: String, isShowingExtractedArticle: Bool, articleWindowScrollY: Int) -> Bool { - guard let feedNode = nodeFor(feedID: feedIdentifier), let feedIndexPath = indexPathFor(feedNode) else { return false } + func selectFeedAndArticle(itemIdentifier: ItemIdentifier, articleID: String, isShowingExtractedArticle: Bool, articleWindowScrollY: Int) -> Bool { + guard let feedNode = nodeFor(itemID: itemIdentifier), let feedIndexPath = indexPathFor(feedNode) else { return false } selectFeed(indexPath: feedIndexPath) { self.selectArticleInCurrentFeed(articleID, isShowingExtractedArticle: isShowingExtractedArticle, articleWindowScrollY: articleWindowScrollY)