From 59f06ea764e28cfd9c51e5f5513977e52be0bbbf Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Sat, 16 Dec 2017 11:16:32 -0800 Subject: [PATCH] Create Smart Feeds group item in sidebar. Fix #216. --- Evergreen.xcodeproj/project.pbxproj | 12 ++++++--- Evergreen/AppDelegate.swift | 8 +----- .../SidebarTreeControllerDelegate.swift | 16 ++++++++---- .../PseudoFeed.swift | 0 .../SmartFeed.swift | 0 .../SmartFeeds/SmartFeedsController.swift | 26 +++++++++++++++++++ .../StarredFeedDelegate.swift | 0 .../TodayFeedDelegate.swift | 0 .../UnreadFeed.swift | 0 9 files changed, 46 insertions(+), 16 deletions(-) rename Evergreen/{PseudoFeeds => SmartFeeds}/PseudoFeed.swift (100%) rename Evergreen/{PseudoFeeds => SmartFeeds}/SmartFeed.swift (100%) create mode 100644 Evergreen/SmartFeeds/SmartFeedsController.swift rename Evergreen/{PseudoFeeds => SmartFeeds}/StarredFeedDelegate.swift (100%) rename Evergreen/{PseudoFeeds => SmartFeeds}/TodayFeedDelegate.swift (100%) rename Evergreen/{PseudoFeeds => SmartFeeds}/UnreadFeed.swift (100%) diff --git a/Evergreen.xcodeproj/project.pbxproj b/Evergreen.xcodeproj/project.pbxproj index a196a79f9..e2e52d9ea 100644 --- a/Evergreen.xcodeproj/project.pbxproj +++ b/Evergreen.xcodeproj/project.pbxproj @@ -99,6 +99,7 @@ 84B99C9D1FAE83C600ECDEDB /* DeleteFromSidebarCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84B99C9C1FAE83C600ECDEDB /* DeleteFromSidebarCommand.swift */; }; 84BB4B771F11753300858766 /* Data.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84BB4B681F1174D400858766 /* Data.framework */; }; 84BB4B781F11753300858766 /* Data.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84BB4B681F1174D400858766 /* Data.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 84CC88181FE59CBF00644329 /* SmartFeedsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84CC88171FE59CBF00644329 /* SmartFeedsController.swift */; }; 84D52E951FE588BB00D14F5B /* DetailStatusBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D52E941FE588BB00D14F5B /* DetailStatusBarView.swift */; }; 84DAEE301F86CAFE0058304B /* OPMLImporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84DAEE2F1F86CAFE0058304B /* OPMLImporter.swift */; }; 84DAEE321F870B390058304B /* DockBadge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84DAEE311F870B390058304B /* DockBadge.swift */; }; @@ -495,6 +496,7 @@ 84B99C9C1FAE83C600ECDEDB /* DeleteFromSidebarCommand.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeleteFromSidebarCommand.swift; sourceTree = ""; }; 84BB4B611F1174D400858766 /* Data.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Data.xcodeproj; path = Frameworks/Data/Data.xcodeproj; sourceTree = ""; }; 84CBDDAE1FD3674C005A61AA /* Technotes */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Technotes; sourceTree = ""; }; + 84CC88171FE59CBF00644329 /* SmartFeedsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SmartFeedsController.swift; sourceTree = ""; }; 84D52E941FE588BB00D14F5B /* DetailStatusBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailStatusBarView.swift; sourceTree = ""; }; 84DAEE2F1F86CAFE0058304B /* OPMLImporter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OPMLImporter.swift; sourceTree = ""; }; 84DAEE311F870B390058304B /* DockBadge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = DockBadge.swift; path = Evergreen/DockBadge.swift; sourceTree = ""; }; @@ -819,7 +821,7 @@ 849A978B1ED9EE4D007D329B /* Feed List */, 849A97901ED9EF65007D329B /* Progress Window */, 84DAEE201F86CAE00058304B /* Importers */, - 84F2D5341FC22FCB00998D64 /* PseudoFeeds */, + 84F2D5341FC22FCB00998D64 /* SmartFeeds */, 849A97561ED9EB0D007D329B /* Data */, 8426119C1FCB6ED40086A189 /* HTMLMetadata */, 848F6AE31FC29CFA002D422E /* Favicons */, @@ -974,17 +976,18 @@ path = Evergreen/Resources/KeyboardShortcuts; sourceTree = SOURCE_ROOT; }; - 84F2D5341FC22FCB00998D64 /* PseudoFeeds */ = { + 84F2D5341FC22FCB00998D64 /* SmartFeeds */ = { isa = PBXGroup; children = ( + 84CC88171FE59CBF00644329 /* SmartFeedsController.swift */, 84F2D5351FC22FCB00998D64 /* PseudoFeed.swift */, 84F2D5391FC2308B00998D64 /* UnreadFeed.swift */, 845EE7C01FC2488C00854A1F /* SmartFeed.swift */, 84F2D5361FC22FCB00998D64 /* TodayFeedDelegate.swift */, 845EE7B01FC2366500854A1F /* StarredFeedDelegate.swift */, ); - name = PseudoFeeds; - path = Evergreen/PseudoFeeds; + name = SmartFeeds; + path = Evergreen/SmartFeeds; sourceTree = ""; }; 84FB9A2C1EDCD6A4003D53B9 /* Frameworks */ = { @@ -1362,6 +1365,7 @@ 842E45E51ED8C6B7000A8B52 /* MainWindowSplitView.swift in Sources */, 84F2D53A1FC2308B00998D64 /* UnreadFeed.swift in Sources */, 845A29221FC9251E007B49E3 /* SidebarCellLayout.swift in Sources */, + 84CC88181FE59CBF00644329 /* SmartFeedsController.swift in Sources */, 849A97661ED9EB96007D329B /* SidebarViewController.swift in Sources */, 849A97641ED9EB96007D329B /* SidebarOutlineView.swift in Sources */, 84F2D5371FC22FCC00998D64 /* PseudoFeed.swift in Sources */, diff --git a/Evergreen/AppDelegate.swift b/Evergreen/AppDelegate.swift index 0d554eefa..632714c92 100644 --- a/Evergreen/AppDelegate.swift +++ b/Evergreen/AppDelegate.swift @@ -26,7 +26,6 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserInterfaceValidations, var authorAvatarDownloader: AuthorAvatarDownloader! var feedIconDownloader: FeedIconDownloader! var appName: String! - var pseudoFeeds = [PseudoFeed]() var unreadCount = 0 { didSet { @@ -145,12 +144,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserInterfaceValidations, authorAvatarDownloader = AuthorAvatarDownloader(imageDownloader: imageDownloader) feedIconDownloader = FeedIconDownloader(imageDownloader: imageDownloader) - - let todayFeed = SmartFeed(delegate: TodayFeedDelegate()) - let unreadFeed = UnreadFeed() - let starredFeed = SmartFeed(delegate: StarredFeedDelegate()) - pseudoFeeds = [todayFeed, unreadFeed, starredFeed] - + createAndShowMainWindow() #if RELEASE diff --git a/Evergreen/MainWindow/Sidebar/SidebarTreeControllerDelegate.swift b/Evergreen/MainWindow/Sidebar/SidebarTreeControllerDelegate.swift index 66496ab4d..af22e3d24 100644 --- a/Evergreen/MainWindow/Sidebar/SidebarTreeControllerDelegate.swift +++ b/Evergreen/MainWindow/Sidebar/SidebarTreeControllerDelegate.swift @@ -21,6 +21,9 @@ final class SidebarTreeControllerDelegate: TreeControllerDelegate { if node.representedObject is Container { return childNodesForContainerNode(node) } + if node.representedObject is SmartFeedsController { + return childNodesForSmartFeeds(node) + } return nil } @@ -30,15 +33,18 @@ private extension SidebarTreeControllerDelegate { func childNodesForRootNode(_ rootNode: Node) -> [Node]? { - // The top-level nodes are pseudo-feeds (All Unread, Starred, etc.) and accounts. + // The top-level nodes are Smart Feeds and accounts. - return pseudoFeedNodes(rootNode) + sortedAccountNodes(rootNode) + let smartFeedsNode = rootNode.existingOrNewChildNode(with: SmartFeedsController.shared) + smartFeedsNode.canHaveChildNodes = true + smartFeedsNode.isGroupItem = true + + return [smartFeedsNode] + sortedAccountNodes(rootNode) } - func pseudoFeedNodes(_ rootNode: Node) -> [Node] { + func childNodesForSmartFeeds(_ parentNode: Node) -> [Node] { - // The appDelegate’s pseudoFeeds are already sorted properly. - return appDelegate.pseudoFeeds.map { rootNode.createChildNode($0) } + return SmartFeedsController.shared.smartFeeds.map { parentNode.existingOrNewChildNode(with: $0) } } func childNodesForContainerNode(_ containerNode: Node) -> [Node]? { diff --git a/Evergreen/PseudoFeeds/PseudoFeed.swift b/Evergreen/SmartFeeds/PseudoFeed.swift similarity index 100% rename from Evergreen/PseudoFeeds/PseudoFeed.swift rename to Evergreen/SmartFeeds/PseudoFeed.swift diff --git a/Evergreen/PseudoFeeds/SmartFeed.swift b/Evergreen/SmartFeeds/SmartFeed.swift similarity index 100% rename from Evergreen/PseudoFeeds/SmartFeed.swift rename to Evergreen/SmartFeeds/SmartFeed.swift diff --git a/Evergreen/SmartFeeds/SmartFeedsController.swift b/Evergreen/SmartFeeds/SmartFeedsController.swift new file mode 100644 index 000000000..f773b1dae --- /dev/null +++ b/Evergreen/SmartFeeds/SmartFeedsController.swift @@ -0,0 +1,26 @@ +// +// SmartFeedsController.swift +// Evergreen +// +// Created by Brent Simmons on 12/16/17. +// Copyright © 2017 Ranchero Software. All rights reserved. +// + +import Foundation +import RSCore + +final class SmartFeedsController: DisplayNameProvider { + + public static let shared = SmartFeedsController() + let nameForDisplay = NSLocalizedString("Smart Feeds", comment: "Smart Feeds group title") + + var smartFeeds = [AnyObject]() + let todayFeed = SmartFeed(delegate: TodayFeedDelegate()) + let unreadFeed = UnreadFeed() + let starredFeed = SmartFeed(delegate: StarredFeedDelegate()) + + private init() { + + self.smartFeeds = [todayFeed, unreadFeed, starredFeed] + } +} diff --git a/Evergreen/PseudoFeeds/StarredFeedDelegate.swift b/Evergreen/SmartFeeds/StarredFeedDelegate.swift similarity index 100% rename from Evergreen/PseudoFeeds/StarredFeedDelegate.swift rename to Evergreen/SmartFeeds/StarredFeedDelegate.swift diff --git a/Evergreen/PseudoFeeds/TodayFeedDelegate.swift b/Evergreen/SmartFeeds/TodayFeedDelegate.swift similarity index 100% rename from Evergreen/PseudoFeeds/TodayFeedDelegate.swift rename to Evergreen/SmartFeeds/TodayFeedDelegate.swift diff --git a/Evergreen/PseudoFeeds/UnreadFeed.swift b/Evergreen/SmartFeeds/UnreadFeed.swift similarity index 100% rename from Evergreen/PseudoFeeds/UnreadFeed.swift rename to Evergreen/SmartFeeds/UnreadFeed.swift