From 5c667679d5e29678a3293cf467de39c5646c4478 Mon Sep 17 00:00:00 2001 From: neon443 <69979447+neon443@users.noreply.github.com> Date: Sun, 15 Jun 2025 15:34:08 +0100 Subject: [PATCH] fix "new edit event window" on mac not working - it would save events with the same id and modify the previous one if u opened another one add symbols to ios date picker looks better mac --- MacNearFuture/MacNearFutureApp.swift | 37 ++-- MacNearFuture/Views/ContentViewMac.swift | 7 +- MacNearFuture/Views/EventListViewMac.swift | 193 -------------------- NearFuture.xcodeproj/project.pbxproj | 2 - NearFuture/Views/Archive/ArchiveView.swift | 4 +- NearFuture/Views/ContentView.swift | 8 + NearFuture/Views/Events/AddEventView.swift | 10 +- NearFuture/Views/Events/EditEventView.swift | 5 +- NearFuture/Views/Home/EventListView.swift | 2 +- NearFuture/Views/Home/HomeView.swift | 5 +- 10 files changed, 45 insertions(+), 228 deletions(-) delete mode 100644 MacNearFuture/Views/EventListViewMac.swift diff --git a/MacNearFuture/MacNearFutureApp.swift b/MacNearFuture/MacNearFutureApp.swift index 0db9918..af93f59 100644 --- a/MacNearFuture/MacNearFutureApp.swift +++ b/MacNearFuture/MacNearFutureApp.swift @@ -32,23 +32,30 @@ struct NearFutureApp: App { } WindowGroup("Edit Event", for: Event.ID.self) { $eventID in - EditEventView( - viewModel: viewModel, - event: Binding( - get: { - viewModel.events.first(where: {$0.id == eventID}) ?? viewModel.template - }, - set: { newValue in - if let eventIndex = viewModel.events.firstIndex(where: { - $0.id == eventID - }) { - viewModel.events[eventIndex] = newValue - } - viewModel.saveEvents() - } + if viewModel.events.first(where: {$0.id == eventID}) == nil { + AddEventView( + viewModel: viewModel ) - ) + } else { + EditEventView( + viewModel: viewModel, + event: Binding( + get: { + viewModel.events.first(where: {$0.id == eventID}) ?? viewModel.template + }, + set: { newValue in + if let eventIndex = viewModel.events.firstIndex(where: { + $0.id == eventID + }) { + viewModel.events[eventIndex] = newValue + } + viewModel.saveEvents() + } + ) + ) + } } + .defaultSize(width: 480, height: 550) .windowIdealSize(.fitToContent) .restorationBehavior(.disabled) diff --git a/MacNearFuture/Views/ContentViewMac.swift b/MacNearFuture/Views/ContentViewMac.swift index 2859004..c8c40bf 100644 --- a/MacNearFuture/Views/ContentViewMac.swift +++ b/MacNearFuture/Views/ContentViewMac.swift @@ -65,9 +65,7 @@ struct ContentView: View { } .sheet(isPresented: $showAddEventView) { AddEventView( - viewModel: viewModel, - event: $viewModel.editableTemplate, - adding: true + viewModel: viewModel ) .presentationSizing(.page) } @@ -75,8 +73,7 @@ struct ContentView: View { Button() { showAddEventView.toggle() } label: { - Image(systemName: "plus") - Text("New") + Label("New", systemImage: "plus") } } } diff --git a/MacNearFuture/Views/EventListViewMac.swift b/MacNearFuture/Views/EventListViewMac.swift deleted file mode 100644 index ab12c44..0000000 --- a/MacNearFuture/Views/EventListViewMac.swift +++ /dev/null @@ -1,193 +0,0 @@ -// -// EventListView.swift -// MacNearFuture -// -// Created by neon443 on 21/05/2025. -// - -import SwiftUI - -struct EventListView: View { - @ObservedObject var viewModel: EventViewModel - @State var event: Event - - @State var largeTick: Bool = false - @State var hovering: Bool = false - - @State var completeInProgress: Bool = false - @State var completeStartTime: Date = .now - @State var progress: Double = 0 - @State var timer: Timer? - private let completeDuration: TimeInterval = 3.0 - @Environment(\.openWindow) var openWindow - - func startCompleting() { - NSHapticFeedbackManager.defaultPerformer.perform(.generic, performanceTime: .now) - completeInProgress = true - progress = 0 - completeStartTime = .now - - timer = Timer(timeInterval: 0.05, repeats: true) { timer in - let elapsed = Date().timeIntervalSince(completeStartTime) - progress = min(elapsed, 1.0) - - if progress >= 1.0 { - timer.invalidate() - viewModel.completeEvent(&event) - completeInProgress = false - } - } - RunLoop.main.add(timer!, forMode: .common) - } - var body: some View { - ZStack { - Color.black.opacity(hovering ? 0.5 : 0.0) - HStack { - RoundedRectangle(cornerRadius: 5) - .frame(width: 7) - .foregroundStyle( - event.color.color.opacity( - event.complete ? 0.5 : 1 - ) - ) - VStack(alignment: .leading) { - HStack { - Image(systemName: event.symbol) - .resizable() - .scaledToFit() - .frame(width: 20, height: 20) - .shadow(radius: 5) - .foregroundStyle( - .one.opacity( - event.complete ? 0.5 : 1 - ) - ) - Text("\(event.name)") - .bold() - .foregroundStyle(.one) - .strikethrough(event.complete) - .multilineTextAlignment(.leading) - } - if !event.notes.isEmpty { - Text(event.notes) - .foregroundStyle(.one.opacity(0.8)) - .multilineTextAlignment(.leading) - } - Text( - event.date.formatted( - date: .long, - time: .shortened - ) - ) - .foregroundStyle( - .one.opacity( - event.complete ? 0.5 : 1 - ) - ) - if event.recurrence != .none { - Text("Occurs \(event.recurrence.rawValue)") - .font(.subheadline) - .foregroundStyle( - .one.opacity(event.complete ? 0.5 : 1)) - } - } - Spacer() - VStack { - Text("\(daysUntilEvent(event.date).long)") - .multilineTextAlignment(.trailing) - .foregroundStyle(event.date.timeIntervalSinceNow < 0 ? .red : .one) - } - Button() { - startCompleting() - } label: { - if completeInProgress { - ZStack { - ProgressView(value: progress) - .progressViewStyle(.circular) - Image(systemName: "xmark") - .bold() - } - } else { - Image(systemName: event.complete ? "checkmark.circle.fill" : "circle") - .resizable().scaledToFit() - .foregroundStyle(event.complete ? .green : event.color.color) - .bold() - } - } - .onHover() { hovering in - withAnimation { - largeTick.toggle() - } - } - .buttonStyle(.borderless) - .scaleEffect( - completeInProgress ? 1 : - largeTick ? 1.5 : 1 - ) - .frame(maxWidth: 20) - .shadow(radius: 5) - .padding(.trailing, 15) - .animation( - .spring(response: 0.2, dampingFraction: 0.75, blendDuration: 2), - value: largeTick - ) - } - .transition(.opacity) - .fixedSize(horizontal: false, vertical: true) - } - .onHover { isHovering in - withAnimation { - hovering.toggle() - } - } - .onTapGesture { - openWindow(value: event.id) - } - .contextMenu() { - Button(role: .destructive) { - let eventToModify = viewModel.events.firstIndex() { currEvent in - currEvent.id == event.id - } - if let eventToModify = eventToModify { - viewModel.events.remove(at: eventToModify) - viewModel.saveEvents() - } - } label: { - Label("Delete", systemImage: "trash") - } - } - } -} - -#Preview("EventListView") { - let vm = dummyEventViewModel() - ZStack { - Color.black - VStack { - ForEach(0..<50) { _ in - Rectangle() - .foregroundStyle(randomColor().opacity(0.5)) - .padding(-10) - } - .ignoresSafeArea(.all) - .blur(radius: 5) - } - VStack { - ForEach(vm.events) { event in - EventListView( - viewModel: vm, - event: event - ) - } - } - .padding(.horizontal, 10) - } -} - - -#Preview { - EventListView( - viewModel: dummyEventViewModel(), - event: dummyEventViewModel().template - ) -} diff --git a/NearFuture.xcodeproj/project.pbxproj b/NearFuture.xcodeproj/project.pbxproj index b34967d..0960932 100644 --- a/NearFuture.xcodeproj/project.pbxproj +++ b/NearFuture.xcodeproj/project.pbxproj @@ -154,7 +154,6 @@ A979F6092D270AF00094C0B3 /* NearFutureWidgetsBundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NearFutureWidgetsBundle.swift; sourceTree = ""; }; A979F60B2D270AF00094C0B3 /* NearFutureWidgetsLiveActivity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NearFutureWidgetsLiveActivity.swift; sourceTree = ""; }; A979F60F2D270AF80094C0B3 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - A98C20CA2DE730740008D61C /* EventListViewMac.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventListViewMac.swift; sourceTree = ""; }; A98C20CD2DE7308E0008D61C /* ArchiveView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArchiveView.swift; sourceTree = ""; }; A98C20CF2DE731BD0008D61C /* HomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeView.swift; sourceTree = ""; }; A98C20D32DE7339E0008D61C /* AboutView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutView.swift; sourceTree = ""; }; @@ -215,7 +214,6 @@ children = ( A90D49332DDE0FAF00781124 /* ContentViewMac.swift */, A98C20CF2DE731BD0008D61C /* HomeView.swift */, - A98C20CA2DE730740008D61C /* EventListViewMac.swift */, A98C20CD2DE7308E0008D61C /* ArchiveView.swift */, A91EF80F2DFCB66C00B8463D /* SettingsView.swift */, ); diff --git a/NearFuture/Views/Archive/ArchiveView.swift b/NearFuture/Views/Archive/ArchiveView.swift index 0c752f7..f50473b 100644 --- a/NearFuture/Views/Archive/ArchiveView.swift +++ b/NearFuture/Views/Archive/ArchiveView.swift @@ -43,9 +43,7 @@ struct ArchiveView: View { } .sheet(isPresented: $showAddEvent) { AddEventView( - viewModel: viewModel, - event: $viewModel.editableTemplate, - adding: true + viewModel: viewModel ) } } diff --git a/NearFuture/Views/ContentView.swift b/NearFuture/Views/ContentView.swift index e00f1d9..25d7aaf 100644 --- a/NearFuture/Views/ContentView.swift +++ b/NearFuture/Views/ContentView.swift @@ -12,6 +12,7 @@ import SwiftData enum Tab { case home case archive + case symbols case stats case settings } @@ -33,6 +34,13 @@ struct ContentView: View { Label("Archive", systemImage: "tray.full") } .tag(Tab.archive) + SymbolsPicker( + selection: .constant("") + ) + .tabItem { + Label("Symbols", systemImage: "star.circle") + } + .tag(Tab.symbols) StatsView(viewModel: viewModel) // SymbolsPickerStoryboardUIViewRepresentable() .tabItem { diff --git a/NearFuture/Views/Events/AddEventView.swift b/NearFuture/Views/Events/AddEventView.swift index a17fa0f..9ba51d0 100644 --- a/NearFuture/Views/Events/AddEventView.swift +++ b/NearFuture/Views/Events/AddEventView.swift @@ -10,9 +10,9 @@ import SwiftUI struct AddEventView: View { @ObservedObject var viewModel: EventViewModel - @Binding var event: Event + @State var event: Event = dummyEventViewModel().template - @State var adding: Bool + @State var adding: Bool = true @State var showNeedsNameAlert: Bool = false @State var isSymbolPickerPresented: Bool = false @@ -93,6 +93,8 @@ struct AddEventView: View { DatePicker("", selection: $event.date, displayedComponents: .date) #if os(iOS) .datePickerStyle(.wheel) + #else + .datePickerStyle(.graphical) #endif Spacer() Button() { @@ -111,6 +113,9 @@ struct AddEventView: View { selection: $event.date, displayedComponents: .hourAndMinute ) + #if os(macOS) + .datePickerStyle(.stepperField) + #endif // re-ocurrence Picker Picker("Recurrence", selection: $event.recurrence) { @@ -197,7 +202,6 @@ struct AddEventView: View { .sheet(isPresented: .constant(true)) { AddEventView( viewModel: vm, - event: .constant(vm.template), adding: true ) } diff --git a/NearFuture/Views/Events/EditEventView.swift b/NearFuture/Views/Events/EditEventView.swift index bac7142..440d218 100644 --- a/NearFuture/Views/Events/EditEventView.swift +++ b/NearFuture/Views/Events/EditEventView.swift @@ -28,17 +28,18 @@ struct EditEventView: View { var body: some View { AddEventView( viewModel: viewModel, - event: $event, + event: event, adding: false //bc we editing existing event ) .navigationTitle("Edit Event") .toolbar { - ToolbarItem(/*placement: .topBarTrailing*/) { + ToolbarItem(placement: .confirmationAction) { Button() { saveEdits() } label: { Text("Done") .bold() + .foregroundStyle(.blue) } .disabled(event.name == "") } diff --git a/NearFuture/Views/Home/EventListView.swift b/NearFuture/Views/Home/EventListView.swift index 3b1397a..2077ea9 100644 --- a/NearFuture/Views/Home/EventListView.swift +++ b/NearFuture/Views/Home/EventListView.swift @@ -138,7 +138,7 @@ struct EventListView: View { } } .frame(maxWidth: 20) - .shadow(radius: 5) + .shadow(color: .one.opacity(0.2), radius: 2.5) .padding(.trailing, 15) .animation( .spring(response: 0.2, dampingFraction: 0.75, blendDuration: 2), diff --git a/NearFuture/Views/Home/HomeView.swift b/NearFuture/Views/Home/HomeView.swift index d105350..8649647 100644 --- a/NearFuture/Views/Home/HomeView.swift +++ b/NearFuture/Views/Home/HomeView.swift @@ -12,7 +12,6 @@ struct HomeView: View { @ObservedObject var viewModel: EventViewModel @ObservedObject var settingsModel: SettingsViewModel - @State private var event: Event = dummyEventViewModel().template @State private var showingAddEventView: Bool = false @State private var searchInput: String = "" @Environment(\.colorScheme) var appearance @@ -70,9 +69,7 @@ struct HomeView: View { .modifier(navigationInlineLarge()) .sheet(isPresented: $showingAddEventView) { AddEventView( - viewModel: viewModel, - event: $event, - adding: true //adding event + viewModel: viewModel ) } .toolbar {