PrefMgr // Refactor the didSet methods.

This commit is contained in:
ShikiSuen 2024-02-26 15:14:20 +08:00
parent 4904664277
commit c2679735c1
12 changed files with 84 additions and 61 deletions

View File

@ -7,6 +7,7 @@
// requirements defined in MIT License. // requirements defined in MIT License.
import AppKit import AppKit
import Shared
import SwiftUI import SwiftUI
public class CtlAboutUI: NSWindowController, NSWindowDelegate { public class CtlAboutUI: NSWindowController, NSWindowDelegate {

View File

@ -7,6 +7,7 @@
// requirements defined in MIT License. // requirements defined in MIT License.
import AppKit import AppKit
import Shared
import SwiftUI import SwiftUI
public struct VwrAboutUI { public struct VwrAboutUI {

View File

@ -7,6 +7,7 @@
// requirements defined in MIT License. // requirements defined in MIT License.
import Hotenka import Hotenka
import Shared
public enum ChineseConverter { public enum ChineseConverter {
public static let shared = HotenkaChineseConverter( public static let shared = HotenkaChineseConverter(

View File

@ -7,6 +7,7 @@
// requirements defined in MIT License. // requirements defined in MIT License.
import Foundation import Foundation
import Shared
import SwiftExtension import SwiftExtension
// MARK: - Typing Method // MARK: - Typing Method

View File

@ -0,0 +1,36 @@
// (c) 2021 and onwards The vChewing Project (MIT-NTL License).
// ====================
// This code is released under the MIT license (SPDX-License-Identifier: MIT)
// ... with NTL restriction stating that:
// No trademark license is granted to use the trade names, trademarks, service
// marks, or product names of Contributor, except as required to fulfill notice
// requirements defined in MIT License.
import Shared
public extension PrefMgr {
static let shared: PrefMgr = {
let result = PrefMgr()
result.assignDidSetActions()
return result
}()
private func assignDidSetActions() {
didAskForSyncingLMPrefs = {
if PrefMgr.shared.phraseReplacementEnabled {
LMMgr.loadUserPhraseReplacement()
}
if PrefMgr.shared.associatedPhrasesEnabled {
LMMgr.loadUserAssociatesData()
}
LMMgr.syncLMPrefs()
}
didAskForRefreshingSpeechSputnik = {
SpeechSputnik.shared.refreshStatus()
}
didAskForSyncingShiftKeyDetectorPrefs = {
SessionCtl.theShiftKeyDetector.toggleWithLShift = PrefMgr.shared.togglingAlphanumericalModeWithLShift
SessionCtl.theShiftKeyDetector.toggleWithRShift = PrefMgr.shared.togglingAlphanumericalModeWithRShift
}
}
}

View File

@ -8,6 +8,7 @@
import AppKit import AppKit
import AVFoundation import AVFoundation
import Shared
public class SpeechSputnik { public class SpeechSputnik {
public static var shared: SpeechSputnik = .init() public static var shared: SpeechSputnik = .init()

View File

@ -26,5 +26,9 @@ let package = Package(
.product(name: "SwiftExtension", package: "vChewing_SwiftExtension"), .product(name: "SwiftExtension", package: "vChewing_SwiftExtension"),
] ]
), ),
.testTarget(
name: "SharedTests",
dependencies: ["Shared"]
),
] ]
) )

View File

@ -8,7 +8,6 @@
import AppKit import AppKit
import Carbon import Carbon
import Shared
// MARK: - Top-level Enums relating to Input Mode and Language Supports. // MARK: - Top-level Enums relating to Input Mode and Language Supports.
@ -52,7 +51,7 @@ public enum IMEApp {
// MARK: - // MARK: -
public static var currentInputMode: Shared.InputMode { public static var currentInputMode: Shared.InputMode {
.init(rawValue: PrefMgr.shared.mostRecentInputMode) ?? .imeModeNULL .init(rawValue: PrefMgr().mostRecentInputMode) ?? .imeModeNULL
} }
/// JIS /// JIS
@ -62,9 +61,10 @@ public enum IMEApp {
/// Fart or Beep? /// Fart or Beep?
public static func buzz() { public static func buzz() {
if PrefMgr.shared.isDebugModeEnabled { let prefs = PrefMgr()
NSSound.buzz(fart: !PrefMgr.shared.shouldNotFartInLieuOfBeep) if prefs.isDebugModeEnabled {
} else if !PrefMgr.shared.shouldNotFartInLieuOfBeep { NSSound.buzz(fart: !prefs.shouldNotFartInLieuOfBeep)
} else if !prefs.shouldNotFartInLieuOfBeep {
NSSound.buzz(fart: true) NSSound.buzz(fart: true)
} else { } else {
NSSound.beep() NSSound.beep()

View File

@ -6,14 +6,12 @@
// marks, or product names of Contributor, except as required to fulfill notice // marks, or product names of Contributor, except as required to fulfill notice
// requirements defined in MIT License. // requirements defined in MIT License.
import AppKit import Foundation
import Shared
import SwiftExtension import SwiftExtension
// MARK: - // MARK: -
@objcMembers public class PrefMgr: NSObject, PrefMgrProtocol { @objcMembers public class PrefMgr: NSObject, PrefMgrProtocol {
public static let shared = PrefMgr()
public static let kDefaultCandidateKeys = "123456" public static let kDefaultCandidateKeys = "123456"
public static let kDefaultBasicKeyboardLayout = "com.apple.keylayout.ZhuyinBopomofo" public static let kDefaultBasicKeyboardLayout = "com.apple.keylayout.ZhuyinBopomofo"
public static let kDefaultAlphanumericalKeyboardLayout = { public static let kDefaultAlphanumericalKeyboardLayout = {
@ -27,6 +25,10 @@ import SwiftExtension
"com.valvesoftware.steam": true, "jp.naver.line.mac": true, "com.valvesoftware.steam": true, "jp.naver.line.mac": true,
] ]
public var didAskForSyncingLMPrefs: (() -> Void)?
public var didAskForRefreshingSpeechSputnik: (() -> Void)?
public var didAskForSyncingShiftKeyDetectorPrefs: (() -> Void)?
// MARK: - Settings (Tier 1) // MARK: - Settings (Tier 1)
@AppProperty(key: UserDef.kIsDebugModeEnabled.rawValue, defaultValue: false) @AppProperty(key: UserDef.kIsDebugModeEnabled.rawValue, defaultValue: false)
@ -135,9 +137,7 @@ import SwiftExtension
@AppProperty(key: UserDef.kReadingNarrationCoverage.rawValue, defaultValue: 0) @AppProperty(key: UserDef.kReadingNarrationCoverage.rawValue, defaultValue: 0)
public dynamic var readingNarrationCoverage: Int { public dynamic var readingNarrationCoverage: Int {
didSet { didSet { didAskForRefreshingSpeechSputnik?() }
SpeechSputnik.shared.refreshStatus()
}
} }
@AppProperty(key: UserDef.kAlsoConfirmAssociatedCandidatesByEnter.rawValue, defaultValue: false) @AppProperty(key: UserDef.kAlsoConfirmAssociatedCandidatesByEnter.rawValue, defaultValue: false)
@ -160,16 +160,12 @@ import SwiftExtension
@AppProperty(key: UserDef.kTogglingAlphanumericalModeWithLShift.rawValue, defaultValue: true) @AppProperty(key: UserDef.kTogglingAlphanumericalModeWithLShift.rawValue, defaultValue: true)
public dynamic var togglingAlphanumericalModeWithLShift: Bool { public dynamic var togglingAlphanumericalModeWithLShift: Bool {
didSet { didSet { didAskForSyncingShiftKeyDetectorPrefs?() }
SessionCtl.theShiftKeyDetector.toggleWithLShift = togglingAlphanumericalModeWithLShift
}
} }
@AppProperty(key: UserDef.kTogglingAlphanumericalModeWithRShift.rawValue, defaultValue: true) @AppProperty(key: UserDef.kTogglingAlphanumericalModeWithRShift.rawValue, defaultValue: true)
public dynamic var togglingAlphanumericalModeWithRShift: Bool { public dynamic var togglingAlphanumericalModeWithRShift: Bool {
didSet { didSet { didAskForSyncingShiftKeyDetectorPrefs?() }
SessionCtl.theShiftKeyDetector.toggleWithRShift = togglingAlphanumericalModeWithRShift
}
} }
@AppProperty(key: UserDef.kConsolidateContextOnCandidateSelection.rawValue, defaultValue: true) @AppProperty(key: UserDef.kConsolidateContextOnCandidateSelection.rawValue, defaultValue: true)
@ -244,23 +240,17 @@ import SwiftExtension
@AppProperty(key: UserDef.kCNS11643Enabled.rawValue, defaultValue: false) @AppProperty(key: UserDef.kCNS11643Enabled.rawValue, defaultValue: false)
public dynamic var cns11643Enabled: Bool { public dynamic var cns11643Enabled: Bool {
didSet { didSet { didAskForSyncingLMPrefs?() }
LMMgr.syncLMPrefs()
}
} }
@AppProperty(key: UserDef.kSymbolInputEnabled.rawValue, defaultValue: true) @AppProperty(key: UserDef.kSymbolInputEnabled.rawValue, defaultValue: true)
public dynamic var symbolInputEnabled: Bool { public dynamic var symbolInputEnabled: Bool {
didSet { didSet { didAskForSyncingLMPrefs?() }
LMMgr.syncLMPrefs()
}
} }
@AppProperty(key: UserDef.kCassetteEnabled.rawValue, defaultValue: false) @AppProperty(key: UserDef.kCassetteEnabled.rawValue, defaultValue: false)
public dynamic var cassetteEnabled: Bool { public dynamic var cassetteEnabled: Bool {
didSet { didSet { didAskForSyncingLMPrefs?() }
LMMgr.syncLMPrefs()
}
} }
@AppProperty(key: UserDef.kChineseConversionEnabled.rawValue, defaultValue: false) @AppProperty(key: UserDef.kChineseConversionEnabled.rawValue, defaultValue: false)
@ -340,33 +330,17 @@ import SwiftExtension
@AppProperty(key: UserDef.kUseSCPCTypingMode.rawValue, defaultValue: false) @AppProperty(key: UserDef.kUseSCPCTypingMode.rawValue, defaultValue: false)
public dynamic var useSCPCTypingMode: Bool { public dynamic var useSCPCTypingMode: Bool {
didSet { didSet { didAskForSyncingLMPrefs?() }
LMMgr.syncLMPrefs()
}
} }
@AppProperty(key: UserDef.kPhraseReplacementEnabled.rawValue, defaultValue: false) @AppProperty(key: UserDef.kPhraseReplacementEnabled.rawValue, defaultValue: false)
public dynamic var phraseReplacementEnabled: Bool { public dynamic var phraseReplacementEnabled: Bool {
didSet { didSet { didAskForSyncingLMPrefs?() }
LMMgr.syncLMPrefs()
}
willSet {
if newValue {
LMMgr.loadUserPhraseReplacement()
}
}
} }
@AppProperty(key: UserDef.kAssociatedPhrasesEnabled.rawValue, defaultValue: false) @AppProperty(key: UserDef.kAssociatedPhrasesEnabled.rawValue, defaultValue: false)
public dynamic var associatedPhrasesEnabled: Bool { public dynamic var associatedPhrasesEnabled: Bool {
didSet { didSet { didAskForSyncingLMPrefs?() }
LMMgr.syncLMPrefs()
}
willSet {
if newValue {
LMMgr.loadUserAssociatesData()
}
}
} }
// MARK: - Keyboard HotKey Enable / Disable // MARK: - Keyboard HotKey Enable / Disable

View File

@ -7,22 +7,7 @@
// requirements defined in MIT License. // requirements defined in MIT License.
import InputMethodKit import InputMethodKit
import Shared
import SwiftExtension import SwiftExtension
import SwiftUI
// MARK: ObservableProject.
@available(macOS 10.15, *)
extension PrefMgr: ObservableObject {}
extension PrefMgr {
func sendObjWillChange() {
if #available(macOS 10.15, *) {
objectWillChange.send()
}
}
}
// MARK: Guarded Method for Validating Candidate Keys. // MARK: Guarded Method for Validating Candidate Keys.
@ -90,7 +75,7 @@ public extension PrefMgr {
public extension PrefMgr { public extension PrefMgr {
@discardableResult func dumpShellScriptBackup() -> String? { @discardableResult func dumpShellScriptBackup() -> String? {
let mirror = Mirror(reflecting: PrefMgr.shared) let mirror = Mirror(reflecting: self)
guard let bundleIdentifier = Bundle.main.bundleIdentifier else { return nil } guard let bundleIdentifier = Bundle.main.bundleIdentifier else { return nil }
let strDoubleDashLine = String(String(repeating: "=", count: 70)) let strDoubleDashLine = String(String(repeating: "=", count: 70))
let consoleOutput = NSMutableString(string: "#!/bin/sh\n\n") let consoleOutput = NSMutableString(string: "#!/bin/sh\n\n")

View File

@ -0,0 +1,18 @@
// (c) 2022 and onwards The vChewing Project (MIT-NTL License).
// ====================
// This code is released under the MIT license (SPDX-License-Identifier: MIT)
// ... with NTL restriction stating that:
// No trademark license is granted to use the trade names, trademarks, service
// marks, or product names of Contributor, except as required to fulfill notice
// requirements defined in MIT License.
@testable import Shared
import XCTest
final class SharedTests: XCTestCase {
func testDumpedPrefs() throws {
let prefs = PrefMgr()
let fetched = prefs.dumpShellScriptBackup() ?? ""
XCTAssertFalse(fetched.isEmpty)
}
}

View File

@ -10,6 +10,7 @@ import AppKit
import IMKUtils import IMKUtils
import InputMethodKit import InputMethodKit
import MainAssembly import MainAssembly
import Shared
import Uninstaller import Uninstaller
let cmdParameters = CommandLine.arguments.dropFirst(1) let cmdParameters = CommandLine.arguments.dropFirst(1)