From ee26aadb82605ec4838650e05b649abdc15f119a Mon Sep 17 00:00:00 2001 From: Brent Simmons Date: Tue, 28 Nov 2023 21:37:38 -0800 Subject: [PATCH] Create new web view controllers when the JavaScript setting changes, so that the effect of the change is immediate and apparent. --- Mac/AppDefaults.swift | 6 +- .../Detail/DetailContainerView.swift | 6 ++ .../Detail/DetailViewController.swift | 68 ++++++++++++++++--- 3 files changed, 66 insertions(+), 14 deletions(-) diff --git a/Mac/AppDefaults.swift b/Mac/AppDefaults.swift index 0790ba529..d4b2ee784 100644 --- a/Mac/AppDefaults.swift +++ b/Mac/AppDefaults.swift @@ -5,6 +5,7 @@ // Created by Brent Simmons on 9/22/17. // Copyright © 2017 Ranchero Software. All rights reserved. // + import AppKit enum FontSize: Int { @@ -17,9 +18,8 @@ enum FontSize: Int { final class AppDefaults { static let defaultThemeName = "Default" - - static var shared = AppDefaults() - private init() {} + + static let shared = AppDefaults() struct Key { static let firstRunDate = "firstRunDate" diff --git a/Mac/MainWindow/Detail/DetailContainerView.swift b/Mac/MainWindow/Detail/DetailContainerView.swift index ffc330b37..f51ec96ef 100644 --- a/Mac/MainWindow/Detail/DetailContainerView.swift +++ b/Mac/MainWindow/Detail/DetailContainerView.swift @@ -35,4 +35,10 @@ final class DetailContainerView: NSView { } } } + + override func draw(_ dirtyRect: NSRect) { + NSColor.controlBackgroundColor.set() + let r = NSIntersectionRect(dirtyRect, bounds) + r.fill() + } } diff --git a/Mac/MainWindow/Detail/DetailViewController.swift b/Mac/MainWindow/Detail/DetailViewController.swift index f8758a852..4a84a3f48 100644 --- a/Mac/MainWindow/Detail/DetailViewController.swift +++ b/Mac/MainWindow/Detail/DetailViewController.swift @@ -25,15 +25,10 @@ final class DetailViewController: NSViewController, WKUIDelegate { @IBOutlet var containerView: DetailContainerView! @IBOutlet var statusBarView: DetailStatusBarView! - lazy var regularWebViewController = { - return createWebViewController() - }() + private lazy var regularWebViewController = createWebViewController() + private var searchWebViewController: DetailWebViewController? - lazy var searchWebViewController = { - return createWebViewController() - }() - - var currentWebViewController: DetailWebViewController! { + private var currentWebViewController: DetailWebViewController! { didSet { let webview = currentWebViewController.view if containerView.contentView === webview { @@ -44,18 +39,44 @@ final class DetailViewController: NSViewController, WKUIDelegate { } } + private var currentSourceMode: TimelineSourceMode = .regular { + didSet { + currentWebViewController = webViewController(for: currentSourceMode) + } + } + + private var detailStateForRegular: DetailState = .noSelection { + didSet { + webViewController(for: .regular).state = detailStateForRegular + } + } + + private var detailStateForSearch: DetailState = .noSelection { + didSet { + webViewController(for: .search).state = detailStateForSearch + } + } + + private var isArticleContentJavascriptEnabled = AppDefaults.shared.isArticleContentJavascriptEnabled + override func viewDidLoad() { currentWebViewController = regularWebViewController + NotificationCenter.default.addObserver(self, selector: #selector(userDefaultsDidChange(_:)), name: UserDefaults.didChangeNotification, object: nil) } // MARK: - API func setState(_ state: DetailState, mode: TimelineSourceMode) { - webViewController(for: mode).state = state + switch mode { + case .regular: + detailStateForRegular = state + case .search: + detailStateForSearch = state + } } func showDetail(for mode: TimelineSourceMode) { - currentWebViewController = webViewController(for: mode) + currentSourceMode = mode } func stopMediaPlayback() { @@ -130,7 +151,32 @@ private extension DetailViewController { case .regular: return regularWebViewController case .search: - return searchWebViewController + if searchWebViewController == nil { + searchWebViewController = createWebViewController() + } + return searchWebViewController! + } + } + + @objc func userDefaultsDidChange(_ : Notification) { + if AppDefaults.shared.isArticleContentJavascriptEnabled != isArticleContentJavascriptEnabled { + isArticleContentJavascriptEnabled = AppDefaults.shared.isArticleContentJavascriptEnabled + createNewWebViewsAndRestoreState() + } + } + + func createNewWebViewsAndRestoreState() { + + regularWebViewController = createWebViewController() + currentWebViewController = regularWebViewController + regularWebViewController.state = detailStateForRegular + + searchWebViewController = nil + + if currentSourceMode == .search { + searchWebViewController = createWebViewController() + currentWebViewController = searchWebViewController + searchWebViewController!.state = detailStateForSearch } } }