Change master to be driven by the NavigationStateController.

Remove ShowFeedNamesDidChange event.
Fix articleSelectionChange event name.
This commit is contained in:
Maurice Parker 2019-04-22 16:25:16 -05:00
parent b2e080cf8e
commit 0964ac67fa
4 changed files with 67 additions and 43 deletions

View File

@ -33,7 +33,7 @@ class DetailViewController: UIViewController {
reloadUI()
reloadHTML()
NotificationCenter.default.addObserver(self, selector: #selector(statusesDidChange(_:)), name: .StatusesDidChange, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(articleSelectionChange(_:)), name: .ArticleSelectionChange, object: navState)
NotificationCenter.default.addObserver(self, selector: #selector(articleSelectionDidChange(_:)), name: .ArticleSelectionDidChange, object: navState)
}
func markAsRead() {
@ -92,7 +92,7 @@ class DetailViewController: UIViewController {
}
}
@objc func articleSelectionChange(_ note: Notification) {
@objc func articleSelectionDidChange(_ note: Notification) {
markAsRead()
reloadUI()
reloadHTML()

View File

@ -36,6 +36,8 @@ class MasterViewController: UITableViewController, UndoableCommandRunner {
NotificationCenter.default.addObserver(self, selector: #selector(userDidAddFeed(_:)), name: .UserDidAddFeed, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(progressDidChange(_:)), name: .AccountRefreshProgressDidChange, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(masterSelectionDidChange(_:)), name: .MasterSelectionDidChange, object: navState)
refreshControl = UIRefreshControl()
refreshControl!.addTarget(self, action: #selector(refreshAccounts(_:)), for: .valueChanged)
@ -134,6 +136,16 @@ class MasterViewController: UITableViewController, UndoableCommandRunner {
}
@objc func masterSelectionDidChange(_ note: Notification) {
if let indexPath = navState.currentMasterIndexPath {
if tableView.indexPathForSelectedRow != indexPath {
tableView.selectRow(at: indexPath, animated: true, scrollPosition: .middle)
}
}
}
// MARK: Table View
override func numberOfSections(in tableView: UITableView) -> Int {
@ -231,23 +243,9 @@ class MasterViewController: UITableViewController, UndoableCommandRunner {
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
guard let node = navState.nodeFor(indexPath) else {
assertionFailure()
return
}
let timeline = UIStoryboard.main.instantiateController(ofType: MasterTimelineViewController.self)
if let fetcher = node.representedObject as? ArticleFetcher {
navState.timelineFetcher = fetcher
}
if let nameProvider = node.representedObject as? DisplayNameProvider {
timeline.title = nameProvider.nameForDisplay
}
timeline.navState = navState
navState.currentMasterIndexPath = indexPath
self.navigationController?.pushViewController(timeline, animated: true)
}

View File

@ -13,12 +13,12 @@ import RSCore
import RSTree
public extension Notification.Name {
static let MasterSelectionDidChange = Notification.Name(rawValue: "MasterSelectionDidChange")
static let BackingStoresDidRebuild = Notification.Name(rawValue: "BackingStoresDidRebuild")
static let ShowFeedNamesDidChange = Notification.Name(rawValue: "ShowFeedNamesDidChange")
static let ArticlesReinitialized = Notification.Name(rawValue: "ArticlesReinitialized")
static let ArticleDataDidChange = Notification.Name(rawValue: "ArticleDataDidChange")
static let ArticlesDidChange = Notification.Name(rawValue: "ArticlesDidChange")
static let ArticleSelectionChange = Notification.Name(rawValue: "ArticleSelectionChange")
static let ArticleSelectionDidChange = Notification.Name(rawValue: "ArticleSelectionDidChange")
}
class NavigationStateController {
@ -51,13 +51,22 @@ class NavigationStateController {
var numberOfSections: Int {
return shadowTable.count
}
var showFeedNames = false {
var currentMasterIndexPath: IndexPath? {
didSet {
NotificationCenter.default.post(name: .ShowFeedNamesDidChange, object: self, userInfo: nil)
guard let ip = currentMasterIndexPath, let node = nodeFor(ip) else {
assertionFailure()
return
}
if let fetcher = node.representedObject as? ArticleFetcher {
timelineFetcher = fetcher
}
}
}
var showAvatars = false
var timelineName: String? {
return (timelineFetcher as? DisplayNameProvider)?.nameForDisplay
}
var timelineFetcher: ArticleFetcher? {
didSet {
@ -72,6 +81,10 @@ class NavigationStateController {
}
}
var showFeedNames = false
var showAvatars = false
var isPrevArticleAvailable: Bool {
guard let indexPath = currentArticleIndexPath else {
return false
@ -110,7 +123,7 @@ class NavigationStateController {
var currentArticleIndexPath: IndexPath? {
didSet {
if currentArticleIndexPath != oldValue {
NotificationCenter.default.post(name: .ArticleSelectionChange, object: self, userInfo: nil)
NotificationCenter.default.post(name: .ArticleSelectionDidChange, object: self, userInfo: nil)
}
}
}

View File

@ -42,15 +42,19 @@ class MasterTimelineViewController: UITableViewController, UndoableCommandRunner
NotificationCenter.default.addObserver(self, selector: #selector(progressDidChange(_:)), name: .AccountRefreshProgressDidChange, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(articlesReinitialized(_:)), name: .ArticlesReinitialized, object: navState)
NotificationCenter.default.addObserver(self, selector: #selector(showFeedNamesDidChange(_:)), name: .ShowFeedNamesDidChange, object: navState)
NotificationCenter.default.addObserver(self, selector: #selector(articleDataDidChange(_:)), name: .ArticleDataDidChange, object: navState)
NotificationCenter.default.addObserver(self, selector: #selector(articlesDidChange(_:)), name: .ArticlesDidChange, object: navState)
NotificationCenter.default.addObserver(self, selector: #selector(articleSelectionChange(_:)), name: .ArticleSelectionChange, object: navState)
NotificationCenter.default.addObserver(self, selector: #selector(articleSelectionDidChange(_:)), name: .ArticleSelectionDidChange, object: navState)
refreshControl = UIRefreshControl()
refreshControl!.addTarget(self, action: #selector(refreshAccounts(_:)), for: .valueChanged)
splitViewController?.delegate = self
if let splitViewController = splitViewController {
splitViewController.delegate = self
changeToDisplayMode(splitViewController.displayMode)
}
reloadUI()
}
@ -247,13 +251,7 @@ class MasterTimelineViewController: UITableViewController, UndoableCommandRunner
}
@objc func articlesReinitialized(_ note: Notification) {
if navState?.articles.count ?? 0 > 0 {
tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: false)
}
}
@objc func showFeedNamesDidChange(_ note: Notification) {
updateTableViewRowHeight()
reloadUI()
}
@objc func articleDataDidChange(_ note: Notification) {
@ -264,7 +262,7 @@ class MasterTimelineViewController: UITableViewController, UndoableCommandRunner
tableView.reloadData()
}
@objc func articleSelectionChange(_ note: Notification) {
@objc func articleSelectionDidChange(_ note: Notification) {
if let indexPath = navState?.currentArticleIndexPath {
if tableView.indexPathForSelectedRow != indexPath {
@ -338,6 +336,20 @@ class MasterTimelineViewController: UITableViewController, UndoableCommandRunner
extension MasterTimelineViewController: UISplitViewControllerDelegate {
func splitViewController(_ svc: UISplitViewController, willChangeTo displayMode: UISplitViewController.DisplayMode) {
changeToDisplayMode(displayMode)
}
}
// MARK: Private
private extension MasterTimelineViewController {
@objc private func refreshAccounts(_ sender: Any) {
AccountManager.shared.refreshAll()
}
func changeToDisplayMode(_ displayMode: UISplitViewController.DisplayMode) {
if displayMode == .allVisible {
nextUnreadButton.isEnabled = false
nextUnreadButton.title = ""
@ -347,14 +359,15 @@ extension MasterTimelineViewController: UISplitViewControllerDelegate {
}
}
}
// MARK: Private
private extension MasterTimelineViewController {
@objc private func refreshAccounts(_ sender: Any) {
AccountManager.shared.refreshAll()
func reloadUI() {
updateTableViewRowHeight()
title = navState?.timelineName
if navState?.articles.count ?? 0 > 0 {
tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: false)
}
}
func configureTimelineCell(_ cell: MasterTimelineTableViewCell, article: Article) {