@@ -33,29 +33,53 @@ public class ThemeManager: NSObject {
33
33
private override init ( ) {
34
34
super. init ( )
35
35
36
- // Initialize custom NSColor code (swizzle NSColor, if needed)
37
- NSColor . swizzleNSColor ( )
36
+ isEnabled = true
37
+ }
38
38
39
- // Observe and theme new windows (before being displayed onscreen)
40
- self . obj = NotificationCenter . default. addObserver ( forName: NSWindow . didUpdateNotification, object: nil , queue: nil ) { ( notification) in
41
- if let window = notification. object as? NSWindow {
42
- window. themeIfCompliantWithWindowThemePolicy ( )
43
- }
39
+ deinit {
40
+ isEnabled = false
41
+ }
42
+
43
+ /// Enables or disables ThemeKit functionality.
44
+ @objc public var isEnabled : Bool {
45
+ get {
46
+ return _isEnabled ?? false
44
47
}
48
+ set {
49
+ guard _isEnabled != newValue else { return }
50
+ _isEnabled = newValue
51
+
52
+ // enable
53
+ if newValue {
54
+ // Initialize custom NSColor code (swizzle NSColor, if needed - done only once)
55
+ NSColor . swizzleNSColor ( )
56
+
57
+ // Observe and theme new windows (before being displayed onscreen)
58
+ self . obj = NotificationCenter . default. addObserver ( forName: NSWindow . didUpdateNotification, object: nil , queue: nil ) { ( notification) in
59
+ if let window = notification. object as? NSWindow {
60
+ window. themeIfCompliantWithWindowThemePolicy ( )
61
+ }
62
+ }
45
63
46
- // Observe current theme on User Defaults
47
- NSUserDefaultsController . shared. addObserver ( self , forKeyPath: themeChangeKVOKeyPath, options: NSKeyValueObservingOptions ( rawValue: 0 ) , context: nil )
64
+ // Observe current theme on User Defaults
65
+ NSUserDefaultsController . shared. addObserver ( self , forKeyPath: themeChangeKVOKeyPath, options: NSKeyValueObservingOptions ( rawValue: 0 ) , context: nil )
48
66
49
- // Observe current system theme (macOS Apple Interface Theme)
50
- NotificationCenter . default. addObserver ( self , selector: #selector( systemThemeDidChange ( _: ) ) , name: . didChangeSystemTheme, object: nil )
51
- }
67
+ // Observe current system theme (macOS Apple Interface Theme)
68
+ NotificationCenter . default. addObserver ( self , selector: #selector( systemThemeDidChange ( _: ) ) , name: . didChangeSystemTheme, object: nil )
69
+ }
52
70
53
- deinit {
54
- if let object = self . obj {
55
- NotificationCenter . default. removeObserver ( object)
71
+ // disable
72
+ else {
73
+ if let object = self . obj {
74
+ NotificationCenter . default. removeObserver ( object)
75
+ }
76
+ NSUserDefaultsController . shared. removeObserver ( self , forKeyPath: themeChangeKVOKeyPath)
77
+ NotificationCenter . default. removeObserver ( self , name: . didChangeSystemTheme, object: nil )
78
+ }
56
79
}
57
- NSUserDefaultsController . shared. removeObserver ( self , forKeyPath: themeChangeKVOKeyPath)
58
80
}
81
+ /// Internal storage for `isEnabled` property.
82
+ private var _isEnabled : Bool ?
59
83
60
84
// MARK: -
61
85
// MARK: Themes
@@ -69,6 +93,8 @@ public class ThemeManager: NSObject {
69
93
return _theme ?? ThemeManager . defaultTheme
70
94
}
71
95
set ( newTheme) {
96
+ guard isEnabled else { return }
97
+
72
98
// Apply theme
73
99
if _theme == nil || newTheme. effectiveTheme != _theme! || newTheme. effectiveTheme. isUserTheme {
74
100
applyTheme ( newTheme)
@@ -208,6 +234,8 @@ public class ThemeManager: NSObject {
208
234
/// Get last applied theme from user defaults and load it. If no theme was
209
235
/// previously applied, load the default theme (`ThemeManager.defaultTheme`).
210
236
@objc public func applyLastOrDefaultTheme( ) {
237
+ guard isEnabled else { return }
238
+
211
239
let userDefaultsTheme = theme ( withIdentifier: UserDefaults . standard. string ( forKey: ThemeManager . userDefaultsThemeKey) )
212
240
( userDefaultsTheme ?? ThemeManager . defaultTheme) . apply ( )
213
241
}
@@ -444,6 +472,7 @@ public class ThemeManager: NSObject {
444
472
445
473
/// Apply a new `theme`.
446
474
private func applyTheme( _ newTheme: Theme ) {
475
+ guard isEnabled else { return }
447
476
448
477
// Make theme effective
449
478
func makeThemeEffective( _ newTheme: Theme ) {
0 commit comments