diff --git a/NetNewsWire/MainWindow/MainWindowController.swift b/NetNewsWire/MainWindow/MainWindowController.swift index 9c6fa7183..e4817fc36 100644 --- a/NetNewsWire/MainWindow/MainWindowController.swift +++ b/NetNewsWire/MainWindow/MainWindowController.swift @@ -37,6 +37,7 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations { private static var detailViewMinimumThickness = 384 private var sidebarViewController: SidebarViewController! + private var timelineContainerViewController: TimelineContainerViewController! // MARK: - NSWindowController @@ -64,9 +65,12 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations { detailSplitViewItem?.minimumThickness = CGFloat(MainWindowController.detailViewMinimumThickness) restoreSplitViewState() + sidebarViewController = splitViewController?.splitViewItems[0].viewController as? SidebarViewController sidebarViewController.delegate = self + timelineContainerViewController = splitViewController?.splitViewItems[1].viewController as? TimelineContainerViewController + NotificationCenter.default.addObserver(self, selector: #selector(applicationWillTerminate(_:)), name: NSApplication.willTerminateNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(refreshProgressDidChange(_:)), name: .AccountRefreshDidBegin, object: nil) @@ -365,8 +369,10 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations { extension MainWindowController: SidebarDelegate { - func selectionDidChange(to selectedObjects: [AnyObject]?) { - // TODO: communicate with TimelineViewController + func sidebarSelectionDidChange(to selectedObjects: [AnyObject]?) { + // TODO: if searching, cancel search + timelineContainerViewController.setRepresentedObjects(selectedObjects, mode: .regular) + timelineContainerViewController.showTimeline(.regular) updateWindowTitle() NotificationCenter.default.post(name: .InspectableObjectsDidChange, object: nil) } diff --git a/NetNewsWire/MainWindow/Sidebar/SidebarViewController.swift b/NetNewsWire/MainWindow/Sidebar/SidebarViewController.swift index 8fc8ec3d5..a1e5f8a07 100644 --- a/NetNewsWire/MainWindow/Sidebar/SidebarViewController.swift +++ b/NetNewsWire/MainWindow/Sidebar/SidebarViewController.swift @@ -13,7 +13,7 @@ import Account import RSCore protocol SidebarDelegate: class { - func selectionDidChange(to: [AnyObject]?) + func sidebarSelectionDidChange(to: [AnyObject]?) } @objc class SidebarViewController: NSViewController, NSOutlineViewDelegate, NSOutlineViewDataSource, NSMenuDelegate, UndoableCommandRunner { @@ -385,7 +385,7 @@ private extension SidebarViewController { } func selectionDidChange(_ selectedObjects: [AnyObject]?) { - delegate?.selectionDidChange(to: selectedObjects) + delegate?.sidebarSelectionDidChange(to: selectedObjects) } func updateUnreadCounts(for objects: [AnyObject]) { diff --git a/NetNewsWire/MainWindow/Timeline/TimelineContainerViewController.swift b/NetNewsWire/MainWindow/Timeline/TimelineContainerViewController.swift index 914bf106b..79b0942dc 100644 --- a/NetNewsWire/MainWindow/Timeline/TimelineContainerViewController.swift +++ b/NetNewsWire/MainWindow/Timeline/TimelineContainerViewController.swift @@ -8,17 +8,10 @@ import Cocoa -enum TimelineState { - case empty - case representedObjects([AnyObject]) -} - final class TimelineContainerViewController: NSViewController { @IBOutlet var containerView: TimelineContainerView! - private var states: [TimelineSourceMode: TimelineState] = [.regular: .empty, .search: .empty] - private lazy var regularTimelineViewController = { return TimelineViewController(delegate: self) }() @@ -28,17 +21,17 @@ final class TimelineContainerViewController: NSViewController { override func viewDidLoad() { super.viewDidLoad() - setState(.empty, mode: .regular) - showTimeline(for: .regular) + setRepresentedObjects(nil, mode: .regular) + showTimeline(.regular) } // MARK: - API - func setState(_ state: TimelineState, mode: TimelineSourceMode) { - timelineViewController(for: mode).state = state + func setRepresentedObjects(_ objects: [AnyObject]?, mode: TimelineSourceMode) { + timelineViewController(for: mode).representedObjects = objects } - func showTimeline(for mode: TimelineSourceMode) { + func showTimeline(_ mode: TimelineSourceMode) { containerView.contentView = timelineViewController(for: mode).view } } diff --git a/NetNewsWire/MainWindow/Timeline/TimelineTableView.xib b/NetNewsWire/MainWindow/Timeline/TimelineTableView.xib index bf6fa2d5c..b77f3dcd5 100644 --- a/NetNewsWire/MainWindow/Timeline/TimelineTableView.xib +++ b/NetNewsWire/MainWindow/Timeline/TimelineTableView.xib @@ -41,6 +41,8 @@ + + diff --git a/NetNewsWire/MainWindow/Timeline/TimelineViewController.swift b/NetNewsWire/MainWindow/Timeline/TimelineViewController.swift index 8994e595a..a3ca815d0 100644 --- a/NetNewsWire/MainWindow/Timeline/TimelineViewController.swift +++ b/NetNewsWire/MainWindow/Timeline/TimelineViewController.swift @@ -19,13 +19,27 @@ final class TimelineViewController: NSViewController, UndoableCommandRunner { @IBOutlet var tableView: TimelineTableView! - var state: TimelineState = .empty { + var representedObjects: [AnyObject]? { didSet { - switch state { - case .empty: - representedObjects = nil - case .representedObjects(let updatedRepresentedObjects): - representedObjects = updatedRepresentedObjects + if !representedObjectArraysAreEqual(oldValue, representedObjects) { + + if let representedObjects = representedObjects { + if representedObjects.count == 1 && representedObjects.first is Feed { + showFeedNames = false + } + else { + showFeedNames = true + } + } + else { + showFeedNames = false + } + + postTimelineSelectionDidChangeNotification(nil) + fetchArticles() + if articles.count > 0 { + tableView.scrollRowToVisible(0) + } } } } @@ -99,32 +113,6 @@ final class TimelineViewController: NSViewController, UndoableCommandRunner { } } - private var representedObjects: [AnyObject]? { - didSet { - if !representedObjectArraysAreEqual(oldValue, representedObjects) { - - if let representedObjects = representedObjects { - if representedObjects.count == 1 && representedObjects.first is Feed { - showFeedNames = false - } - else { - showFeedNames = true - } - } - else { - showFeedNames = false - } - - postTimelineSelectionDidChangeNotification(nil) - articles = ArticleArray() - fetchArticles() - if articles.count > 0 { - tableView.scrollRowToVisible(0) - } - } - } - } - private var oneSelectedArticle: Article? { return selectedArticles.count == 1 ? selectedArticles.first : nil }