fix: reload tint colors while running
This commit is contained in:
@@ -2,6 +2,7 @@ import AppKit
|
||||
|
||||
@MainActor
|
||||
final class ActionPill: NSView {
|
||||
private var themeObservation: ThemeObservation?
|
||||
init(primaryButton: NSButton, actionsButton: NSButton, primaryCommand: String? = nil) {
|
||||
super.init(frame: .zero)
|
||||
wantsLayer = true
|
||||
@@ -37,7 +38,46 @@ final class ActionPill: NSView {
|
||||
actionKeys.centerYAnchor.constraint(equalTo: centerYAnchor),
|
||||
actionKeys.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -12),
|
||||
])
|
||||
themeObservation = ThemeObservation { [weak self, weak primaryButton, weak actionsButton] in
|
||||
self?.layer?.borderColor = ThemePalette.accent.withAlphaComponent(0.35).cgColor
|
||||
self?.layer?.backgroundColor = ThemePalette.background.withAlphaComponent(0.25).cgColor
|
||||
primaryButton?.contentTintColor = ThemePalette.text
|
||||
actionsButton?.contentTintColor = ThemePalette.text
|
||||
}
|
||||
}
|
||||
|
||||
required init?(coder: NSCoder) { fatalError("Conjure creates action pills programmatically") }
|
||||
}
|
||||
|
||||
/// Keeps palette subscriptions scoped to the existing control's lifetime.
|
||||
@MainActor
|
||||
final class ThemeObservation {
|
||||
nonisolated(unsafe) private let token: NSObjectProtocol
|
||||
|
||||
init(_ apply: @escaping @MainActor () -> Void) {
|
||||
apply()
|
||||
token = NotificationCenter.default.addObserver(
|
||||
forName: ThemePalette.didChangeNotification, object: nil, queue: .main
|
||||
) { _ in
|
||||
MainActor.assumeIsolated { apply() }
|
||||
}
|
||||
}
|
||||
|
||||
deinit { NotificationCenter.default.removeObserver(token) }
|
||||
}
|
||||
|
||||
extension NSSearchField {
|
||||
/// Recolors the current presentation without changing the query or field-editor selection.
|
||||
func applyTheme() {
|
||||
textColor = ThemePalette.text
|
||||
if let placeholderAttributedString {
|
||||
let placeholder = NSMutableAttributedString(attributedString: placeholderAttributedString)
|
||||
placeholder.addAttribute(.foregroundColor, value: ThemePalette.secondaryText,
|
||||
range: NSRange(location: 0, length: placeholder.length))
|
||||
self.placeholderAttributedString = placeholder
|
||||
}
|
||||
if let editor = currentEditor() as? NSTextView {
|
||||
editor.textColor = ThemePalette.text
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user