Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions Sources/Heard/MTApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -89,15 +89,15 @@ struct HeardApp: App {
var body: some Scene {
MenuBarExtra {
MenuBarView(model: appModel)
.preferredColorScheme(appModel.settingsStore.settings.appearance.colorScheme)
.heardAppearance(appModel.settingsStore.settings.appearance)
} label: {
MenuBarIcon(model: appModel)
}
.menuBarExtraStyle(.window)

Window("Heard Settings", id: "settings") {
SettingsView(model: appModel)
.preferredColorScheme(appModel.settingsStore.settings.appearance.colorScheme)
.heardAppearance(appModel.settingsStore.settings.appearance)
.onAppear { WindowActivationCoordinator.begin("settings") }
.onDisappear { WindowActivationCoordinator.end("settings") }
}
Expand All @@ -106,7 +106,7 @@ struct HeardApp: App {

Window("Name Speakers", id: "speaker-naming") {
SpeakerNamingView(model: appModel)
.preferredColorScheme(appModel.settingsStore.settings.appearance.colorScheme)
.heardAppearance(appModel.settingsStore.settings.appearance)
.onAppear { WindowActivationCoordinator.begin("speaker-naming") }
.onDisappear {
WindowActivationCoordinator.end("speaker-naming")
Expand Down
36 changes: 35 additions & 1 deletion Sources/HeardCore/Views.swift
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,41 @@ public extension AppAppearance {
}
}

// MARK: - Appearance Modifier

private struct AppearanceModifier: ViewModifier {
let appearance: AppAppearance
@State private var systemIsDark = NSApp.effectiveAppearance.bestMatch(from: [.darkAqua, .aqua]) == .darkAqua

func body(content: Content) -> some View {
content
.preferredColorScheme(resolvedScheme)
.onReceive(
DistributedNotificationCenter.default()
.publisher(for: NSNotification.Name("AppleInterfaceThemeChangedNotification"))
) { _ in
// Short delay: effectiveAppearance may not yet reflect the change
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
systemIsDark = NSApp.effectiveAppearance.bestMatch(from: [.darkAqua, .aqua]) == .darkAqua
}
}
}

private var resolvedScheme: ColorScheme? {
switch appearance {
case .system: systemIsDark ? .dark : .light
case .light: .light
case .dark: .dark
}
}
}

public extension View {
func heardAppearance(_ appearance: AppAppearance) -> some View {
modifier(AppearanceModifier(appearance: appearance))
}
}

// MARK: - Theme

enum HeardTheme {
Expand Down Expand Up @@ -2150,7 +2185,6 @@ public struct SpeakerNamingView: View {
}
.frame(width: 560)
.background(HeardTheme.Paper.bg)
.preferredColorScheme(.light)
.onAppear { startCountdown() }
.onDisappear {
stopAudio()
Expand Down
Loading