From 0964ac67fa7d7349ef3f0b1048bb41b49baf5630 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Mon, 22 Apr 2019 16:25:16 -0500 Subject: [PATCH] Change master to be driven by the NavigationStateController. Remove ShowFeedNamesDidChange event. Fix articleSelectionChange event name. --- iOS/Detail/DetailViewController.swift | 4 +- iOS/Master/MasterViewController.swift | 28 +++++----- iOS/NavigationStateController.swift | 27 +++++++--- .../MasterTimelineViewController.swift | 51 ++++++++++++------- 4 files changed, 67 insertions(+), 43 deletions(-) diff --git a/iOS/Detail/DetailViewController.swift b/iOS/Detail/DetailViewController.swift index 76d614346..7ea48f819 100644 --- a/iOS/Detail/DetailViewController.swift +++ b/iOS/Detail/DetailViewController.swift @@ -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() diff --git a/iOS/Master/MasterViewController.swift b/iOS/Master/MasterViewController.swift index 4cb6cb1b9..13d87df26 100644 --- a/iOS/Master/MasterViewController.swift +++ b/iOS/Master/MasterViewController.swift @@ -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) } diff --git a/iOS/NavigationStateController.swift b/iOS/NavigationStateController.swift index 778bf5f9f..25bebf136 100644 --- a/iOS/NavigationStateController.swift +++ b/iOS/NavigationStateController.swift @@ -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) } } } diff --git a/iOS/Timeline/MasterTimelineViewController.swift b/iOS/Timeline/MasterTimelineViewController.swift index 4f7365af1..fce07ce15 100644 --- a/iOS/Timeline/MasterTimelineViewController.swift +++ b/iOS/Timeline/MasterTimelineViewController.swift @@ -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) {