From f03ea73813744e409d3c1bd380e3dc9fd86def7c Mon Sep 17 00:00:00 2001 From: neon443 <69979447+neon443@users.noreply.github.com> Date: Mon, 5 May 2025 09:57:58 +0100 Subject: [PATCH] basic settings done!!! now can set accent color --- NearFuture/ContentView.swift | 8 +++++-- NearFuture/Item.swift | 40 ++++++++++++++++++++++++++++++++++ NearFuture/NearFutureApp.swift | 8 +++++-- NearFuture/SettingsView.swift | 27 ++++++++++++++++++++++- 4 files changed, 78 insertions(+), 5 deletions(-) diff --git a/NearFuture/ContentView.swift b/NearFuture/ContentView.swift index 15f5cc4..f8f92ba 100644 --- a/NearFuture/ContentView.swift +++ b/NearFuture/ContentView.swift @@ -21,6 +21,7 @@ enum Tab { struct ContentView: View { @StateObject var viewModel: EventViewModel + @StateObject var settingsModel: SettingsViewModel @State private var eventName = "" @State private var eventComplete = false @State private var eventCompleteDesc = "" @@ -140,7 +141,7 @@ struct ContentView: View { Label("Statistics", systemImage: "chart.pie") } .focused($focusedTab, equals: Tab.Statistics) - SettingsView(viewModel: viewModel) + SettingsView(viewModel: viewModel, settingsModel: settingsModel) .tabItem { Label("Settings", systemImage: "gear") } @@ -150,7 +151,10 @@ struct ContentView: View { } #Preview { - ContentView(viewModel: dummyEventViewModel()) + ContentView( + viewModel: dummyEventViewModel(), + settingsModel: dummySettingsViewModel() + ) } struct SearchBar: View { diff --git a/NearFuture/Item.swift b/NearFuture/Item.swift index 757a227..e26a3af 100644 --- a/NearFuture/Item.swift +++ b/NearFuture/Item.swift @@ -96,6 +96,40 @@ func daysUntilEvent(_ eventDate: Date) -> (long: String, short: String) { } } +struct Settings: Codable, Equatable { + var showCompletedInHome: Bool + var tint: ColorCodable +} + +class SettingsViewModel: ObservableObject { + @Published var settings: Settings = Settings( + showCompletedInHome: false, + tint: ColorCodable(.blue) + ) + + init(load: Bool = true) { + if load { + loadSettings() + } + } + + let appGroupSettingsStore = UserDefaults(suiteName: "group.NearFuture") ?? UserDefaults.standard + let icSettStore = NSUbiquitousKeyValueStore.default + + func loadSettings() { + let decoder = JSONDecoder() + if let icSettings = icSettStore.data(forKey: "settings") { + if let decodedSetts = try? decoder.decode(Settings.self, from: icSettings) { + self.settings = decodedSetts + } + } else if let savedData = appGroupSettingsStore.data(forKey: "settings") { + if let decodedSetts = try? decoder.decode(Settings.self, from: savedData) { + self.settings = decodedSetts + } + } + } +} + class EventViewModel: ObservableObject { @Published var events: [Event] = [] @Published var icloudData: [Event] = [] @@ -308,6 +342,12 @@ class dummyEventViewModel: EventViewModel { } } +class dummySettingsViewModel: SettingsViewModel { + override init(load: Bool = false) { + super.init(load: false) + } +} + func describeOccurrence(date: Date, recurrence: Event.RecurrenceType) -> String { let dateString = date.formatted(date: .long, time: .omitted) let recurrenceDescription: String diff --git a/NearFuture/NearFutureApp.swift b/NearFuture/NearFutureApp.swift index 35e6105..50fa06e 100644 --- a/NearFuture/NearFutureApp.swift +++ b/NearFuture/NearFutureApp.swift @@ -22,10 +22,14 @@ struct NearFutureApp: App { // fatalError("Could not create ModelContainer: \(error)") // } // }() - + @StateObject var settingsModel: SettingsViewModel = SettingsViewModel() var body: some Scene { WindowGroup { - ContentView(viewModel: EventViewModel()) + ContentView( + viewModel: EventViewModel(), + settingsModel: settingsModel + ) + .tint(settingsModel.settings.tint.color) } // .modelContainer(sharedModelContainer) } diff --git a/NearFuture/SettingsView.swift b/NearFuture/SettingsView.swift index 896ff72..4acdf1c 100644 --- a/NearFuture/SettingsView.swift +++ b/NearFuture/SettingsView.swift @@ -9,6 +9,7 @@ import SwiftUI struct SettingsView: View { @ObservedObject var viewModel: EventViewModel + @ObservedObject var settingsModel: SettingsViewModel @State private var hasUbiquitous: Bool = false @State private var lastSyncWasSuccessful: Bool = false @@ -38,12 +39,33 @@ struct SettingsView: View { return .red } } + let rainbow = [ + Color.red, + Color.orange, + Color.yellow, + Color.green, + Color.blue, + Color.indigo, + Color.purple + ] var body: some View { NavigationStack { ZStack { backgroundGradient List { + ScrollView(.horizontal) { + HStack { + ForEach(rainbow, id: \.self) { color in + Button() { + settingsModel.settings.tint.colorBind = color + } label: { + Circle() + .foregroundStyle(color) + } + } + } + } NavigationLink() { iCloudSettingsView( viewModel: viewModel, @@ -121,5 +143,8 @@ struct SettingsView: View { } #Preview { - SettingsView(viewModel: dummyEventViewModel()) + SettingsView( + viewModel: dummyEventViewModel(), + settingsModel: dummySettingsViewModel() + ) }