diff --git a/Mac/Base.lproj/Main.storyboard b/Mac/Base.lproj/Main.storyboard index a077b7153..27675b309 100644 --- a/Mac/Base.lproj/Main.storyboard +++ b/Mac/Base.lproj/Main.storyboard @@ -1,7 +1,7 @@ - + - + @@ -362,6 +362,12 @@ + + + + + + diff --git a/Mac/MainWindow/MainWindowController.swift b/Mac/MainWindow/MainWindowController.swift index ff050a501..74b988dd5 100644 --- a/Mac/MainWindow/MainWindowController.swift +++ b/Mac/MainWindow/MainWindowController.swift @@ -237,6 +237,10 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations { return currentSearchField != nil } + if item.action == #selector(toggleReadFilter(_:)) { + (item as! NSMenuItem).state = sidebarViewController?.isReadFiltered ?? false ? .on : .off + } + if item.action == #selector(toggleSidebar(_:)) { guard let splitViewItem = sidebarSplitViewItem else { return false @@ -438,6 +442,10 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations { } window?.makeFirstResponder(searchField) } + + @IBAction func toggleReadFilter(_ sender: Any?) { + sidebarViewController?.toggleReadFilter() + } } // MARK: - SidebarDelegate diff --git a/Mac/MainWindow/Sidebar/SidebarViewController.swift b/Mac/MainWindow/Sidebar/SidebarViewController.swift index ba74c57be..54851c8ae 100644 --- a/Mac/MainWindow/Sidebar/SidebarViewController.swift +++ b/Mac/MainWindow/Sidebar/SidebarViewController.swift @@ -30,6 +30,9 @@ protocol SidebarDelegate: class { lazy var dataSource: SidebarOutlineDataSource = { return SidebarOutlineDataSource(treeController: treeController) }() + var isReadFiltered: Bool { + return treeControllerDelegate.isReadFiltered + } var undoableCommands = [UndoableCommand]() private var animatingChanges = false @@ -333,7 +336,16 @@ protocol SidebarDelegate: class { } revealAndSelectRepresentedObject(feedNode.representedObject) } - + + func toggleReadFilter() { + if treeControllerDelegate.isReadFiltered { + treeControllerDelegate.isReadFiltered = false + } else { + treeControllerDelegate.isReadFiltered = true + } + rebuildTreeAndReloadDataIfNeeded() + } + } // MARK: - NSUserInterfaceValidations diff --git a/Shared/Tree/WebFeedTreeControllerDelegate.swift b/Shared/Tree/WebFeedTreeControllerDelegate.swift index fd4d4f754..2eb149037 100644 --- a/Shared/Tree/WebFeedTreeControllerDelegate.swift +++ b/Shared/Tree/WebFeedTreeControllerDelegate.swift @@ -13,7 +13,7 @@ import Account final class WebFeedTreeControllerDelegate: TreeControllerDelegate { - var isUnreadFiltered = false + var isReadFiltered = false func treeController(treeController: TreeController, childNodesFor node: Node) -> [Node]? { if node.isRoot { @@ -36,7 +36,7 @@ private extension WebFeedTreeControllerDelegate { var topLevelNodes = [Node]() // Check to see if we should show the SmartFeeds top level by checking the unreadFeed - if !(isUnreadFiltered && SmartFeedsController.shared.unreadFeed.unreadCount == 0) { + if !(isReadFiltered && SmartFeedsController.shared.unreadFeed.unreadCount == 0) { let smartFeedsNode = rootNode.existingOrNewChildNode(with: SmartFeedsController.shared) smartFeedsNode.canHaveChildNodes = true smartFeedsNode.isGroupItem = true @@ -51,7 +51,7 @@ private extension WebFeedTreeControllerDelegate { func childNodesForSmartFeeds(_ parentNode: Node) -> [Node] { return SmartFeedsController.shared.smartFeeds.compactMap { (feed) -> Node? in - if isUnreadFiltered && feed.unreadCount == 0 { + if isReadFiltered && feed.unreadCount == 0 { return nil } return parentNode.existingOrNewChildNode(with: feed as AnyObject) @@ -64,14 +64,14 @@ private extension WebFeedTreeControllerDelegate { var children = [AnyObject]() for webFeed in container.topLevelWebFeeds { - if !(isUnreadFiltered && webFeed.unreadCount == 0) { + if !(isReadFiltered && webFeed.unreadCount == 0) { children.append(webFeed) } } if let folders = container.folders { for folder in folders { - if !(isUnreadFiltered && folder.unreadCount == 0) { + if !(isReadFiltered && folder.unreadCount == 0) { children.append(folder) } } @@ -131,7 +131,7 @@ private extension WebFeedTreeControllerDelegate { func sortedAccountNodes(_ parent: Node) -> [Node] { let nodes = AccountManager.shared.sortedActiveAccounts.compactMap { (account) -> Node? in - if isUnreadFiltered && account.unreadCount == 0 { + if isReadFiltered && account.unreadCount == 0 { return nil } let accountNode = parent.existingOrNewChildNode(with: account) diff --git a/iOS/SceneCoordinator.swift b/iOS/SceneCoordinator.swift index 3a4a9aece..a50bc53ba 100644 --- a/iOS/SceneCoordinator.swift +++ b/iOS/SceneCoordinator.swift @@ -113,7 +113,7 @@ class SceneCoordinator: NSObject, UndoableCommandRunner, UnreadCountProvider { } var isUnreadFeedsFiltered: Bool { - return treeControllerDelegate.isUnreadFiltered + return treeControllerDelegate.isReadFiltered } var articleReadFilterType: ReadFilterType = .none @@ -472,12 +472,12 @@ class SceneCoordinator: NSObject, UndoableCommandRunner, UnreadCountProvider { } func showAllFeeds() { - treeControllerDelegate.isUnreadFiltered = false + treeControllerDelegate.isReadFiltered = false rebuildBackingStores() } func hideUnreadFeeds() { - treeControllerDelegate.isUnreadFiltered = true + treeControllerDelegate.isReadFiltered = true rebuildBackingStores() }