implement editing
This commit is contained in:
@@ -53,16 +53,22 @@ class ContentViewModel: ObservableObject {
|
|||||||
struct ContentView: View {
|
struct ContentView: View {
|
||||||
@StateObject private var viewModel = ContentViewModel()
|
@StateObject private var viewModel = ContentViewModel()
|
||||||
@State private var isShowingAddSheet = false
|
@State private var isShowingAddSheet = false
|
||||||
|
@State private var selectedStopwatch: Stopwatch?
|
||||||
@Environment(\.scenePhase) private var scenePhase
|
@Environment(\.scenePhase) private var scenePhase
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
NavigationStack {
|
NavigationStack {
|
||||||
List {
|
List {
|
||||||
ForEach(viewModel.stopwatches) { stopwatch in
|
ForEach(viewModel.stopwatches) { stopwatch in
|
||||||
|
Button {
|
||||||
|
selectedStopwatch = stopwatch
|
||||||
|
} label: {
|
||||||
StopwatchRow(stopwatch: stopwatch, onDelete: {
|
StopwatchRow(stopwatch: stopwatch, onDelete: {
|
||||||
viewModel.deleteStopwatch(id: stopwatch.id)
|
viewModel.deleteStopwatch(id: stopwatch.id)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
.buttonStyle(.plain) // Preserves the row layout and interactions
|
||||||
|
}
|
||||||
.onDelete { indexSet in
|
.onDelete { indexSet in
|
||||||
for index in indexSet {
|
for index in indexSet {
|
||||||
viewModel.deleteStopwatch(at: index)
|
viewModel.deleteStopwatch(at: index)
|
||||||
@@ -86,6 +92,19 @@ struct ContentView: View {
|
|||||||
isShowingAddSheet = false
|
isShowingAddSheet = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.sheet(item: $selectedStopwatch) { stopwatch in
|
||||||
|
StopwatchDetailView(
|
||||||
|
stopwatch: stopwatch,
|
||||||
|
onSave: { newName in
|
||||||
|
stopwatch.name = newName
|
||||||
|
viewModel.save()
|
||||||
|
selectedStopwatch = nil
|
||||||
|
},
|
||||||
|
onCancel: {
|
||||||
|
selectedStopwatch = nil
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
.overlay {
|
.overlay {
|
||||||
if viewModel.stopwatches.isEmpty {
|
if viewModel.stopwatches.isEmpty {
|
||||||
ContentUnavailableView(
|
ContentUnavailableView(
|
||||||
|
|||||||
56
MultiChrono/StopwatchDetailView.swift
Normal file
56
MultiChrono/StopwatchDetailView.swift
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
//
|
||||||
|
// StopwatchDetailView.swift
|
||||||
|
// MultiChrono
|
||||||
|
//
|
||||||
|
// Created by Beatrice Dellacà on 27/01/26.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct StopwatchDetailView: View {
|
||||||
|
let stopwatch: Stopwatch
|
||||||
|
let onSave: (String) -> Void
|
||||||
|
let onCancel: () -> Void
|
||||||
|
|
||||||
|
@State private var draftName: String
|
||||||
|
|
||||||
|
init(stopwatch: Stopwatch, onSave: @escaping (String) -> Void, onCancel: @escaping () -> Void) {
|
||||||
|
self.stopwatch = stopwatch
|
||||||
|
self.onSave = onSave
|
||||||
|
self.onCancel = onCancel
|
||||||
|
_draftName = State(initialValue: stopwatch.name)
|
||||||
|
}
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
NavigationStack {
|
||||||
|
Form {
|
||||||
|
Section(header: Text("Name")) {
|
||||||
|
TextField("Enter name...", text: $draftName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.navigationTitle("Edit Stopwatch")
|
||||||
|
.navigationBarTitleDisplayMode(.inline)
|
||||||
|
.toolbar {
|
||||||
|
ToolbarItem(placement: .cancellationAction) {
|
||||||
|
Button("Cancel") {
|
||||||
|
onCancel()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ToolbarItem(placement: .confirmationAction) {
|
||||||
|
Button("Save") {
|
||||||
|
onSave(draftName)
|
||||||
|
}
|
||||||
|
.disabled(draftName.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#Preview {
|
||||||
|
StopwatchDetailView(
|
||||||
|
stopwatch: Stopwatch(name: "Test Timer"),
|
||||||
|
onSave: { _ in },
|
||||||
|
onCancel: {}
|
||||||
|
)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user