2019-02-14 21:47:08 -08:00
|
|
|
|
//
|
2019-02-14 21:58:45 -08:00
|
|
|
|
// TimelineContainerViewController.swift
|
2019-02-14 21:47:08 -08:00
|
|
|
|
// NetNewsWire
|
|
|
|
|
//
|
|
|
|
|
// Created by Brent Simmons on 2/14/19.
|
|
|
|
|
// Copyright © 2019 Ranchero Software. All rights reserved.
|
|
|
|
|
//
|
|
|
|
|
|
2019-02-17 21:43:51 -08:00
|
|
|
|
import AppKit
|
|
|
|
|
import Articles
|
|
|
|
|
|
|
|
|
|
protocol TimelineContainerViewControllerDelegate: class {
|
|
|
|
|
func timelineSelectionDidChange(_: TimelineContainerViewController, articles: [Article]?, mode: TimelineSourceMode)
|
|
|
|
|
}
|
2019-02-14 21:47:08 -08:00
|
|
|
|
|
2019-02-16 22:14:06 -08:00
|
|
|
|
final class TimelineContainerViewController: NSViewController {
|
|
|
|
|
|
|
|
|
|
@IBOutlet var containerView: TimelineContainerView!
|
2019-02-17 21:43:51 -08:00
|
|
|
|
|
2019-02-18 12:38:14 -08:00
|
|
|
|
var currentTimelineViewController: TimelineViewController? {
|
|
|
|
|
didSet {
|
|
|
|
|
let view = currentTimelineViewController?.view
|
|
|
|
|
if containerView.contentView === view {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
containerView.contentView = view
|
2019-03-03 17:55:54 -06:00
|
|
|
|
view?.window?.recalculateKeyViewLoop()
|
2019-02-18 12:38:14 -08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-02-17 21:43:51 -08:00
|
|
|
|
weak var delegate: TimelineContainerViewControllerDelegate?
|
|
|
|
|
|
2019-02-16 22:14:06 -08:00
|
|
|
|
private lazy var regularTimelineViewController = {
|
|
|
|
|
return TimelineViewController(delegate: self)
|
|
|
|
|
}()
|
|
|
|
|
private lazy var searchTimelineViewController = {
|
|
|
|
|
return TimelineViewController(delegate: self)
|
|
|
|
|
}()
|
2019-02-14 21:47:08 -08:00
|
|
|
|
|
|
|
|
|
override func viewDidLoad() {
|
|
|
|
|
super.viewDidLoad()
|
2019-02-17 19:38:17 -08:00
|
|
|
|
setRepresentedObjects(nil, mode: .regular)
|
2019-02-24 22:39:57 -08:00
|
|
|
|
showTimeline(for: .regular)
|
2019-02-14 21:47:08 -08:00
|
|
|
|
}
|
2019-02-16 22:14:06 -08:00
|
|
|
|
|
|
|
|
|
// MARK: - API
|
|
|
|
|
|
2019-02-17 19:38:17 -08:00
|
|
|
|
func setRepresentedObjects(_ objects: [AnyObject]?, mode: TimelineSourceMode) {
|
|
|
|
|
timelineViewController(for: mode).representedObjects = objects
|
2019-02-16 22:14:06 -08:00
|
|
|
|
}
|
|
|
|
|
|
2019-02-24 22:39:57 -08:00
|
|
|
|
func showTimeline(for mode: TimelineSourceMode) {
|
2019-02-18 12:38:14 -08:00
|
|
|
|
currentTimelineViewController = timelineViewController(for: mode)
|
2019-02-16 22:14:06 -08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
extension TimelineContainerViewController: TimelineDelegate {
|
|
|
|
|
|
2019-02-17 21:43:51 -08:00
|
|
|
|
func timelineSelectionDidChange(_ timelineViewController: TimelineViewController, selectedArticles: [Article]?) {
|
|
|
|
|
delegate?.timelineSelectionDidChange(self, articles: selectedArticles, mode: mode(for: timelineViewController))
|
2019-02-16 22:14:06 -08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private extension TimelineContainerViewController {
|
|
|
|
|
|
|
|
|
|
func timelineViewController(for mode: TimelineSourceMode) -> TimelineViewController {
|
|
|
|
|
switch mode {
|
|
|
|
|
case .regular:
|
|
|
|
|
return regularTimelineViewController
|
|
|
|
|
case .search:
|
|
|
|
|
return searchTimelineViewController
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-02-17 21:43:51 -08:00
|
|
|
|
|
|
|
|
|
func mode(for timelineViewController: TimelineViewController) -> TimelineSourceMode {
|
|
|
|
|
if timelineViewController === regularTimelineViewController {
|
|
|
|
|
return .regular
|
|
|
|
|
}
|
|
|
|
|
else if timelineViewController === searchTimelineViewController {
|
|
|
|
|
return .search
|
|
|
|
|
}
|
|
|
|
|
assertionFailure("Expected timelineViewController to match either regular or search timelineViewController, but it doesn’t.")
|
|
|
|
|
return .regular // Should never get here.
|
|
|
|
|
}
|
2019-02-14 21:47:08 -08:00
|
|
|
|
}
|