made events update propery when changing on ios

update animations on adding and removing events
fix symbolpicker crash on fast scroll by making it not show all the symbols lol
might be ready to ship?
This commit is contained in:
neon443
2025-06-19 09:37:15 +01:00
parent 2b25ddf9b3
commit 3ee22da036
8 changed files with 49 additions and 27 deletions

View File

@@ -19,6 +19,14 @@ struct ArchiveView: View {
ScrollView { ScrollView {
ForEach(filteredEvents) { event in ForEach(filteredEvents) { event in
EventListView(viewModel: viewModel, event: event) EventListView(viewModel: viewModel, event: event)
.contextMenu() {
Button(role: .destructive) {
viewModel.removeEvent(event)
} label: {
Label("Delete", systemImage: "trash")
.tint(.red )
}
}
} }
} }
.scrollContentBackground(.hidden) .scrollContentBackground(.hidden)

View File

@@ -34,6 +34,14 @@ struct HomeView: View {
if filteredEvents.contains(event) { if filteredEvents.contains(event) {
EventListView(viewModel: viewModel, event: event) EventListView(viewModel: viewModel, event: event)
.id(event) .id(event)
.contextMenu() {
Button(role: .destructive) {
viewModel.removeEvent(event)
} label: {
Label("Delete", systemImage: "trash")
.tint(.red)
}
}
} }
} }
} }

View File

@@ -35,9 +35,17 @@ struct ArchiveView: View {
) )
} label: { } label: {
EventListView(viewModel: viewModel, event: event) EventListView(viewModel: viewModel, event: event)
.id(event.complete) .id(event)
} }
.transition(.moveAndFadeReversed) .transition(.moveAndFadeReversed)
.contextMenu() {
Button(role: .destructive) {
viewModel.removeEvent(event)
} label: {
Label("Delete", systemImage: "trash")
.tint(.red)
}
}
} }
.padding(.horizontal) .padding(.horizontal)
} }

View File

@@ -90,19 +90,6 @@ struct EventListView: View {
.onTapGesture { .onTapGesture {
openWindow(value: event.id) 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")
}
}
} }
#else #else
var body: some View { var body: some View {
@@ -176,13 +163,6 @@ struct EventListView: View {
) )
.clipShape(RoundedRectangle(cornerRadius: 15)) .clipShape(RoundedRectangle(cornerRadius: 15))
.fixedSize(horizontal: false, vertical: true) .fixedSize(horizontal: false, vertical: true)
.contextMenu() {
Button(role: .destructive) {
viewModel.removeEvent(event)
} label: {
Label("Delete", systemImage: "trash")
}
}
.swipeActions(edge: .trailing, allowsFullSwipe: true) { .swipeActions(edge: .trailing, allowsFullSwipe: true) {
Button(role: .destructive) { Button(role: .destructive) {
viewModel.removeEvent(event) viewModel.removeEvent(event)

View File

@@ -59,9 +59,17 @@ struct HomeView: View {
) )
} label: { } label: {
EventListView(viewModel: viewModel, event: event) EventListView(viewModel: viewModel, event: event)
.id(event.complete) .id(event)
} }
.transition(.moveAndFade) .transition(.moveAndFade)
.contextMenu() {
Button(role: .destructive) {
viewModel.removeEvent(event)
} label: {
Label("Delete", systemImage: "trash")
.tint(.red)
}
}
} }
.padding(.horizontal) .padding(.horizontal)
// } // }

View File

@@ -22,14 +22,14 @@ extension View {
extension AnyTransition { extension AnyTransition {
static var moveAndFade: AnyTransition { static var moveAndFade: AnyTransition {
.asymmetric( .asymmetric(
insertion: .move(edge: .leading), insertion: .opacity,
removal: .move(edge: .trailing) removal: .move(edge: .trailing)
) )
.combined(with: .opacity) .combined(with: .opacity)
} }
static var moveAndFadeReversed: AnyTransition { static var moveAndFadeReversed: AnyTransition {
.asymmetric( .asymmetric(
insertion: .move(edge: .trailing), insertion: .opacity,
removal: .move(edge: .leading) removal: .move(edge: .leading)
) )
.combined(with: .opacity) .combined(with: .opacity)

View File

@@ -8,7 +8,7 @@
import Foundation import Foundation
class SymbolsLoader: ObservableObject { class SymbolsLoader: ObservableObject {
@Published var allSymbols: [String] = [] private var allSymbols: [String] = []
init() { init() {
self.allSymbols = getAllSymbols() self.allSymbols = getAllSymbols()
@@ -16,7 +16,7 @@ class SymbolsLoader: ObservableObject {
func getSymbols(_ searched: String) -> [String] { func getSymbols(_ searched: String) -> [String] {
if searched.isEmpty { if searched.isEmpty {
return allSymbols return []
} else { } else {
return allSymbols.filter() { $0.localizedCaseInsensitiveContains(searched) } return allSymbols.filter() { $0.localizedCaseInsensitiveContains(searched) }
} }

View File

@@ -31,7 +31,17 @@ struct SymbolsPicker: View {
NavigationStack { NavigationStack {
GeometryReader { geo in GeometryReader { geo in
ScrollView { ScrollView {
if symbols.isEmpty { if searchInput.isEmpty {
HStack {
Image(systemName: "magnifyingglass")
.resizable().scaledToFit()
.frame(width: 30)
Text("Start a Search")
.font(.title)
.bold()
}
.padding()
} else if symbols.isEmpty {
HStack { HStack {
Image(systemName: "magnifyingglass") Image(systemName: "magnifyingglass")
.resizable().scaledToFit() .resizable().scaledToFit()