From 412c7df2324ebb4a9016fdc2e184423dcabf551d Mon Sep 17 00:00:00 2001 From: Lava <34743145+CanglongCl@users.noreply.github.com> Date: Thu, 25 Jan 2024 11:30:20 -0800 Subject: [PATCH] introduce global context and migrate updater controller into --- Easydict.xcodeproj/project.pbxproj | 4 ++ Easydict/App/AppDelegate.h | 2 - .../Feature/Configuration/Configuration.swift | 10 +---- .../Feature/Configuration/EZConfiguration.m | 2 +- Easydict/NewApp/EasydictApp.swift | 37 +++------------- Easydict/NewApp/GlobalContext.swift | 44 +++++++++++++++++++ Easydict/NewApp/View/MenuItemView.swift | 20 ++++----- 7 files changed, 65 insertions(+), 54 deletions(-) create mode 100644 Easydict/NewApp/GlobalContext.swift diff --git a/Easydict.xcodeproj/project.pbxproj b/Easydict.xcodeproj/project.pbxproj index 0feacd3fa..57c136e50 100644 --- a/Easydict.xcodeproj/project.pbxproj +++ b/Easydict.xcodeproj/project.pbxproj @@ -277,6 +277,7 @@ EA9943EE2B5353AB00EE7B97 /* WindowTypeExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA9943ED2B5353AB00EE7B97 /* WindowTypeExtensions.swift */; }; EA9943F02B5354C400EE7B97 /* ShowWindowPositionExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA9943EF2B5354C400EE7B97 /* ShowWindowPositionExtensions.swift */; }; EA9943F22B5358BF00EE7B97 /* LanguageExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA9943F12B5358BF00EE7B97 /* LanguageExtensions.swift */; }; + EAE3D3502B62E9DE001EE3E3 /* GlobalContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAE3D34F2B62E9DE001EE3E3 /* GlobalContext.swift */; }; EAED41EC2B54AA920005FE0A /* ServiceConfigurationSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAED41EB2B54AA920005FE0A /* ServiceConfigurationSection.swift */; }; EAED41EF2B54B1430005FE0A /* ConfigurableService.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAED41EE2B54B1430005FE0A /* ConfigurableService.swift */; }; EAED41F22B54B39D0005FE0A /* OpenAIService+ConfigurableService.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAED41F12B54B39D0005FE0A /* OpenAIService+ConfigurableService.swift */; }; @@ -772,6 +773,7 @@ EA9943ED2B5353AB00EE7B97 /* WindowTypeExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowTypeExtensions.swift; sourceTree = ""; }; EA9943EF2B5354C400EE7B97 /* ShowWindowPositionExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShowWindowPositionExtensions.swift; sourceTree = ""; }; EA9943F12B5358BF00EE7B97 /* LanguageExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LanguageExtensions.swift; sourceTree = ""; }; + EAE3D34F2B62E9DE001EE3E3 /* GlobalContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlobalContext.swift; sourceTree = ""; }; EAED41EB2B54AA920005FE0A /* ServiceConfigurationSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServiceConfigurationSection.swift; sourceTree = ""; }; EAED41EE2B54B1430005FE0A /* ConfigurableService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConfigurableService.swift; sourceTree = ""; }; EAED41F12B54B39D0005FE0A /* OpenAIService+ConfigurableService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OpenAIService+ConfigurableService.swift"; sourceTree = ""; }; @@ -2068,6 +2070,7 @@ 27FE95262B3DC55F000AD654 /* EasydictApp.swift */, 27FE98042B3DCB09000AD654 /* NewAppManager.swift */, 27FE98062B3DD525000AD654 /* View */, + EAE3D34F2B62E9DE001EE3E3 /* GlobalContext.swift */, ); path = NewApp; sourceTree = ""; @@ -2795,6 +2798,7 @@ 0320C5872B29F35700861B3D /* QueryServiceRecord.swift in Sources */, 03FC699A2B39D13A0035D2DA /* EZOpenAIChatResponse.m in Sources */, 03B022FA29231FA6001C7E63 /* EZServiceTypes.m in Sources */, + EAE3D3502B62E9DE001EE3E3 /* GlobalContext.swift in Sources */, EA9943F02B5354C400EE7B97 /* ShowWindowPositionExtensions.swift in Sources */, 03B0233129231FA6001C7E63 /* MMCrash.m in Sources */, 03B0232629231FA6001C7E63 /* NSAttributedString+MM.m in Sources */, diff --git a/Easydict/App/AppDelegate.h b/Easydict/App/AppDelegate.h index d604f4d1b..4c1bb5030 100644 --- a/Easydict/App/AppDelegate.h +++ b/Easydict/App/AppDelegate.h @@ -11,6 +11,4 @@ @interface AppDelegate : NSObject -@property (weak) IBOutlet SPUStandardUpdaterController *updaterController; - @end diff --git a/Easydict/Feature/Configuration/Configuration.swift b/Easydict/Feature/Configuration/Configuration.swift index f888889c2..b388be637 100644 --- a/Easydict/Feature/Configuration/Configuration.swift +++ b/Easydict/Feature/Configuration/Configuration.swift @@ -30,12 +30,6 @@ let kHideMenuBarIconKey = "EZConfiguration_kHideMenuBarIconKey" } } - var appDelegate = NSApp.delegate as? AppDelegate - - var updater: SPUUpdater? { - appDelegate?.updaterController.updater - } - @DefaultsWrapper(.firstLanguage) var firstLanguage: Language @@ -65,10 +59,10 @@ let kHideMenuBarIconKey = "EZConfiguration_kHideMenuBarIconKey" var automaticallyChecksForUpdates: Bool { get { - updater?.automaticallyChecksForUpdates ?? false + GlobalContext.updaterController.updater.automaticallyDownloadsUpdates } set { - updater?.automaticallyChecksForUpdates = newValue + GlobalContext.updaterController.updater.automaticallyDownloadsUpdates = newValue logSettings(["automatically_checks_for_updates": newValue]) } } diff --git a/Easydict/Feature/Configuration/EZConfiguration.m b/Easydict/Feature/Configuration/EZConfiguration.m index e1b40f69b..3cd01f6ad 100644 --- a/Easydict/Feature/Configuration/EZConfiguration.m +++ b/Easydict/Feature/Configuration/EZConfiguration.m @@ -147,7 +147,7 @@ - (BOOL)automaticallyChecksForUpdates { } - (SPUUpdater *)updater { - return self.appDelegate.updaterController.updater; + return GlobalContext.getUpdaterController.updater; } #pragma mark - setter diff --git a/Easydict/NewApp/EasydictApp.swift b/Easydict/NewApp/EasydictApp.swift index c81ba83f4..ceadd9baf 100644 --- a/Easydict/NewApp/EasydictApp.swift +++ b/Easydict/NewApp/EasydictApp.swift @@ -8,6 +8,7 @@ import Sparkle import SwiftUI +import Defaults @main enum EasydictCmpatibilityEntry { @@ -21,28 +22,12 @@ enum EasydictCmpatibilityEntry { } } -class SPUUpdaterHelper: NSObject, SPUUpdaterDelegate { - func feedURLString(for _: SPUUpdater) -> String? { - var feedURLString = "https://raw.githubusercontent.com/tisfeng/Easydict/main/appcast.xml" - #if DEBUG - feedURLString = "http://localhost:8000/appcast.xml" - #endif - return feedURLString - } -} - -class SPUUserDriverHelper: NSObject, SPUStandardUserDriverDelegate { - var supportsGentleScheduledUpdateReminders: Bool { - true - } -} - struct EasydictApp: App { @NSApplicationDelegateAdaptor - var delegate: AppDelegate + private var delegate: AppDelegate - @AppStorage(kHideMenuBarIconKey) - private var hideMenuBar = false + @Default(.hideMenuBarIcon) + private var hideMenuBar private var menuBarImage: String { #if DEBUG @@ -52,22 +37,10 @@ struct EasydictApp: App { #endif } - let userDriverHelper = SPUUserDriverHelper() - let upadterHelper = SPUUpdaterHelper() - - private let updaterController: SPUStandardUpdaterController - - init() { - // 参考 https://sparkle-project.org/documentation/programmatic-setup/ - // If you want to start the updater manually, pass false to startingUpdater and call .startUpdater() later - // This is where you can also pass an updater delegate if you need one - updaterController = SPUStandardUpdaterController(startingUpdater: true, updaterDelegate: upadterHelper, userDriverDelegate: userDriverHelper) - } - var body: some Scene { if #available(macOS 13, *) { MenuBarExtra(isInserted: $hideMenuBar.toggledValue) { - MenuItemView(updater: updaterController.updater) + MenuItemView() } label: { Label { Text("Easydict") diff --git a/Easydict/NewApp/GlobalContext.swift b/Easydict/NewApp/GlobalContext.swift new file mode 100644 index 000000000..a80dc2baf --- /dev/null +++ b/Easydict/NewApp/GlobalContext.swift @@ -0,0 +1,44 @@ +// +// GlobalContext.swift +// Easydict +// +// Created by 戴藏龙 on 2024/1/25. +// Copyright © 2024 izual. All rights reserved. +// + +import Foundation +import Sparkle + +@objc class GlobalContext: NSObject { + static let updaterController: SPUStandardUpdaterController = { + class SPUUpdaterHelper: NSObject, SPUUpdaterDelegate { + func feedURLString(for _: SPUUpdater) -> String? { + var feedURLString = "https://raw.githubusercontent.com/tisfeng/Easydict/main/appcast.xml" + #if DEBUG + feedURLString = "http://localhost:8000/appcast.xml" + #endif + return feedURLString + } + } + + class SPUUserDriverHelper: NSObject, SPUStandardUserDriverDelegate { + var supportsGentleScheduledUpdateReminders: Bool { + true + } + } + let userDriverHelper = SPUUserDriverHelper() + let upadterHelper = SPUUpdaterHelper() + // 参考 https://sparkle-project.org/documentation/programmatic-setup/ + // If you want to start the updater manually, pass false to startingUpdater and call .startUpdater() later + // This is where you can also pass an updater delegate if you need one + return SPUStandardUpdaterController( + startingUpdater: true, + updaterDelegate: upadterHelper, + userDriverDelegate: userDriverHelper + ) + }() + + @objc class func getUpdaterController() -> SPUStandardUpdaterController { + updaterController + } +} diff --git a/Easydict/NewApp/View/MenuItemView.swift b/Easydict/NewApp/View/MenuItemView.swift index 5f25919b1..f549678ac 100644 --- a/Easydict/NewApp/View/MenuItemView.swift +++ b/Easydict/NewApp/View/MenuItemView.swift @@ -13,21 +13,19 @@ import ZipArchive @available(macOS 13, *) final class MenuItemStore: ObservableObject { @Published var canCheckForUpdates = false - var updater: SPUUpdater - init(updater: SPUUpdater) { - self.updater = updater - self.updater.publisher(for: \.canCheckForUpdates) + + init() { + GlobalContext + .updaterController + .updater + .publisher(for: \.canCheckForUpdates) .assign(to: &$canCheckForUpdates) } } @available(macOS 13, *) struct MenuItemView: View { - @ObservedObject var store: MenuItemStore - - init(updater: SPUUpdater) { - store = MenuItemStore(updater: updater) - } + @ObservedObject private var store: MenuItemStore = .init() var body: some View { // ️.menuBarExtraStyle为 .menu 时某些控件可能会失效 ,只能显示内容(按照菜单项高度、图像以 template 方式渲染)无法交互 ,比如 Stepper、Slider 等,像基本的 Button、Text、Divider、Image 等还是能正常显示的。 @@ -173,7 +171,7 @@ struct MenuItemView: View { private var checkUpdateItem: some View { Button("check_updates") { NSLog("检查更新") - store.updater.checkForUpdates() + GlobalContext.updaterController.updater.checkForUpdates() }.disabled(!store.canCheckForUpdates) } @@ -225,5 +223,5 @@ struct MenuItemView: View { @available(macOS 13, *) #Preview { - MenuItemView(updater: SPUStandardUpdaterController(startingUpdater: true, updaterDelegate: nil, userDriverDelegate: nil).updater) + MenuItemView() }