106 lines
2.3 KiB
Swift
106 lines
2.3 KiB
Swift
//
|
|
// MAThemeManager.swift
|
|
// Mobile Music Assistant
|
|
//
|
|
// Created by Sven Hanold on 26.03.26.
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
@Observable
|
|
class MAThemeManager {
|
|
var colorScheme: AppColorScheme {
|
|
didSet {
|
|
UserDefaults.standard.set(colorScheme.rawValue, forKey: "appColorScheme")
|
|
}
|
|
}
|
|
|
|
init() {
|
|
let savedValue = UserDefaults.standard.string(forKey: "appColorScheme") ?? "dark"
|
|
colorScheme = AppColorScheme(rawValue: savedValue) ?? .dark
|
|
}
|
|
|
|
var preferredColorScheme: ColorScheme? {
|
|
switch colorScheme {
|
|
case .system:
|
|
return nil
|
|
case .light:
|
|
return .light
|
|
case .dark:
|
|
return .dark
|
|
}
|
|
}
|
|
}
|
|
|
|
enum AppColorScheme: String, CaseIterable, Identifiable {
|
|
case system = "system"
|
|
case light = "light"
|
|
case dark = "dark"
|
|
|
|
var id: String { rawValue }
|
|
|
|
var displayName: String {
|
|
switch self {
|
|
case .system:
|
|
return "System"
|
|
case .light:
|
|
return "Light"
|
|
case .dark:
|
|
return "Dark"
|
|
}
|
|
}
|
|
|
|
var description: String {
|
|
switch self {
|
|
case .system:
|
|
return "Follows your device's appearance"
|
|
case .light:
|
|
return "Always use light mode"
|
|
case .dark:
|
|
return "Always use dark mode"
|
|
}
|
|
}
|
|
|
|
var icon: String {
|
|
switch self {
|
|
case .system:
|
|
return "circle.lefthalf.filled"
|
|
case .light:
|
|
return "sun.max.fill"
|
|
case .dark:
|
|
return "moon.fill"
|
|
}
|
|
}
|
|
}
|
|
|
|
// MARK: - Environment Key
|
|
|
|
private struct ThemeManagerKey: EnvironmentKey {
|
|
static let defaultValue = MAThemeManager()
|
|
}
|
|
|
|
extension EnvironmentValues {
|
|
var themeManager: MAThemeManager {
|
|
get { self[ThemeManagerKey.self] }
|
|
set { self[ThemeManagerKey.self] = newValue }
|
|
}
|
|
}
|
|
// MARK: - Theme Applied Modifier
|
|
|
|
struct ThemeAppliedModifier: ViewModifier {
|
|
@Environment(\.themeManager) var themeManager
|
|
|
|
func body(content: Content) -> some View {
|
|
content
|
|
.preferredColorScheme(themeManager.preferredColorScheme)
|
|
.id(themeManager.colorScheme) // Force refresh when theme changes
|
|
}
|
|
}
|
|
|
|
extension View {
|
|
func applyTheme() -> some View {
|
|
modifier(ThemeAppliedModifier())
|
|
}
|
|
}
|
|
|