diff --git a/Mac/Base.lproj/Main.storyboard b/Mac/Base.lproj/Main.storyboard index 63ebe5718..64e9b3bdf 100644 --- a/Mac/Base.lproj/Main.storyboard +++ b/Mac/Base.lproj/Main.storyboard @@ -343,6 +343,12 @@ + + + + + + diff --git a/Mac/MainWindow/MainWindowController.swift b/Mac/MainWindow/MainWindowController.swift index 191aa3aa0..8a22b473a 100644 --- a/Mac/MainWindow/MainWindowController.swift +++ b/Mac/MainWindow/MainWindowController.swift @@ -218,6 +218,10 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations { return currentSearchField != nil } + if item.action == #selector(cleanUp(_:)) { + return validateCleanUp(item) + } + if item.action == #selector(toggleReadFeedsFilter(_:)) { return validateToggleReadFeeds(item) } @@ -438,6 +442,11 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations { window?.makeFirstResponder(searchField) } + @IBAction func cleanUp(_ sender: Any?) { + sidebarViewController?.cleanUp() + timelineContainerViewController?.cleanUp() + } + @IBAction func toggleReadFeedsFilter(_ sender: Any?) { sidebarViewController?.toggleReadFilter() } @@ -872,6 +881,12 @@ private extension MainWindowController { return result } + func validateCleanUp(_ item: NSValidatedUserInterfaceItem) -> Bool { + let isSidebarFiltered = sidebarViewController?.isReadFiltered ?? false + let isTimelineFiltered = timelineContainerViewController?.isReadFiltered ?? false + return isSidebarFiltered || isTimelineFiltered + } + func validateToggleReadFeeds(_ item: NSValidatedUserInterfaceItem) -> Bool { guard let menuItem = item as? NSMenuItem else { return false } diff --git a/Mac/MainWindow/Sidebar/SidebarViewController.swift b/Mac/MainWindow/Sidebar/SidebarViewController.swift index fec21db8d..971ebd595 100644 --- a/Mac/MainWindow/Sidebar/SidebarViewController.swift +++ b/Mac/MainWindow/Sidebar/SidebarViewController.swift @@ -446,6 +446,10 @@ protocol SidebarDelegate: class { delegate?.sidebarInvalidatedRestorationState(self) rebuildTreeAndRestoreSelection() } + + func cleanUp() { + rebuildTreeAndRestoreSelection() + } } diff --git a/Mac/MainWindow/Timeline/TimelineContainerViewController.swift b/Mac/MainWindow/Timeline/TimelineContainerViewController.swift index 159278ade..778c196cf 100644 --- a/Mac/MainWindow/Timeline/TimelineContainerViewController.swift +++ b/Mac/MainWindow/Timeline/TimelineContainerViewController.swift @@ -89,6 +89,10 @@ final class TimelineContainerViewController: NSViewController { return true } + func cleanUp() { + regularTimelineViewController.cleanUp() + } + func toggleReadFilter() { regularTimelineViewController.toggleReadFilter() } diff --git a/Mac/MainWindow/Timeline/TimelineViewController.swift b/Mac/MainWindow/Timeline/TimelineViewController.swift index 2c8bdd75d..cf2eaa2c1 100644 --- a/Mac/MainWindow/Timeline/TimelineViewController.swift +++ b/Mac/MainWindow/Timeline/TimelineViewController.swift @@ -230,19 +230,16 @@ final class TimelineViewController: NSViewController, UndoableCommandRunner, Unr } return representedObjects.first! === object } + + func cleanUp() { + fetchAndReplacePreservingSelection() + } func toggleReadFilter() { guard let filter = isReadFiltered, let feedID = (representedObjects?.first as? Feed)?.feedID else { return } readFilterEnabledTable[feedID] = !filter delegate?.timelineInvalidatedRestorationState(self) - - if let article = oneSelectedArticle, let account = article.account { - exceptionArticleFetcher = SingleArticleFetcher(account: account, articleID: article.articleID) - } - - performBlockAndRestoreSelection { - fetchAndReplaceArticlesSync() - } + fetchAndReplacePreservingSelection() } // MARK: State Restoration @@ -919,6 +916,15 @@ private extension TimelineViewController { } } + func fetchAndReplacePreservingSelection() { + if let article = oneSelectedArticle, let account = article.account { + exceptionArticleFetcher = SingleArticleFetcher(account: account, articleID: article.articleID) + } + performBlockAndRestoreSelection { + fetchAndReplaceArticlesSync() + } + } + @objc func reloadAvailableCells() { if let indexesToReload = tableView.indexesOfAvailableRows() { reloadCells(for: indexesToReload)