|
|
@@ -102,7 +102,15 @@ final class SettingsView: NSView {
|
|
102
|
102
|
picker.show(relativeTo: .zero, of: view, preferredEdge: .minY)
|
|
103
|
103
|
}
|
|
104
|
104
|
})
|
|
105
|
|
- card.addRow(SettingsThemeRow())
|
|
|
105
|
+ card.addRow(SettingsToggleRow(
|
|
|
106
|
+ symbolName: "moon.fill",
|
|
|
107
|
+ title: "Dark Mode",
|
|
|
108
|
+ isOn: AppSettings.darkModeEnabled,
|
|
|
109
|
+ isLast: true
|
|
|
110
|
+ ) { enabled in
|
|
|
111
|
+ AppSettings.darkModeEnabled = enabled
|
|
|
112
|
+ AppSettings.applyAppearance()
|
|
|
113
|
+ })
|
|
106
|
114
|
|
|
107
|
115
|
return card
|
|
108
|
116
|
}
|
|
|
@@ -323,22 +331,19 @@ private final class SettingsPopupRow: SettingsRowBase {
|
|
323
|
331
|
required init?(coder: NSCoder) { nil }
|
|
324
|
332
|
}
|
|
325
|
333
|
|
|
326
|
|
-private final class SettingsThemeRow: SettingsRowBase {
|
|
327
|
|
- private let segmentTarget: SegmentTarget
|
|
|
334
|
+private final class SettingsToggleRow: SettingsRowBase {
|
|
|
335
|
+ private let toggleTarget: ToggleTarget
|
|
328
|
336
|
|
|
329
|
|
- init() {
|
|
330
|
|
- segmentTarget = SegmentTarget()
|
|
331
|
|
- super.init(isLast: true)
|
|
332
|
|
-
|
|
333
|
|
- let segment = NSSegmentedControl(labels: AppThemePreference.allCases.map(\.title), trackingMode: .selectOne, target: segmentTarget, action: #selector(SegmentTarget.changed(_:)))
|
|
334
|
|
- segment.selectedSegment = AppSettings.appTheme.rawValue
|
|
335
|
|
- segmentTarget.handler = { index in
|
|
336
|
|
- if let theme = AppThemePreference(rawValue: index) {
|
|
337
|
|
- AppSettings.appTheme = theme
|
|
338
|
|
- }
|
|
339
|
|
- }
|
|
|
337
|
+ init(symbolName: String, title: String, isOn: Bool, isLast: Bool = false, onChange: @escaping (Bool) -> Void) {
|
|
|
338
|
+ toggleTarget = ToggleTarget(handler: onChange)
|
|
|
339
|
+ super.init(isLast: isLast)
|
|
340
|
340
|
|
|
341
|
|
- _ = install(icon: "circle.lefthalf.filled", title: "Theme", trailing: segment)
|
|
|
341
|
+ let toggle = NSSwitch()
|
|
|
342
|
+ toggle.state = isOn ? .on : .off
|
|
|
343
|
+ toggle.target = toggleTarget
|
|
|
344
|
+ toggle.action = #selector(ToggleTarget.changed(_:))
|
|
|
345
|
+
|
|
|
346
|
+ _ = install(icon: symbolName, title: title, trailing: toggle)
|
|
342
|
347
|
}
|
|
343
|
348
|
|
|
344
|
349
|
@available(*, unavailable)
|
|
|
@@ -380,11 +385,15 @@ private final class PopupTarget: NSObject {
|
|
380
|
385
|
}
|
|
381
|
386
|
}
|
|
382
|
387
|
|
|
383
|
|
-private final class SegmentTarget: NSObject {
|
|
384
|
|
- var handler: ((Int) -> Void)?
|
|
|
388
|
+private final class ToggleTarget: NSObject {
|
|
|
389
|
+ private let handler: (Bool) -> Void
|
|
|
390
|
+
|
|
|
391
|
+ init(handler: @escaping (Bool) -> Void) {
|
|
|
392
|
+ self.handler = handler
|
|
|
393
|
+ }
|
|
385
|
394
|
|
|
386
|
|
- @objc func changed(_ sender: NSSegmentedControl) {
|
|
387
|
|
- handler?(sender.selectedSegment)
|
|
|
395
|
+ @objc func changed(_ sender: NSSwitch) {
|
|
|
396
|
+ handler(sender.state == .on)
|
|
388
|
397
|
}
|
|
389
|
398
|
}
|
|
390
|
399
|
|