diff --git a/NetNewsWire.xcodeproj/project.pbxproj b/NetNewsWire.xcodeproj/project.pbxproj index 3752177c8..8baf5d9c1 100644 --- a/NetNewsWire.xcodeproj/project.pbxproj +++ b/NetNewsWire.xcodeproj/project.pbxproj @@ -79,7 +79,7 @@ 5170743A232AABFC00A461A3 /* FlattenedAccountFolderPickerData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51C452812265093600C03939 /* FlattenedAccountFolderPickerData.swift */; }; 517630042336215100E15FFF /* main.js in Resources */ = {isa = PBXBuildFile; fileRef = 517630032336215100E15FFF /* main.js */; }; 517630052336215100E15FFF /* main.js in Resources */ = {isa = PBXBuildFile; fileRef = 517630032336215100E15FFF /* main.js */; }; - 517630232336657E00E15FFF /* DetailViewControllerWebViewProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 517630222336657E00E15FFF /* DetailViewControllerWebViewProvider.swift */; }; + 517630232336657E00E15FFF /* ArticleViewControllerWebViewProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 517630222336657E00E15FFF /* ArticleViewControllerWebViewProvider.swift */; }; 5183CCD0226E1E880010922C /* NonIntrinsicLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5183CCCF226E1E880010922C /* NonIntrinsicLabel.swift */; }; 5183CCDA226E31A50010922C /* NonIntrinsicImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5183CCD9226E31A50010922C /* NonIntrinsicImageView.swift */; }; 5183CCDD226F1F5C0010922C /* NavigationProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5183CCDC226F1F5C0010922C /* NavigationProgressView.swift */; }; @@ -142,7 +142,7 @@ 51C452792265091600C03939 /* MasterTimelineTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51C452722265091600C03939 /* MasterTimelineTableViewCell.swift */; }; 51C4527B2265091600C03939 /* MasterUnreadIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51C452742265091600C03939 /* MasterUnreadIndicatorView.swift */; }; 51C4527C2265091600C03939 /* MasterTimelineDefaultCellLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51C452752265091600C03939 /* MasterTimelineDefaultCellLayout.swift */; }; - 51C4527F2265092C00C03939 /* DetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51C4527E2265092C00C03939 /* DetailViewController.swift */; }; + 51C4527F2265092C00C03939 /* ArticleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51C4527E2265092C00C03939 /* ArticleViewController.swift */; }; 51C452852265093600C03939 /* FlattenedAccountFolderPickerData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51C452812265093600C03939 /* FlattenedAccountFolderPickerData.swift */; }; 51C452862265093600C03939 /* Add.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 51C452822265093600C03939 /* Add.storyboard */; }; 51C452882265093600C03939 /* AddFeedViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51C452842265093600C03939 /* AddFeedViewController.swift */; }; @@ -816,7 +816,7 @@ 515D4FCE2325B3D000EE1167 /* NetNewsWire_iOSshareextension_target.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = NetNewsWire_iOSshareextension_target.xcconfig; sourceTree = ""; }; 51707438232AA97100A461A3 /* ShareFolderPickerController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareFolderPickerController.swift; sourceTree = ""; }; 517630032336215100E15FFF /* main.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = main.js; sourceTree = ""; }; - 517630222336657E00E15FFF /* DetailViewControllerWebViewProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailViewControllerWebViewProvider.swift; sourceTree = ""; }; + 517630222336657E00E15FFF /* ArticleViewControllerWebViewProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArticleViewControllerWebViewProvider.swift; sourceTree = ""; }; 5183CCCF226E1E880010922C /* NonIntrinsicLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NonIntrinsicLabel.swift; sourceTree = ""; }; 5183CCD9226E31A50010922C /* NonIntrinsicImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NonIntrinsicImageView.swift; sourceTree = ""; }; 5183CCDC226F1F5C0010922C /* NavigationProgressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationProgressView.swift; sourceTree = ""; }; @@ -850,7 +850,7 @@ 51C452722265091600C03939 /* MasterTimelineTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MasterTimelineTableViewCell.swift; sourceTree = ""; }; 51C452742265091600C03939 /* MasterUnreadIndicatorView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MasterUnreadIndicatorView.swift; sourceTree = ""; }; 51C452752265091600C03939 /* MasterTimelineDefaultCellLayout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MasterTimelineDefaultCellLayout.swift; sourceTree = ""; }; - 51C4527E2265092C00C03939 /* DetailViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DetailViewController.swift; sourceTree = ""; }; + 51C4527E2265092C00C03939 /* ArticleViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ArticleViewController.swift; sourceTree = ""; }; 51C452812265093600C03939 /* FlattenedAccountFolderPickerData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FlattenedAccountFolderPickerData.swift; sourceTree = ""; }; 51C452822265093600C03939 /* Add.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Add.storyboard; sourceTree = ""; }; 51C452842265093600C03939 /* AddFeedViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddFeedViewController.swift; sourceTree = ""; }; @@ -1372,13 +1372,13 @@ path = Cell; sourceTree = ""; }; - 51C4527D2265092C00C03939 /* Detail */ = { + 51C4527D2265092C00C03939 /* Article */ = { isa = PBXGroup; children = ( - 51C4527E2265092C00C03939 /* DetailViewController.swift */, - 517630222336657E00E15FFF /* DetailViewControllerWebViewProvider.swift */, + 51C4527E2265092C00C03939 /* ArticleViewController.swift */, + 517630222336657E00E15FFF /* ArticleViewControllerWebViewProvider.swift */, ); - path = Detail; + path = Article; sourceTree = ""; }; 51C452802265093600C03939 /* Add */ = { @@ -1959,7 +1959,7 @@ 51BB7C262335A8E5008E8144 /* ArticleActivityItemSource.swift */, 51C4525D226508F600C03939 /* MasterFeed */, 51C4526D2265091600C03939 /* MasterTimeline */, - 51C4527D2265092C00C03939 /* Detail */, + 51C4527D2265092C00C03939 /* Article */, 51C452802265093600C03939 /* Add */, 5183CCEB227117C70010922C /* Settings */, 5183CCDB226F1EEB0010922C /* Progress */, @@ -2708,7 +2708,7 @@ 51C452A722650A3D00C03939 /* RSImage-Extensions.swift in Sources */, 51C45269226508F600C03939 /* MasterFeedTableViewCell.swift in Sources */, 51F85BFD2275DCA800C787DC /* SingleLineUILabelSizer.swift in Sources */, - 517630232336657E00E15FFF /* DetailViewControllerWebViewProvider.swift in Sources */, + 517630232336657E00E15FFF /* ArticleViewControllerWebViewProvider.swift in Sources */, 51C4528F226509BD00C03939 /* UnreadFeed.swift in Sources */, 51AF460E232488C6001742EF /* Account-Extensions.swift in Sources */, 5183CCDD226F1F5C0010922C /* NavigationProgressView.swift in Sources */, @@ -2757,7 +2757,7 @@ 51FA73A82332BE880090D516 /* ExtractedArticle.swift in Sources */, 51C4527C2265091600C03939 /* MasterTimelineDefaultCellLayout.swift in Sources */, 51C4529A22650A0400C03939 /* ArticleStyle.swift in Sources */, - 51C4527F2265092C00C03939 /* DetailViewController.swift in Sources */, + 51C4527F2265092C00C03939 /* ArticleViewController.swift in Sources */, 51C4526A226508F600C03939 /* MasterFeedTableViewCellLayout.swift in Sources */, 51C452AE2265104D00C03939 /* TimelineStringFormatter.swift in Sources */, 512E08E62268800D00BDCFDD /* FolderTreeControllerDelegate.swift in Sources */, diff --git a/iOS/AppDelegate.swift b/iOS/AppDelegate.swift index 2bce61ac6..9a4757548 100644 --- a/iOS/AppDelegate.swift +++ b/iOS/AppDelegate.swift @@ -54,7 +54,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDele appDelegate = self // Force lazy initialization of the web view provider so that it can warm up the queue of prepared web views - let _ = DetailViewControllerWebViewProvider.shared + let _ = ArticleViewControllerWebViewProvider.shared AccountManager.shared = AccountManager() AppDefaults.shared = UserDefaults.init(suiteName: "group.\(Bundle.main.bundleIdentifier!)")! diff --git a/iOS/Detail/DetailViewController.swift b/iOS/Article/ArticleViewController.swift similarity index 95% rename from iOS/Detail/DetailViewController.swift rename to iOS/Article/ArticleViewController.swift index bf2e35ad7..99265597b 100644 --- a/iOS/Detail/DetailViewController.swift +++ b/iOS/Article/ArticleViewController.swift @@ -1,5 +1,5 @@ // -// DetailViewController.swift +// ArticleViewController.swift // NetNewsWire // // Created by Maurice Parker on 4/8/19. @@ -12,7 +12,7 @@ import Account import Articles import SafariServices -enum DetailViewState: Equatable { +enum ArticleViewState: Equatable { case noSelection case multipleSelection case loading @@ -20,7 +20,7 @@ enum DetailViewState: Equatable { case extracted(Article, ExtractedArticle) } -class DetailViewController: UIViewController { +class ArticleViewController: UIViewController { @IBOutlet private weak var nextUnreadBarButtonItem: UIBarButtonItem! @IBOutlet private weak var prevArticleBarButtonItem: UIBarButtonItem! @@ -34,7 +34,7 @@ class DetailViewController: UIViewController { weak var coordinator: SceneCoordinator! - var state: DetailViewState = .noSelection { + var state: ArticleViewState = .noSelection { didSet { if state != oldValue { updateUI() @@ -61,7 +61,7 @@ class DetailViewController: UIViewController { deinit { webView.removeFromSuperview() - DetailViewControllerWebViewProvider.shared.enqueueWebView(webView) + ArticleViewControllerWebViewProvider.shared.enqueueWebView(webView) webView = nil } @@ -73,7 +73,7 @@ class DetailViewController: UIViewController { NotificationCenter.default.addObserver(self, selector: #selector(progressDidChange(_:)), name: .AccountRefreshProgressDidChange, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(contentSizeCategoryDidChange(_:)), name: UIContentSizeCategory.didChangeNotification, object: nil) - DetailViewControllerWebViewProvider.shared.dequeueWebView() { webView in + ArticleViewControllerWebViewProvider.shared.dequeueWebView() { webView in self.webView = webView self.webViewContainer.addChildAndPin(webView) @@ -248,7 +248,7 @@ class DetailViewController: UIViewController { // MARK: WKNavigationDelegate -extension DetailViewController: WKNavigationDelegate { +extension ArticleViewController: WKNavigationDelegate { func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { if navigationAction.navigationType == .linkActivated { @@ -284,7 +284,7 @@ extension DetailViewController: WKNavigationDelegate { // MARK: Private -private extension DetailViewController { +private extension ArticleViewController { func updateProgressIndicatorIfNeeded() { if !(UIDevice.current.userInterfaceIdiom == .pad) { diff --git a/iOS/Detail/DetailViewControllerWebViewProvider.swift b/iOS/Article/ArticleViewControllerWebViewProvider.swift similarity index 92% rename from iOS/Detail/DetailViewControllerWebViewProvider.swift rename to iOS/Article/ArticleViewControllerWebViewProvider.swift index 58c1d7fdf..f221110a1 100644 --- a/iOS/Detail/DetailViewControllerWebViewProvider.swift +++ b/iOS/Article/ArticleViewControllerWebViewProvider.swift @@ -1,5 +1,5 @@ // -// DetailViewControllerWebViewProvider.swift +// ArticleViewControllerWebViewProvider.swift // NetNewsWire-iOS // // Created by Maurice Parker on 9/21/19. @@ -11,9 +11,9 @@ import WebKit /// WKWebView has an awful behavior of a flash to white on first load when in dark mode. /// Keep a queue of WebViews where we've already done a trivial load so that by the time we need them in the UI, they're past the flash-to-shite part of their lifecycle. -class DetailViewControllerWebViewProvider: NSObject, WKNavigationDelegate { +class ArticleViewControllerWebViewProvider: NSObject, WKNavigationDelegate { - static let shared = DetailViewControllerWebViewProvider() + static let shared = ArticleViewControllerWebViewProvider() private let minimumQueueDepth = 3 private let maximumQueueDepth = 6 diff --git a/iOS/Base.lproj/Main.storyboard b/iOS/Base.lproj/Main.storyboard index ef1fd9be4..b15425794 100644 --- a/iOS/Base.lproj/Main.storyboard +++ b/iOS/Base.lproj/Main.storyboard @@ -7,10 +7,10 @@ - + - + diff --git a/iOS/SceneCoordinator.swift b/iOS/SceneCoordinator.swift index 65e2d8abd..0df1641d8 100644 --- a/iOS/SceneCoordinator.swift +++ b/iOS/SceneCoordinator.swift @@ -36,17 +36,17 @@ class SceneCoordinator: NSObject, UndoableCommandRunner, UnreadCountProvider { return rootSplitViewController.children.last as? UISplitViewController } - private var detailViewController: DetailViewController? { - if let detail = masterNavigationController.viewControllers.last as? DetailViewController { + private var articleViewController: ArticleViewController? { + if let detail = masterNavigationController.viewControllers.last as? ArticleViewController { return detail } if let subSplit = subSplitViewController { if let navController = subSplit.viewControllers.last as? UINavigationController { - return navController.topViewController as? DetailViewController + return navController.topViewController as? ArticleViewController } } else { if let navController = rootSplitViewController.viewControllers.last as? UINavigationController { - return navController.topViewController as? DetailViewController + return navController.topViewController as? ArticleViewController } } return nil @@ -289,9 +289,9 @@ class SceneCoordinator: NSObject, UndoableCommandRunner, UnreadCountProvider { masterFeedViewController.coordinator = self masterNavigationController.pushViewController(masterFeedViewController, animated: false) - let detailViewController = UIStoryboard.main.instantiateController(ofType: DetailViewController.self) - detailViewController.coordinator = self - let detailNavigationController = addNavControllerIfNecessary(detailViewController, showButton: false) + let articleViewController = UIStoryboard.main.instantiateController(ofType: ArticleViewController.self) + articleViewController.coordinator = self + let detailNavigationController = addNavControllerIfNecessary(articleViewController, showButton: false) rootSplitViewController.showDetailViewController(detailNavigationController, sender: self) configureThreePanelMode(for: size) @@ -558,27 +558,27 @@ class SceneCoordinator: NSObject, UndoableCommandRunner, UnreadCountProvider { if article == nil { if rootSplitViewController.isCollapsed { - if masterNavigationController.children.last is DetailViewController { + if masterNavigationController.children.last is ArticleViewController { masterNavigationController.popViewController(animated: !automated) } } else { - detailViewController?.state = .noSelection + articleViewController?.state = .noSelection } masterTimelineViewController?.updateArticleSelection(animate: !automated) return } - if detailViewController == nil { - let detailViewController = UIStoryboard.main.instantiateController(ofType: DetailViewController.self) - detailViewController.coordinator = self - installDetailController(detailViewController, automated: automated) + if articleViewController == nil { + let articleViewController = UIStoryboard.main.instantiateController(ofType: ArticleViewController.self) + articleViewController.coordinator = self + installArticleController(articleViewController, automated: automated) } if automated { masterTimelineViewController?.updateArticleSelection(animate: false) } - detailViewController?.state = .article(article!) + articleViewController?.state = .article(article!) if let article = currentArticle { markArticles(Set([article]), statusKey: .read, flag: true) @@ -686,8 +686,8 @@ class SceneCoordinator: NSObject, UndoableCommandRunner, UnreadCountProvider { } func scrollOrGoToNextUnread() { - if detailViewController?.canScrollDown() ?? false { - detailViewController?.scrollPageDown() + if articleViewController?.canScrollDown() ?? false { + articleViewController?.scrollPageDown() } else { selectNextUnread() } @@ -844,7 +844,7 @@ class SceneCoordinator: NSObject, UndoableCommandRunner, UnreadCountProvider { } func navigateToDetail() { - detailViewController?.focus() + articleViewController?.focus() } } @@ -1340,16 +1340,16 @@ private extension SceneCoordinator { } } - func installDetailController(_ detailController: UIViewController, automated: Bool) { + func installArticleController(_ articleController: UIViewController, automated: Bool) { if let subSplit = subSplitViewController { - let controller = addNavControllerIfNecessary(detailController, showButton: false) + let controller = addNavControllerIfNecessary(articleController, showButton: false) subSplit.showDetailViewController(controller, sender: self) } else if rootSplitViewController.isCollapsed { - let controller = addNavControllerIfNecessary(detailController, showButton: false) + let controller = addNavControllerIfNecessary(articleController, showButton: false) masterNavigationController.pushViewController(controller, animated: !automated) } else { - let controller = addNavControllerIfNecessary(detailController, showButton: true) + let controller = addNavControllerIfNecessary(articleController, showButton: true) rootSplitViewController.showDetailViewController(controller, sender: self) } @@ -1406,12 +1406,12 @@ private extension SceneCoordinator { } let controller: UIViewController = { - if let result = detailViewController { + if let result = articleViewController { return result } else { - let detailController = UIStoryboard.main.instantiateController(ofType: DetailViewController.self) - detailController.coordinator = self - return detailController + let articleViewController = UIStoryboard.main.instantiateController(ofType: ArticleViewController.self) + articleViewController.coordinator = self + return articleViewController } }()