diff --git a/CoachUI.xcodeproj/project.pbxproj b/CoachUI.xcodeproj/project.pbxproj index f356f97..3cf4032 100644 --- a/CoachUI.xcodeproj/project.pbxproj +++ b/CoachUI.xcodeproj/project.pbxproj @@ -76,7 +76,6 @@ children = ( 69166E79231D1A7F00A5F192 /* launch */, 69166E7B231D1A9600A5F192 /* views */, - 69166E8F231D712400A5F192 /* extensions */, 69166E7A231D1A9300A5F192 /* models */, 69166E6A231CF60B00A5F192 /* Assets.xcassets */, 69166E6F231CF60B00A5F192 /* LaunchScreen.storyboard */, @@ -127,13 +126,6 @@ path = views; sourceTree = ""; }; - 69166E8F231D712400A5F192 /* extensions */ = { - isa = PBXGroup; - children = ( - ); - path = extensions; - sourceTree = ""; - }; 69166E92231D788100A5F192 /* rows */ = { isa = PBXGroup; children = ( diff --git a/CoachUI/models/WorkoutsStore.swift b/CoachUI/models/WorkoutsStore.swift index 0fd9127..edb4261 100644 --- a/CoachUI/models/WorkoutsStore.swift +++ b/CoachUI/models/WorkoutsStore.swift @@ -12,8 +12,8 @@ import SwiftUI class WorkoutsStore: ObservableObject { static var sharedStore : WorkoutsStore! - var workouts: [Workout] = [] - var favorites: [String] = [] + @Published var workouts: [Workout] = [] + @Published var favorites: [String] = [] init() { workouts.append(contentsOf: buildDefaultWorkouts()) @@ -27,6 +27,10 @@ class WorkoutsStore: ObservableObject { workouts.append(workout) } + func editWorkout(workout: Workout) { + + } + func removeWorkout(at index: Int) { let workout = workouts.remove(at: index) favorites.removeAll{ $0 == workout.id } diff --git a/CoachUI/views/WorkoutCreatorView.swift b/CoachUI/views/WorkoutCreatorView.swift index 41d1ed2..b3a3e3a 100644 --- a/CoachUI/views/WorkoutCreatorView.swift +++ b/CoachUI/views/WorkoutCreatorView.swift @@ -12,6 +12,9 @@ struct WorkoutCreatorView: View { //MARK: - Properties @EnvironmentObject var store: WorkoutsStore + @Environment(\.presentationMode) var presentationMode + + var editingWorkout: Workout? @State private var workoutName = "" @State private var exercises: [Exercise] = [] @@ -22,11 +25,17 @@ struct WorkoutCreatorView: View { // MARK: - nav buttons private var saveButton: some View { Button(action: { - let workout = Workout(name: self.workoutName) - for exercise in self.exercises { - workout.addExercise(exercise: exercise) + if let editing = self.editingWorkout { + self.editingWorkout?.name = self.workoutName + self.editingWorkout?.exercises = self.exercises + } else { + let workout = Workout(name: self.workoutName) + for exercise in self.exercises { + workout.addExercise(exercise: exercise) + } + self.store.insertWorkout(workout: workout) } - self.store.insertWorkout(workout: workout) + self.presentationMode.wrappedValue.dismiss() }, label: { Text("Save") }) @@ -34,7 +43,7 @@ struct WorkoutCreatorView: View { private var cancelButton: some View { Button(action: { - + self.presentationMode.wrappedValue.dismiss() }, label: { Text("Cancel") .foregroundColor(.red) @@ -97,11 +106,17 @@ struct WorkoutCreatorView: View { } addExerciseSection } + .onAppear{ + if let editing = self.editingWorkout { + self.workoutName = editing.name + self.exercises = editing.exercises + } + } .navigationBarTitle("Create a new workout", displayMode: .inline) .navigationBarItems(leading: cancelButton, trailing: saveButton) - } + }.navigationViewStyle(StackNavigationViewStyle()) } } diff --git a/CoachUI/views/WorkoutDetailView.swift b/CoachUI/views/WorkoutDetailView.swift index a2e6e2a..bb8f32b 100644 --- a/CoachUI/views/WorkoutDetailView.swift +++ b/CoachUI/views/WorkoutDetailView.swift @@ -10,7 +10,8 @@ import SwiftUI struct WorkoutDetailView: View { @EnvironmentObject var store: WorkoutsStore - let workout: Workout + @ObservedObject var workout: Workout + @State private var isWorkoutFormPresented = false private var favButton: some View { Button(action: { @@ -21,6 +22,28 @@ struct WorkoutDetailView: View { .foregroundColor(.yellow) }) } + + private var deleteButton: some View { + Button(action: { + if let index = self.store.workouts.firstIndex(of: self.workout) { + self.store.removeWorkout(at: index) + } + }, label: { + Image(systemName: "trash") + .imageScale(.large) + .foregroundColor(.red) + }) + } + + + private var editButton: some View { + Button(action: { + self.isWorkoutFormPresented = true + }, label: { + Text("Edit").foregroundColor(.blue) + }) + } + var body: some View { List { Section(header: Text("Exercices")) { @@ -38,9 +61,18 @@ struct WorkoutDetailView: View { } } } - .navigationBarItems(trailing: favButton) + .navigationBarItems(trailing: + HStack { + favButton.padding() + deleteButton + editButton + }) .listStyle(GroupedListStyle()) .navigationBarTitle(workout.name) + .sheet(isPresented: $isWorkoutFormPresented, + content: { WorkoutCreatorView(editingWorkout: self.workout).environmentObject(self.store) + + }) } } diff --git a/CoachUI/views/WorkoutTimer.swift b/CoachUI/views/WorkoutTimer.swift index 7532f45..c41a25a 100644 --- a/CoachUI/views/WorkoutTimer.swift +++ b/CoachUI/views/WorkoutTimer.swift @@ -49,6 +49,7 @@ struct WorkoutTimer: View { var body: some View { ZStack { + // Gradient GeometryReader { geometry in Path { (path) in let size: CGFloat = min(geometry.size.width, geometry.size.height) * 0.7 @@ -62,6 +63,7 @@ struct WorkoutTimer: View { endPoint: .init(x: 0.5, y: 0.6) )) } + // Border GeometryReader { geometry in Path { (path) in let size: CGFloat = min(geometry.size.width, geometry.size.height) * 0.7 @@ -71,6 +73,7 @@ struct WorkoutTimer: View { }.stroke(lineWidth: 10).foregroundColor(Color.gray) } + // Progress GeometryReader { geometry in Path { (path) in let size: CGFloat = min(geometry.size.width, geometry.size.height) * 0.7