mirror of
https://github.com/Ranchero-Software/NetNewsWire.git
synced 2025-02-09 00:28:53 +01:00
Added feed selection restoration.
This commit is contained in:
parent
ceef6116f9
commit
de38ba9f5b
@ -170,6 +170,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserInterfaceValidations,
|
|||||||
authorAvatarDownloader = AuthorAvatarDownloader(imageDownloader: imageDownloader)
|
authorAvatarDownloader = AuthorAvatarDownloader(imageDownloader: imageDownloader)
|
||||||
webFeedIconDownloader = WebFeedIconDownloader(imageDownloader: imageDownloader, folder: cacheFolder)
|
webFeedIconDownloader = WebFeedIconDownloader(imageDownloader: imageDownloader, folder: cacheFolder)
|
||||||
|
|
||||||
|
appName = (Bundle.main.infoDictionary!["CFBundleExecutable"]! as! String)
|
||||||
}
|
}
|
||||||
|
|
||||||
func applicationDidFinishLaunching(_ note: Notification) {
|
func applicationDidFinishLaunching(_ note: Notification) {
|
||||||
@ -190,8 +191,6 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserInterfaceValidations,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
appName = (Bundle.main.infoDictionary!["CFBundleExecutable"]! as! String)
|
|
||||||
|
|
||||||
AppDefaults.registerDefaults()
|
AppDefaults.registerDefaults()
|
||||||
let isFirstRun = AppDefaults.isFirstRun
|
let isFirstRun = AppDefaults.isFirstRun
|
||||||
if isFirstRun {
|
if isFirstRun {
|
||||||
|
@ -63,6 +63,7 @@ protocol SidebarDelegate: class {
|
|||||||
outlineView.setDraggingSourceOperationMask([.move, .copy], forLocal: true)
|
outlineView.setDraggingSourceOperationMask([.move, .copy], forLocal: true)
|
||||||
outlineView.registerForDraggedTypes([WebFeedPasteboardWriter.webFeedUTIInternalType, WebFeedPasteboardWriter.webFeedUTIType, .URL, .string])
|
outlineView.registerForDraggedTypes([WebFeedPasteboardWriter.webFeedUTIInternalType, WebFeedPasteboardWriter.webFeedUTIType, .URL, .string])
|
||||||
|
|
||||||
|
NotificationCenter.default.addObserver(self, selector: #selector(unreadCountDidInitialize(_:)), name: .UnreadCountDidInitialize, object: nil)
|
||||||
NotificationCenter.default.addObserver(self, selector: #selector(unreadCountDidChange(_:)), name: .UnreadCountDidChange, object: nil)
|
NotificationCenter.default.addObserver(self, selector: #selector(unreadCountDidChange(_:)), name: .UnreadCountDidChange, object: nil)
|
||||||
NotificationCenter.default.addObserver(self, selector: #selector(containerChildrenDidChange(_:)), name: .ChildrenDidChange, object: nil)
|
NotificationCenter.default.addObserver(self, selector: #selector(containerChildrenDidChange(_:)), name: .ChildrenDidChange, object: nil)
|
||||||
NotificationCenter.default.addObserver(self, selector: #selector(accountsDidChange(_:)), name: .UserDidAddAccount, object: nil)
|
NotificationCenter.default.addObserver(self, selector: #selector(accountsDidChange(_:)), name: .UserDidAddAccount, object: nil)
|
||||||
@ -92,21 +93,52 @@ protocol SidebarDelegate: class {
|
|||||||
func saveState(to coder: NSCoder) {
|
func saveState(to coder: NSCoder) {
|
||||||
coder.encode(isReadFiltered, forKey: UserInfoKey.readFeedsFilterState)
|
coder.encode(isReadFiltered, forKey: UserInfoKey.readFeedsFilterState)
|
||||||
coder.encode(expandedTable.map( { $0.userInfo }), forKey: UserInfoKey.containerExpandedWindowState)
|
coder.encode(expandedTable.map( { $0.userInfo }), forKey: UserInfoKey.containerExpandedWindowState)
|
||||||
|
coder.encode(selectedFeeds.compactMap({ $0.feedID?.userInfo }), forKey: UserInfoKey.selectedFeedsState)
|
||||||
}
|
}
|
||||||
|
|
||||||
func restoreState(from coder: NSCoder) {
|
func restoreState(from coder: NSCoder) {
|
||||||
isReadFiltered = coder.decodeBool(forKey: UserInfoKey.readFeedsFilterState)
|
|
||||||
|
|
||||||
if let containerExpandedWindowState = try? coder.decodeTopLevelObject(forKey: UserInfoKey.containerExpandedWindowState) as? [[AnyHashable: AnyHashable]] {
|
if let containerExpandedWindowState = try? coder.decodeTopLevelObject(forKey: UserInfoKey.containerExpandedWindowState) as? [[AnyHashable: AnyHashable]] {
|
||||||
let containerIdentifers = containerExpandedWindowState.compactMap( { ContainerIdentifier(userInfo: $0) })
|
let containerIdentifers = containerExpandedWindowState.compactMap( { ContainerIdentifier(userInfo: $0) })
|
||||||
expandedTable = Set(containerIdentifers)
|
expandedTable = Set(containerIdentifers)
|
||||||
}
|
}
|
||||||
|
|
||||||
rebuildTreeAndRestoreSelection()
|
guard let selectedFeedsState = try? coder.decodeTopLevelObject(forKey: UserInfoKey.selectedFeedsState) as? [[AnyHashable: AnyHashable]] else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let selectedFeedIdentifers = Set(selectedFeedsState.compactMap( { FeedIdentifier(userInfo: $0) }))
|
||||||
|
selectedFeedIdentifers.forEach { treeControllerDelegate.addFilterException($0) }
|
||||||
|
|
||||||
|
rebuildTreeAndReloadDataIfNeeded()
|
||||||
|
|
||||||
|
var selectIndexes = IndexSet()
|
||||||
|
|
||||||
|
func selectFeedsVisitor(node: Node) {
|
||||||
|
if let feedID = (node.representedObject as? FeedIdentifiable)?.feedID {
|
||||||
|
if selectedFeedIdentifers.contains(feedID) {
|
||||||
|
selectIndexes.insert(outlineView.row(forItem: node) )
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
treeController.visitNodes(selectFeedsVisitor(node:))
|
||||||
|
outlineView.selectRowIndexes(selectIndexes, byExtendingSelection: false)
|
||||||
|
|
||||||
|
isReadFiltered = coder.decodeBool(forKey: UserInfoKey.readFeedsFilterState)
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Notifications
|
// MARK: - Notifications
|
||||||
|
|
||||||
|
@objc func unreadCountDidInitialize(_ notification: Notification) {
|
||||||
|
guard notification.object is AccountManager else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if isReadFiltered {
|
||||||
|
rebuildTreeAndRestoreSelection()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@objc func unreadCountDidChange(_ note: Notification) {
|
@objc func unreadCountDidChange(_ note: Notification) {
|
||||||
guard let representedObject = note.object else {
|
guard let representedObject = note.object else {
|
||||||
return
|
return
|
||||||
@ -118,6 +150,10 @@ protocol SidebarDelegate: class {
|
|||||||
configureUnreadCountForCellsForRepresentedObjects([representedObject as AnyObject])
|
configureUnreadCountForCellsForRepresentedObjects([representedObject as AnyObject])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
guard AccountManager.shared.isUnreadCountsInitialized else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if let feed = representedObject as? Feed, isReadFiltered, feed.unreadCount > 0 {
|
if let feed = representedObject as? Feed, isReadFiltered, feed.unreadCount > 0 {
|
||||||
addTreeControllerToFilterExceptions()
|
addTreeControllerToFilterExceptions()
|
||||||
queueRebuildTreeAndRestoreSelection()
|
queueRebuildTreeAndRestoreSelection()
|
||||||
@ -563,6 +599,7 @@ private extension SidebarViewController {
|
|||||||
|
|
||||||
func selectionDidChange(_ selectedObjects: [AnyObject]?) {
|
func selectionDidChange(_ selectedObjects: [AnyObject]?) {
|
||||||
delegate?.sidebarSelectionDidChange(self, selectedObjects: selectedObjects)
|
delegate?.sidebarSelectionDidChange(self, selectedObjects: selectedObjects)
|
||||||
|
delegate?.sidebarInvalidatedRestorationState(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateUnreadCounts(for objects: [AnyObject]) {
|
func updateUnreadCounts(for objects: [AnyObject]) {
|
||||||
|
@ -19,4 +19,6 @@ struct UserInfoKey {
|
|||||||
static let containerExpandedWindowState = "containerExpandedWindowState"
|
static let containerExpandedWindowState = "containerExpandedWindowState"
|
||||||
static let readFeedsFilterState = "readFeedsFilterState"
|
static let readFeedsFilterState = "readFeedsFilterState"
|
||||||
static let readArticlesFilterState = "readArticlesFilterState"
|
static let readArticlesFilterState = "readArticlesFilterState"
|
||||||
|
static let selectedFeedsState = "selectedFeedsState"
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user