From 2bbd135c9eb28c6e24e0b2ac89b4e7a7865b7df1 Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Tue, 13 Aug 2019 21:07:39 -0700 Subject: [PATCH] =?UTF-8?q?Update=20appropriate=20counts=20in=20the=20side?= =?UTF-8?q?bar=20when=20the=20timeline=E2=80=99s=20unread=20count=20change?= =?UTF-8?q?s.=20Fix=20#829.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Mac/MainWindow/MainWindowController.swift | 2 +- .../Sidebar/SidebarViewController.swift | 32 +++++++++++-------- Shared/SmartFeeds/SmartFeed.swift | 13 +------- Shared/SmartFeeds/SmartFeedsController.swift | 4 +-- 4 files changed, 23 insertions(+), 28 deletions(-) diff --git a/Mac/MainWindow/MainWindowController.swift b/Mac/MainWindow/MainWindowController.swift index 2ee22c205..bc00c98d1 100644 --- a/Mac/MainWindow/MainWindowController.swift +++ b/Mac/MainWindow/MainWindowController.swift @@ -455,7 +455,7 @@ extension MainWindowController: NSSearchFieldDelegate { return } lastSentSearchString = searchString - let smartFeed = SmartFeed(delegate: SearchFeedDelegate(searchString: searchString), type: .search) + let smartFeed = SmartFeed(delegate: SearchFeedDelegate(searchString: searchString)) timelineContainerViewController?.setRepresentedObjects([smartFeed], mode: .search) searchSmartFeed = smartFeed } diff --git a/Mac/MainWindow/Sidebar/SidebarViewController.swift b/Mac/MainWindow/Sidebar/SidebarViewController.swift index 9c551167d..1a8636780 100644 --- a/Mac/MainWindow/Sidebar/SidebarViewController.swift +++ b/Mac/MainWindow/Sidebar/SidebarViewController.swift @@ -83,7 +83,12 @@ protocol SidebarDelegate: class { guard let representedObject = note.object else { return } - configureUnreadCountForCellsForRepresentedObject(representedObject as AnyObject) + if let timelineViewController = representedObject as? TimelineViewController { + configureUnreadCountForCellsForRepresentedObjects(timelineViewController.representedObjects) + } + else { + configureUnreadCountForCellsForRepresentedObjects([representedObject as AnyObject]) + } } @objc func containerChildrenDidChange(_ note: Notification) { @@ -499,7 +504,6 @@ private extension SidebarViewController { func unreadCountFor(_ node: Node) -> Int { // If this node is the one and only selection, - // and it’s the Today feed, // then the unread count comes from the timeline. // This ensures that any transients in the timeline // are accounted for in the unread count. @@ -514,18 +518,15 @@ private extension SidebarViewController { } func nodeShouldGetUnreadCountFromTimeline(_ node: Node) -> Bool { - // Only if it’s selected, it’s the only node selected, - // and it’s the Today feed — which may have transients that are unread. - if selectedNodes.count != 1 { - return false - } - if node !== selectedNodes.first! { - return false - } + // Only if it’s selected and it’s the only node selected. + return selectedNodes.count == 1 && selectedNodes.first! === node + } + + func nodeRepresentsTodayFeed(_ node: Node) -> Bool { guard let smartFeed = node.representedObject as? SmartFeed else { return false } - return smartFeed.type == .today + return smartFeed === SmartFeedsController.shared.todayFeed } func cellForRowView(_ rowView: NSTableRowView) -> SidebarCell? { @@ -553,8 +554,13 @@ private extension SidebarViewController { applyToCellsForRepresentedObject(representedObject, configure) } - func configureUnreadCountForCellsForRepresentedObject(_ representedObject: AnyObject) { - applyToCellsForRepresentedObject(representedObject, configureUnreadCount) + func configureUnreadCountForCellsForRepresentedObjects(_ representedObjects: [AnyObject]?) { + guard let representedObjects = representedObjects else { + return + } + for object in representedObjects { + applyToCellsForRepresentedObject(object, configureUnreadCount) + } } @discardableResult diff --git a/Shared/SmartFeeds/SmartFeed.swift b/Shared/SmartFeeds/SmartFeed.swift index 2edf44938..436198d79 100644 --- a/Shared/SmartFeeds/SmartFeed.swift +++ b/Shared/SmartFeeds/SmartFeed.swift @@ -11,22 +11,12 @@ import RSCore import Articles import Account -enum SmartFeedType { - case today - case allUnread - case starred - case search - case custom -} - final class SmartFeed: PseudoFeed { var nameForDisplay: String { return delegate.nameForDisplay } - let type: SmartFeedType - var unreadCount = 0 { didSet { if unreadCount != oldValue { @@ -44,9 +34,8 @@ final class SmartFeed: PseudoFeed { private let delegate: SmartFeedDelegate private var unreadCounts = [String: Int]() - init(delegate: SmartFeedDelegate, type: SmartFeedType) { + init(delegate: SmartFeedDelegate) { self.delegate = delegate - self.type = type NotificationCenter.default.addObserver(self, selector: #selector(unreadCountDidChange(_:)), name: .UnreadCountDidChange, object: nil) queueFetchUnreadCounts() // Fetch unread count at startup } diff --git a/Shared/SmartFeeds/SmartFeedsController.swift b/Shared/SmartFeeds/SmartFeedsController.swift index a77e080f9..ad67c1120 100644 --- a/Shared/SmartFeeds/SmartFeedsController.swift +++ b/Shared/SmartFeeds/SmartFeedsController.swift @@ -15,9 +15,9 @@ final class SmartFeedsController: DisplayNameProvider { let nameForDisplay = NSLocalizedString("Smart Feeds", comment: "Smart Feeds group title") var smartFeeds = [AnyObject]() - let todayFeed = SmartFeed(delegate: TodayFeedDelegate(), type: .today) + let todayFeed = SmartFeed(delegate: TodayFeedDelegate()) let unreadFeed = UnreadFeed() - let starredFeed = SmartFeed(delegate: StarredFeedDelegate(), type: .starred) + let starredFeed = SmartFeed(delegate: StarredFeedDelegate()) private init() {