From 9a15068fddcf832b281c6ab19f5fd2a9285f75b5 Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Sun, 17 Feb 2019 18:46:28 -0800 Subject: [PATCH] Continue work on swapping timeline views. --- NetNewsWire/AppDelegate.swift | 4 +- NetNewsWire/AppNotifications.swift | 3 +- .../MainWindow/MainWindowController.swift | 47 ++++++++----------- .../Sidebar/SidebarViewController.swift | 24 ++++++---- 4 files changed, 38 insertions(+), 40 deletions(-) diff --git a/NetNewsWire/AppDelegate.swift b/NetNewsWire/AppDelegate.swift index 733609a41..6450e268e 100644 --- a/NetNewsWire/AppDelegate.swift +++ b/NetNewsWire/AppDelegate.swift @@ -66,7 +66,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserInterfaceValidations, super.init() NotificationCenter.default.addObserver(self, selector: #selector(unreadCountDidChange(_:)), name: .UnreadCountDidChange, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(sidebarSelectionDidChange(_:)), name: .SidebarSelectionDidChange, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(inspectableObjectsDidChange(_:)), name: .InspectableObjectsDidChange, object: nil) appDelegate = self } @@ -230,7 +230,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserInterfaceValidations, let _ = faviconDownloader.favicon(for: feed) } - @objc func sidebarSelectionDidChange(_ note: Notification) { + @objc func inspectableObjectsDidChange(_ note: Notification) { guard let inspectorWindowController = inspectorWindowController, inspectorWindowController.isOpen else { return diff --git a/NetNewsWire/AppNotifications.swift b/NetNewsWire/AppNotifications.swift index d734b78f1..2752f6ee0 100644 --- a/NetNewsWire/AppNotifications.swift +++ b/NetNewsWire/AppNotifications.swift @@ -10,10 +10,9 @@ import AppKit import Articles extension Notification.Name { - static let SidebarSelectionDidChange = Notification.Name("SidebarSelectionDidChangeNotification") static let TimelineSelectionDidChange = Notification.Name("TimelineSelectionDidChangeNotification") - + static let InspectableObjectsDidChange = Notification.Name("TimelineSelectionDidChangeNotification") static let UserDidAddFeed = Notification.Name("UserDidAddFeedNotification") static let UserDidRequestSidebarSelection = Notification.Name("UserDidRequestSidebarSelectionNotification") } diff --git a/NetNewsWire/MainWindow/MainWindowController.swift b/NetNewsWire/MainWindow/MainWindowController.swift index 42f0c6d4d..657f4160a 100644 --- a/NetNewsWire/MainWindow/MainWindowController.swift +++ b/NetNewsWire/MainWindow/MainWindowController.swift @@ -23,10 +23,12 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations { private let windowAutosaveName = NSWindow.FrameAutosaveName("MainWindow") static var didPositionWindowOnFirstRun = false - private var currentFeedOrFolder: AnyObject? = nil { - didSet { - updateWindowTitle() + private var currentFeedOrFolder: AnyObject? { + // Nil for none or multiple selection. + guard let selectedObjects = selectedObjectsInSidebar(), selectedObjects.count == 1 else { + return nil } + return selectedObjects.first } private var shareToolbarItem: NSToolbarItem? { @@ -34,6 +36,7 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations { } private static var detailViewMinimumThickness = 384 + private var sidebarViewController: SidebarViewController! // MARK: - NSWindowController @@ -61,6 +64,8 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations { detailSplitViewItem?.minimumThickness = CGFloat(MainWindowController.detailViewMinimumThickness) restoreSplitViewState() + sidebarViewController = splitViewController?.splitViewItems[0].viewController as? SidebarViewController + sidebarViewController.delegate = self NotificationCenter.default.addObserver(self, selector: #selector(applicationWillTerminate(_:)), name: NSApplication.willTerminateNotification, object: nil) @@ -68,7 +73,7 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations { NotificationCenter.default.addObserver(self, selector: #selector(refreshProgressDidChange(_:)), name: .AccountRefreshDidFinish, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(refreshProgressDidChange(_:)), name: .AccountRefreshProgressDidChange, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(sidebarSelectionDidChange(_:)), name: .SidebarSelectionDidChange, object: nil) +// NotificationCenter.default.addObserver(self, selector: #selector(sidebarSelectionDidChange(_:)), name: .SidebarSelectionDidChange, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(unreadCountDidChange(_:)), name: .UnreadCountDidChange, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(displayNameDidChange(_:)), name: .DisplayNameDidChange, object: nil) @@ -103,25 +108,6 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations { CoalescingQueue.standard.add(self, #selector(makeToolbarValidate)) } - @objc func sidebarSelectionDidChange(_ note: Notification) { - - let selectedObjects = selectedObjectsInSidebar() - - // We can only meaninfully display one feed or folder at a time - guard selectedObjects?.count == 1 else { - currentFeedOrFolder = nil - return - } - - guard selectedObjects?[0] is DisplayNameProvider else { - currentFeedOrFolder = nil - return - } - - currentFeedOrFolder = selectedObjects?[0] - - } - @objc func unreadCountDidChange(_ note: Notification) { updateWindowTitleIfNecessary(note.object) } @@ -376,6 +362,17 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations { } +// MARK: - SidebarDelegate + +extension MainWindowController: SidebarDelegate { + + func selectionDidChange(to selectedObjects: [AnyObject]?) { + // TODO: communicate with TimelineViewController + updateWindowTitle() + NotificationCenter.default.post(name: .InspectableObjectsDidChange, object: nil) + } +} + // MARK: - Scripting Access /* @@ -408,10 +405,6 @@ private extension MainWindowController { return viewController.children.first as? NSSplitViewController } - var sidebarViewController: SidebarViewController? { - return splitViewController?.splitViewItems[0].viewController as? SidebarViewController - } - var timelineViewController: TimelineViewController? { return splitViewController?.splitViewItems[1].viewController as? TimelineViewController } diff --git a/NetNewsWire/MainWindow/Sidebar/SidebarViewController.swift b/NetNewsWire/MainWindow/Sidebar/SidebarViewController.swift index 9bf6a37dd..b71a08c8b 100644 --- a/NetNewsWire/MainWindow/Sidebar/SidebarViewController.swift +++ b/NetNewsWire/MainWindow/Sidebar/SidebarViewController.swift @@ -12,10 +12,16 @@ import Articles import Account import RSCore +protocol SidebarDelegate: class { + func selectionDidChange(to: [AnyObject]?) +} + @objc class SidebarViewController: NSViewController, NSOutlineViewDelegate, NSOutlineViewDataSource, NSMenuDelegate, UndoableCommandRunner { @IBOutlet var outlineView: SidebarOutlineView! - + + weak var delegate: SidebarDelegate? + let treeControllerDelegate = SidebarTreeControllerDelegate() lazy var treeController: TreeController = { return TreeController(delegate: treeControllerDelegate) @@ -380,14 +386,14 @@ private extension SidebarViewController { } func postSidebarSelectionDidChangeNotification(_ selectedObjects: [AnyObject]?) { - - var userInfo = UserInfoDictionary() - if let objects = selectedObjects { - userInfo[UserInfoKey.objects] = objects - } - userInfo[UserInfoKey.view] = outlineView - - NotificationCenter.default.post(name: .SidebarSelectionDidChange, object: self, userInfo: userInfo) + delegate?.selectionDidChange(to: selectedObjects) +// var userInfo = UserInfoDictionary() +// if let objects = selectedObjects { +// userInfo[UserInfoKey.objects] = objects +// } +// userInfo[UserInfoKey.view] = outlineView +// +// NotificationCenter.default.post(name: .SidebarSelectionDidChange, object: self, userInfo: userInfo) } func updateUnreadCounts(for objects: [AnyObject]) {