From b4aef7c414a11ec2bdb242ac52a33aec6d3cc62d Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Tue, 21 Jul 2020 14:16:46 -0500 Subject: [PATCH] Make sidebar handle selection state when read filter is on --- .../Shared/Sidebar/SidebarModel.swift | 50 ++++++++++--------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/Multiplatform/Shared/Sidebar/SidebarModel.swift b/Multiplatform/Shared/Sidebar/SidebarModel.swift index 9cfeb9927..084edc580 100644 --- a/Multiplatform/Shared/Sidebar/SidebarModel.swift +++ b/Multiplatform/Shared/Sidebar/SidebarModel.swift @@ -31,8 +31,8 @@ class SidebarModel: ObservableObject, UndoableCommandRunner { var undoableCommands = [UndoableCommand]() init() { - subscribeToRebuildSidebarItemsEvents() subscribeToSelectedFeedChanges() + subscribeToRebuildSidebarItemsEvents() } // MARK: API @@ -55,6 +55,22 @@ private extension SidebarModel { // MARK: Subscriptions + func subscribeToSelectedFeedChanges() { + $selectedFeedIdentifiers.map { [weak self] feedIDs in + feedIDs.compactMap { self?.findFeed($0) } + } + .assign(to: $selectedFeeds) + + $selectedFeedIdentifier.compactMap { [weak self] feedID in + if let feedID = feedID, let feed = self?.findFeed(feedID) { + return [feed] + } else { + return nil + } + } + .assign(to: $selectedFeeds) + } + func subscribeToRebuildSidebarItemsEvents() { let chidrenDidChangePublisher = NotificationCenter.default.publisher(for: .ChildrenDidChange) let batchUpdateDidPerformPublisher = NotificationCenter.default.publisher(for: .BatchUpdateDidPerform) @@ -75,28 +91,12 @@ private extension SidebarModel { sidebarRebuildPublishers .debounce(for: .milliseconds(500), scheduler: RunLoop.main) - .combineLatest($isReadFiltered) - .sink { [weak self] _, readFilter in - self?.rebuildSidebarItems(isReadFiltered: readFilter) + .combineLatest($isReadFiltered, $selectedFeeds) + .sink { [weak self] _, readFilter, selectedFeeds in + self?.rebuildSidebarItems(isReadFiltered: readFilter, selectedFeeds: selectedFeeds) }.store(in: &cancellables) } - func subscribeToSelectedFeedChanges() { - $selectedFeedIdentifiers.map { [weak self] feedIDs in - feedIDs.compactMap { self?.findFeed($0) } - } - .assign(to: $selectedFeeds) - - $selectedFeedIdentifier.compactMap { [weak self] feedID in - if let feedID = feedID, let feed = self?.findFeed(feedID) { - return [feed] - } else { - return nil - } - } - .assign(to: $selectedFeeds) - } - // MARK: Sidebar Building func sort(_ folders: Set) -> [Folder] { @@ -107,7 +107,7 @@ private extension SidebarModel { return feeds.sorted(by: { $0.nameForDisplay.localizedStandardCompare($1.nameForDisplay) == .orderedAscending }) } - func rebuildSidebarItems(isReadFiltered: Bool) { + func rebuildSidebarItems(isReadFiltered: Bool, selectedFeeds: [Feed]) { guard let delegate = delegate else { return } var items = [SidebarItem]() @@ -121,20 +121,22 @@ private extension SidebarModel { } items.append(smartFeedControllerItem) + let selectedFeedIDs = Set(selectedFeeds.map { $0.feedID }) + for account in AccountManager.shared.sortedActiveAccounts { var accountItem = SidebarItem(account) for webFeed in sort(account.topLevelWebFeeds) { - if !isReadFiltered || webFeed.unreadCount > 0 { + if !isReadFiltered || !(webFeed.unreadCount < 1 && !selectedFeedIDs.contains(webFeed.feedID)) { accountItem.addChild(SidebarItem(webFeed, unreadCount: delegate.unreadCount(for: webFeed))) } } for folder in sort(account.folders ?? Set()) { - if !isReadFiltered || folder.unreadCount > 0 { + if !isReadFiltered || !(folder.unreadCount < 1 && !selectedFeedIDs.contains(folder.feedID)) { var folderItem = SidebarItem(folder, unreadCount: delegate.unreadCount(for: folder)) for webFeed in sort(folder.topLevelWebFeeds) { - if !isReadFiltered || webFeed.unreadCount > 0 { + if !isReadFiltered || !(webFeed.unreadCount < 1 && !selectedFeedIDs.contains(webFeed.feedID)) { folderItem.addChild(SidebarItem(webFeed, unreadCount: delegate.unreadCount(for: webFeed))) } }