From b153d127a6ba4908bad788b31740a3e86f434e86 Mon Sep 17 00:00:00 2001 From: neon443 <69979447+neon443@users.noreply.github.com> Date: Wed, 21 May 2025 20:38:54 +0100 Subject: [PATCH] fix padding on the eventlistView extract settings to Settings.swift rename some files --- ...ContentView.swift => ContentViewMac.swift} | 1 - ...EventView.swift => EditEventViewMac.swift} | 0 ...tListView.swift => EventListViewMac.swift} | 3 +- NearFuture.xcodeproj/project.pbxproj | 56 ++++--- Shared/Model/{Event.swift => Events.swift} | 135 +---------------- Shared/Model/Settings.swift | 143 ++++++++++++++++++ 6 files changed, 179 insertions(+), 159 deletions(-) rename MacNearFuture/Views/{ContentView.swift => ContentViewMac.swift} (95%) rename MacNearFuture/Views/{EditEventView.swift => EditEventViewMac.swift} (100%) rename MacNearFuture/Views/{EventListView.swift => EventListViewMac.swift} (98%) rename Shared/Model/{Event.swift => Events.swift} (81%) create mode 100644 Shared/Model/Settings.swift diff --git a/MacNearFuture/Views/ContentView.swift b/MacNearFuture/Views/ContentViewMac.swift similarity index 95% rename from MacNearFuture/Views/ContentView.swift rename to MacNearFuture/Views/ContentViewMac.swift index b475e5c..e1f7a75 100644 --- a/MacNearFuture/Views/ContentView.swift +++ b/MacNearFuture/Views/ContentViewMac.swift @@ -16,7 +16,6 @@ struct ContentView: View { ForEach(viewModel.events) { event in EventListView(viewModel: viewModel, event: event) } - .padding(.trailing) } .scrollContentBackground(.hidden) } diff --git a/MacNearFuture/Views/EditEventView.swift b/MacNearFuture/Views/EditEventViewMac.swift similarity index 100% rename from MacNearFuture/Views/EditEventView.swift rename to MacNearFuture/Views/EditEventViewMac.swift diff --git a/MacNearFuture/Views/EventListView.swift b/MacNearFuture/Views/EventListViewMac.swift similarity index 98% rename from MacNearFuture/Views/EventListView.swift rename to MacNearFuture/Views/EventListViewMac.swift index eadd0fd..2398089 100644 --- a/MacNearFuture/Views/EventListView.swift +++ b/MacNearFuture/Views/EventListViewMac.swift @@ -69,6 +69,7 @@ struct EventListView: View { Spacer() VStack { Text("\(daysUntilEvent(event.date).long)") + .multilineTextAlignment(.trailing) .foregroundStyle(event.date.timeIntervalSinceNow < 0 ? .red : .one) } Button() { @@ -110,7 +111,7 @@ struct EventListView: View { .scaleEffect(largeTick ? 1.5 : 1) .frame(maxWidth: 20) .shadow(radius: 5) - .padding(.trailing, 5) + .padding(.trailing, 15) .animation( .spring(response: 0.2, dampingFraction: 0.75, blendDuration: 2), value: largeTick diff --git a/NearFuture.xcodeproj/project.pbxproj b/NearFuture.xcodeproj/project.pbxproj index 35ba0ec..cea6001 100644 --- a/NearFuture.xcodeproj/project.pbxproj +++ b/NearFuture.xcodeproj/project.pbxproj @@ -7,30 +7,33 @@ objects = { /* Begin PBXBuildFile section */ - A90D49382DDE0FAF00781124 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A90D49332DDE0FAF00781124 /* ContentView.swift */; }; + A90D49382DDE0FAF00781124 /* ContentViewMac.swift in Sources */ = {isa = PBXBuildFile; fileRef = A90D49332DDE0FAF00781124 /* ContentViewMac.swift */; }; A90D493D2DDE10B200781124 /* NearFutureIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = A949F8312DCAAA8A0064DCA0 /* NearFutureIcon.png */; }; A90D493E2DDE10CF00781124 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A920C28D2D24011A00E4F9B1 /* Assets.xcassets */; }; - A90D49422DDE114100781124 /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = A920C28B2D24011400E4F9B1 /* Event.swift */; }; + A90D49422DDE114100781124 /* Events.swift in Sources */ = {isa = PBXBuildFile; fileRef = A920C28B2D24011400E4F9B1 /* Events.swift */; }; A90D49442DDE1C7600781124 /* Tints.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A90D49432DDE1C1100781124 /* Tints.xcassets */; }; A90D49452DDE1C7600781124 /* Tints.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A90D49432DDE1C1100781124 /* Tints.xcassets */; }; A90D49462DDE1C7A00781124 /* Tints.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A90D49432DDE1C1100781124 /* Tints.xcassets */; }; A90D494B2DDE2C2900781124 /* AddEventView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A949F83C2DCAABE00064DCA0 /* AddEventView.swift */; }; - A90D494F2DDE2C8500781124 /* EditEventView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A90D494E2DDE2C8500781124 /* EditEventView.swift */; }; - A90D49502DDE2C8500781124 /* EditEventView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A90D494E2DDE2C8500781124 /* EditEventView.swift */; }; + A90D494F2DDE2C8500781124 /* EditEventViewMac.swift in Sources */ = {isa = PBXBuildFile; fileRef = A90D494E2DDE2C8500781124 /* EditEventViewMac.swift */; }; + A90D49502DDE2C8500781124 /* EditEventViewMac.swift in Sources */ = {isa = PBXBuildFile; fileRef = A90D494E2DDE2C8500781124 /* EditEventViewMac.swift */; }; A90D49522DDE2D0000781124 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A90D49512DDE2D0000781124 /* Extensions.swift */; }; A90D49532DDE2D0000781124 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A90D49512DDE2D0000781124 /* Extensions.swift */; }; A90D49562DDE2D5800781124 /* SFSymbolsPicker in Frameworks */ = {isa = PBXBuildFile; productRef = A90D49552DDE2D5800781124 /* SFSymbolsPicker */; }; - A90D49582DDE2DBD00781124 /* EventListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A90D49572DDE2DBD00781124 /* EventListView.swift */; }; - A90D49592DDE2DBD00781124 /* EventListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A90D49572DDE2DBD00781124 /* EventListView.swift */; }; + A90D49582DDE2DBD00781124 /* EventListViewMac.swift in Sources */ = {isa = PBXBuildFile; fileRef = A90D49572DDE2DBD00781124 /* EventListViewMac.swift */; }; + A90D49592DDE2DBD00781124 /* EventListViewMac.swift in Sources */ = {isa = PBXBuildFile; fileRef = A90D49572DDE2DBD00781124 /* EventListViewMac.swift */; }; A90D495B2DDE2EDB00781124 /* MacNearFutureApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = A90D495A2DDE2EDB00781124 /* MacNearFutureApp.swift */; }; A90D495C2DDE2EDB00781124 /* MacNearFutureApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = A90D495A2DDE2EDB00781124 /* MacNearFutureApp.swift */; }; A90D495E2DDE3C7400781124 /* NFCommands.swift in Sources */ = {isa = PBXBuildFile; fileRef = A90D495D2DDE3C7400781124 /* NFCommands.swift */; }; A90D495F2DDE3C7400781124 /* NFCommands.swift in Sources */ = {isa = PBXBuildFile; fileRef = A90D495D2DDE3C7400781124 /* NFCommands.swift */; }; + A90D49612DDE626300781124 /* Settings.swift in Sources */ = {isa = PBXBuildFile; fileRef = A90D49602DDE626300781124 /* Settings.swift */; }; + A90D49622DDE626300781124 /* Settings.swift in Sources */ = {isa = PBXBuildFile; fileRef = A90D49602DDE626300781124 /* Settings.swift */; }; + A90D49632DDE626300781124 /* Settings.swift in Sources */ = {isa = PBXBuildFile; fileRef = A90D49602DDE626300781124 /* Settings.swift */; }; A914FA4B2DD26C6800856265 /* HomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A914FA4A2DD26C0F00856265 /* HomeView.swift */; }; A914FA4D2DD2768900856265 /* WhatsNewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A914FA4C2DD2768900856265 /* WhatsNewView.swift */; }; A914FA4F2DD276D200856265 /* AboutView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A914FA4E2DD276D200856265 /* AboutView.swift */; }; A920C2882D24011400E4F9B1 /* NearFutureApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = A920C2872D24011400E4F9B1 /* NearFutureApp.swift */; }; - A920C28C2D24011400E4F9B1 /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = A920C28B2D24011400E4F9B1 /* Event.swift */; }; + A920C28C2D24011400E4F9B1 /* Events.swift in Sources */ = {isa = PBXBuildFile; fileRef = A920C28B2D24011400E4F9B1 /* Events.swift */; }; A920C28E2D24011A00E4F9B1 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A920C28D2D24011A00E4F9B1 /* Assets.xcassets */; }; A920C2922D24011A00E4F9B1 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A920C2912D24011A00E4F9B1 /* Preview Assets.xcassets */; }; A920C2BE2D24021A00E4F9B1 /* SFSymbolsPicker in Frameworks */ = {isa = PBXBuildFile; productRef = A920C2BD2D24021A00E4F9B1 /* SFSymbolsPicker */; }; @@ -51,7 +54,7 @@ A979F60C2D270AF00094C0B3 /* NearFutureWidgetsLiveActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = A979F60B2D270AF00094C0B3 /* NearFutureWidgetsLiveActivity.swift */; }; A979F6102D270AF90094C0B3 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A979F60F2D270AF80094C0B3 /* Assets.xcassets */; }; A979F6142D270AF90094C0B3 /* NearFutureWidgetsExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = A979F6022D270AF00094C0B3 /* NearFutureWidgetsExtension.appex */; platformFilter = ios; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - A979F6182D2714310094C0B3 /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = A920C28B2D24011400E4F9B1 /* Event.swift */; }; + A979F6182D2714310094C0B3 /* Events.swift in Sources */ = {isa = PBXBuildFile; fileRef = A920C28B2D24011400E4F9B1 /* Events.swift */; }; A9FC7EEA2D2823920020D75B /* NearFutureWidgets.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9FC7EE92D28238A0020D75B /* NearFutureWidgets.swift */; }; /* End PBXBuildFile section */ @@ -82,21 +85,22 @@ /* Begin PBXFileReference section */ A90D491F2DDE08E400781124 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; A90D49262DDE0FA400781124 /* Near Future.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Near Future.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - A90D49332DDE0FAF00781124 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + A90D49332DDE0FAF00781124 /* ContentViewMac.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentViewMac.swift; sourceTree = ""; }; A90D49342DDE0FAF00781124 /* MacNearFuture.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = MacNearFuture.entitlements; sourceTree = ""; }; A90D49432DDE1C1100781124 /* Tints.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Tints.xcassets; sourceTree = ""; }; - A90D494E2DDE2C8500781124 /* EditEventView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = EditEventView.swift; path = MacNearFuture/Views/EditEventView.swift; sourceTree = SOURCE_ROOT; }; + A90D494E2DDE2C8500781124 /* EditEventViewMac.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = EditEventViewMac.swift; path = MacNearFuture/Views/EditEventViewMac.swift; sourceTree = SOURCE_ROOT; }; A90D49512DDE2D0000781124 /* Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = ""; }; - A90D49572DDE2DBD00781124 /* EventListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventListView.swift; sourceTree = ""; }; + A90D49572DDE2DBD00781124 /* EventListViewMac.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventListViewMac.swift; sourceTree = ""; }; A90D495A2DDE2EDB00781124 /* MacNearFutureApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = MacNearFutureApp.swift; path = MacNearFuture/MacNearFutureApp.swift; sourceTree = SOURCE_ROOT; }; A90D495D2DDE3C7400781124 /* NFCommands.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NFCommands.swift; sourceTree = ""; }; + A90D49602DDE626300781124 /* Settings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Settings.swift; sourceTree = ""; }; A90FDE222DC0D4310012790C /* Config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Config.xcconfig; sourceTree = ""; }; A914FA4A2DD26C0F00856265 /* HomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeView.swift; sourceTree = ""; }; A914FA4C2DD2768900856265 /* WhatsNewView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = WhatsNewView.swift; path = NearFuture/Views/Settings/WhatsNewView.swift; sourceTree = SOURCE_ROOT; }; A914FA4E2DD276D200856265 /* AboutView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AboutView.swift; path = NearFuture/Views/Misc/AboutView.swift; sourceTree = SOURCE_ROOT; }; A920C2842D24011400E4F9B1 /* NearFuture.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NearFuture.app; sourceTree = BUILT_PRODUCTS_DIR; }; A920C2872D24011400E4F9B1 /* NearFutureApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NearFutureApp.swift; sourceTree = ""; }; - A920C28B2D24011400E4F9B1 /* Event.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Event.swift; sourceTree = ""; }; + A920C28B2D24011400E4F9B1 /* Events.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Events.swift; sourceTree = ""; }; A920C28D2D24011A00E4F9B1 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; A920C2912D24011A00E4F9B1 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; A949F82E2DCAAA640064DCA0 /* NearFutureIcon.pxd */ = {isa = PBXFileReference; lastKnownFileType = file; path = NearFutureIcon.pxd; sourceTree = ""; }; @@ -152,7 +156,8 @@ A90D49202DDE0A3B00781124 /* Model */ = { isa = PBXGroup; children = ( - A920C28B2D24011400E4F9B1 /* Event.swift */, + A920C28B2D24011400E4F9B1 /* Events.swift */, + A90D49602DDE626300781124 /* Settings.swift */, ); path = Model; sourceTree = ""; @@ -171,9 +176,9 @@ A90D493F2DDE10EC00781124 /* Views */ = { isa = PBXGroup; children = ( - A90D49332DDE0FAF00781124 /* ContentView.swift */, - A90D49572DDE2DBD00781124 /* EventListView.swift */, - A90D494E2DDE2C8500781124 /* EditEventView.swift */, + A90D49332DDE0FAF00781124 /* ContentViewMac.swift */, + A90D49572DDE2DBD00781124 /* EventListViewMac.swift */, + A90D494E2DDE2C8500781124 /* EditEventViewMac.swift */, ); path = Views; sourceTree = ""; @@ -480,10 +485,11 @@ A90D495E2DDE3C7400781124 /* NFCommands.swift in Sources */, A90D495B2DDE2EDB00781124 /* MacNearFutureApp.swift in Sources */, A90D49522DDE2D0000781124 /* Extensions.swift in Sources */, - A90D49422DDE114100781124 /* Event.swift in Sources */, - A90D49382DDE0FAF00781124 /* ContentView.swift in Sources */, - A90D494F2DDE2C8500781124 /* EditEventView.swift in Sources */, - A90D49582DDE2DBD00781124 /* EventListView.swift in Sources */, + A90D49422DDE114100781124 /* Events.swift in Sources */, + A90D49382DDE0FAF00781124 /* ContentViewMac.swift in Sources */, + A90D49622DDE626300781124 /* Settings.swift in Sources */, + A90D494F2DDE2C8500781124 /* EditEventViewMac.swift in Sources */, + A90D49582DDE2DBD00781124 /* EventListViewMac.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -491,14 +497,15 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - A920C28C2D24011400E4F9B1 /* Event.swift in Sources */, + A920C28C2D24011400E4F9B1 /* Events.swift in Sources */, A949F84B2DCAABE00064DCA0 /* ArchiveView.swift in Sources */, A914FA4F2DD276D200856265 /* AboutView.swift in Sources */, A949F84C2DCAABE00064DCA0 /* AddEventView.swift in Sources */, A914FA4B2DD26C6800856265 /* HomeView.swift in Sources */, - A90D49502DDE2C8500781124 /* EditEventView.swift in Sources */, + A90D49502DDE2C8500781124 /* EditEventViewMac.swift in Sources */, A949F84D2DCAABE00064DCA0 /* EditEventView.swift in Sources */, A949F84E2DCAABE00064DCA0 /* ContentView.swift in Sources */, + A90D49612DDE626300781124 /* Settings.swift in Sources */, A90D495C2DDE2EDB00781124 /* MacNearFutureApp.swift in Sources */, A90D495F2DDE3C7400781124 /* NFCommands.swift in Sources */, A949F84F2DCAABE00064DCA0 /* EventListView.swift in Sources */, @@ -508,7 +515,7 @@ A949F8512DCAABE00064DCA0 /* ExportView.swift in Sources */, A90D49532DDE2D0000781124 /* Extensions.swift in Sources */, A949F8522DCAABE00064DCA0 /* iCloudSettingsView.swift in Sources */, - A90D49592DDE2DBD00781124 /* EventListView.swift in Sources */, + A90D49592DDE2DBD00781124 /* EventListViewMac.swift in Sources */, A949F8532DCAABE00064DCA0 /* ImportView.swift in Sources */, A949F8542DCAABE00064DCA0 /* SettingsView.swift in Sources */, A949F8552DCAABE00064DCA0 /* StatsView.swift in Sources */, @@ -520,10 +527,11 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - A979F6182D2714310094C0B3 /* Event.swift in Sources */, + A979F6182D2714310094C0B3 /* Events.swift in Sources */, A979F60A2D270AF00094C0B3 /* NearFutureWidgetsBundle.swift in Sources */, A9FC7EEA2D2823920020D75B /* NearFutureWidgets.swift in Sources */, A979F60C2D270AF00094C0B3 /* NearFutureWidgetsLiveActivity.swift in Sources */, + A90D49632DDE626300781124 /* Settings.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Shared/Model/Event.swift b/Shared/Model/Events.swift similarity index 81% rename from Shared/Model/Event.swift rename to Shared/Model/Events.swift index 9608cbc..70f1a0f 100644 --- a/Shared/Model/Event.swift +++ b/Shared/Model/Events.swift @@ -120,149 +120,18 @@ func daysUntilEvent(_ eventDate: Date) -> (long: String, short: String) { if days < 0 { //past return ( - "\(-days) day\(plu(days)) ago", + "\(-days)\nday\(plu(days)) ago", "\(days)d" ) } else { //future return ( - "\(days) day\(plu(days))", + "\(days)\nday\(plu(days))", "\(days)d" ) } } -struct NFSettings: Codable, Equatable { - var showCompletedInHome: Bool - var tint: ColorCodable - var showWhatsNew: Bool - var prevAppVersion: String -} - -class AccentIcon { - #if canImport(UIKit) - var icon: UIImage - #elseif canImport(AppKit) - var icon: NSImage - #endif - var color: Color - var name: String - - init(_ colorName: String) { - #if canImport(UIKit) - self.icon = UIImage(named: "AppIcon")! - self.color = Color(uiColor: UIColor(named: "uiColors/\(colorName)")!) - #elseif canImport(AppKit) - self.icon = NSImage(imageLiteralResourceName: "AppIcon") - self.color = Color(nsColor: NSColor(named: "uiColors/\(colorName)")!) - #endif - - self.name = colorName - - if colorName != "orange" { - setSelfIcon(to: colorName) - } - } - - func setSelfIcon(to name: String) { - #if canImport(UIKit) - self.icon = UIImage(named: name)! - #elseif canImport(AppKit) - self.icon = NSImage(imageLiteralResourceName: name) - #endif - } -} - -class SettingsViewModel: ObservableObject { -#if canImport(UIKit) - @Published var settings: Settings = Settings( - showCompletedInHome: false, - tint: ColorCodable(uiColor: UIColor(named: "AccentColor")!), - showWhatsNew: true, - prevAppVersion: getVersion()+getBuildID() - ) -#elseif canImport(AppKit) - @Published var settings: NFSettings = NFSettings( - showCompletedInHome: false, - tint: ColorCodable(nsColor: NSColor(named: "AccentColor")!), - showWhatsNew: true, - prevAppVersion: getVersion()+getBuildID() - ) -#endif - - @Published var notifsGranted: Bool = false - - @Published var colorChoices: [AccentIcon] = [] - - let accentChoices: [String] = [ - "red", - "orange", - "yellow", - "green", - "blue", - "bloo", - "purple", - "pink" - ] - - @Published var device: (sf: String, label: String) - - init(load: Bool = true) { - self.device = getDevice() - if load { - loadSettings() - Task { - let requestResult = await requestNotifs() - await MainActor.run { - self.notifsGranted = requestResult - } - } - } - } - - func changeTint(to: String) { -#if canImport(UIKit) - if let uicolor = UIColor(named: "uiColors/\(to)") { - self.settings.tint = ColorCodable(uiColor: uicolor) - saveSettings() - } -#elseif canImport(AppKit) - if let nscolor = NSColor(named: "uiColors/\(to)") { - self.settings.tint = ColorCodable(nsColor: nscolor) - } -#endif - } - - 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(NFSettings.self, from: icSettings) { - self.settings = decodedSetts - } - } else if let savedData = appGroupSettingsStore.data(forKey: "settings") { - if let decodedSetts = try? decoder.decode(NFSettings.self, from: savedData) { - self.settings = decodedSetts - } - } - if self.settings.prevAppVersion != getVersion()+getBuildID() { - self.settings.showWhatsNew = true - } - } - - func saveSettings() { - let encoder = JSONEncoder() - if let encoded = try? encoder.encode(settings) { - appGroupSettingsStore.set(encoded, forKey: "settings") - icSettStore.set(encoded, forKey: "settings") - icSettStore.synchronize() - loadSettings() - } - } -} - class EventViewModel: ObservableObject, @unchecked Sendable { @Published var events: [Event] = [] @Published var icloudData: [Event] = [] diff --git a/Shared/Model/Settings.swift b/Shared/Model/Settings.swift new file mode 100644 index 0000000..2c1ae9a --- /dev/null +++ b/Shared/Model/Settings.swift @@ -0,0 +1,143 @@ +// +// Settings.swift +// MacNearFuture +// +// Created by neon443 on 21/05/2025. +// + +import Foundation +import SwiftUI +#if canImport(AppKit) +import AppKit +#endif + +struct NFSettings: Codable, Equatable { + var showCompletedInHome: Bool + var tint: ColorCodable + var showWhatsNew: Bool + var prevAppVersion: String +} + +class AccentIcon { +#if canImport(UIKit) + var icon: UIImage +#elseif canImport(AppKit) + var icon: NSImage +#endif + var color: Color + var name: String + + init(_ colorName: String) { +#if canImport(UIKit) + self.icon = UIImage(named: "AppIcon")! + self.color = Color(uiColor: UIColor(named: "uiColors/\(colorName)")!) +#elseif canImport(AppKit) + self.icon = NSImage(imageLiteralResourceName: "AppIcon") + self.color = Color(nsColor: NSColor(named: "uiColors/\(colorName)")!) +#endif + + self.name = colorName + + if colorName != "orange" { + setSelfIcon(to: colorName) + } + } + + func setSelfIcon(to name: String) { +#if canImport(UIKit) + self.icon = UIImage(named: name)! +#elseif canImport(AppKit) + self.icon = NSImage(imageLiteralResourceName: name) +#endif + } +} + +class SettingsViewModel: ObservableObject { +#if canImport(UIKit) + @Published var settings: Settings = Settings( + showCompletedInHome: false, + tint: ColorCodable(uiColor: UIColor(named: "AccentColor")!), + showWhatsNew: true, + prevAppVersion: getVersion()+getBuildID() + ) +#elseif canImport(AppKit) + @Published var settings: NFSettings = NFSettings( + showCompletedInHome: false, + tint: ColorCodable(nsColor: NSColor(named: "AccentColor")!), + showWhatsNew: true, + prevAppVersion: getVersion()+getBuildID() + ) +#endif + + @Published var notifsGranted: Bool = false + + @Published var colorChoices: [AccentIcon] = [] + + let accentChoices: [String] = [ + "red", + "orange", + "yellow", + "green", + "blue", + "bloo", + "purple", + "pink" + ] + + @Published var device: (sf: String, label: String) + + init(load: Bool = true) { + self.device = getDevice() + if load { + loadSettings() + Task { + let requestResult = await requestNotifs() + await MainActor.run { + self.notifsGranted = requestResult + } + } + } + } + + func changeTint(to: String) { +#if canImport(UIKit) + if let uicolor = UIColor(named: "uiColors/\(to)") { + self.settings.tint = ColorCodable(uiColor: uicolor) + saveSettings() + } +#elseif canImport(AppKit) + if let nscolor = NSColor(named: "uiColors/\(to)") { + self.settings.tint = ColorCodable(nsColor: nscolor) + } +#endif + } + + 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(NFSettings.self, from: icSettings) { + self.settings = decodedSetts + } + } else if let savedData = appGroupSettingsStore.data(forKey: "settings") { + if let decodedSetts = try? decoder.decode(NFSettings.self, from: savedData) { + self.settings = decodedSetts + } + } + if self.settings.prevAppVersion != getVersion()+getBuildID() { + self.settings.showWhatsNew = true + } + } + + func saveSettings() { + let encoder = JSONEncoder() + if let encoded = try? encoder.encode(settings) { + appGroupSettingsStore.set(encoded, forKey: "settings") + icSettStore.set(encoded, forKey: "settings") + icSettStore.synchronize() + loadSettings() + } + } +}