refactor WorkoutItemLibrarySheet, add Set sample data
This commit is contained in:
@@ -74,6 +74,12 @@ extension WorkoutItem {
|
|||||||
exercises.append(WorkoutItem(from: exercise))
|
exercises.append(WorkoutItem(from: exercise))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var set = WorkoutItem(workoutItems: [
|
||||||
|
WorkoutItem(from: Exercise("Set item 1")),
|
||||||
|
WorkoutItem(from: Exercise("Set item 2"))
|
||||||
|
])
|
||||||
|
exercises.append(set)
|
||||||
|
|
||||||
return exercises
|
return exercises
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
# Workouts+
|
# Workouts+
|
||||||
|
|
||||||
|
## TODO List
|
||||||
|
- Actually DO a workout View
|
||||||
- JSON Import/Export
|
- JSON Import/Export
|
||||||
- Use Multipeer connect for sharing/tracking?
|
- Use Multipeer connect for sharing/tracking?
|
||||||
- Progression-Fotos: als eigene App? -> Generalisierung zu "Foto-Track"
|
|
||||||
- Karte mit öffentlichen Orten einbinden (AOK-Fitnesspark?)
|
- Karte mit öffentlichen Orten einbinden (AOK-Fitnesspark?)
|
||||||
|
- Progression-Fotos: als eigene App? -> Generalisierung zu "Foto-Track"
|
||||||
|
|
||||||
## Workouts
|
## Workouts
|
||||||
- time-based: 60 s
|
- time-based: 60 s
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ struct WorkoutDetail: View {
|
|||||||
@Environment(\.modelContext) private var modelContext
|
@Environment(\.modelContext) private var modelContext
|
||||||
|
|
||||||
@State var workout: Workout
|
@State var workout: Workout
|
||||||
@State private var isPresentingExerciseLibrary = false
|
@State private var isPresentingWorkoutItemLibrarySheet = false
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
List {
|
List {
|
||||||
@@ -25,7 +25,9 @@ struct WorkoutDetail: View {
|
|||||||
.foregroundStyle(workout.workoutIconColorName.color)
|
.foregroundStyle(workout.workoutIconColorName.color)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Section(header: Text("Exercises")) {
|
Section(
|
||||||
|
header: Text("Exercises"),
|
||||||
|
footer: Text("Drag and drop to re-arrange or swipe to delete exercises.")) {
|
||||||
ForEach(workout.workoutItems
|
ForEach(workout.workoutItems
|
||||||
.sorted(by: { $0.position < $1.position})) { workoutItem in
|
.sorted(by: { $0.position < $1.position})) { workoutItem in
|
||||||
switch workoutItem.workoutItemType {
|
switch workoutItem.workoutItemType {
|
||||||
@@ -40,25 +42,23 @@ struct WorkoutDetail: View {
|
|||||||
.onDelete(perform: deleteExerciseFromWorkout)
|
.onDelete(perform: deleteExerciseFromWorkout)
|
||||||
.onMove(perform: move)
|
.onMove(perform: move)
|
||||||
.environment(\.editMode, .constant(.active)) // Always active drag mode
|
.environment(\.editMode, .constant(.active)) // Always active drag mode
|
||||||
AddItemButton(label: "Exercise", action: addWorkoutItemToWorkout)
|
AddItemButton(label: "Exercise", action: presentWorkoutItemLibrarySheet)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.navigationBarTitle("\(workout.name)")
|
.navigationBarTitle("\(workout.name)")
|
||||||
.toolbar {
|
.toolbar {
|
||||||
ToolbarItem() {
|
// TODO: Add proper Sharing for workouts.
|
||||||
EditButton()
|
ToolbarItem() { ShareLink(item: URL(filePath: "felixfoertsch.de")!) }
|
||||||
}
|
ToolbarItem() { EditButton() }
|
||||||
}
|
}
|
||||||
.sheet(isPresented: $isPresentingExerciseLibrary) {
|
.sheet(isPresented: $isPresentingWorkoutItemLibrarySheet) {
|
||||||
AddWorkoutItemToWorkout(workout: workout)
|
WorkoutItemLibrarySheet(workout: workout)
|
||||||
.presentationDetents([.medium, .large])
|
|
||||||
.presentationDragIndicator(.visible)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func addWorkoutItemToWorkout() {
|
private func presentWorkoutItemLibrarySheet() {
|
||||||
withAnimation {
|
withAnimation {
|
||||||
isPresentingExerciseLibrary = true
|
isPresentingWorkoutItemLibrarySheet = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,18 +8,21 @@
|
|||||||
import SwiftUI
|
import SwiftUI
|
||||||
import SwiftData
|
import SwiftData
|
||||||
|
|
||||||
struct AddWorkoutItemToWorkout: View {
|
struct WorkoutItemLibrarySheet: View {
|
||||||
@Environment(\.modelContext) private var modelContext
|
@Environment(\.modelContext) private var modelContext
|
||||||
@Query(sort: \Exercise.name) private var exercises: [Exercise]
|
@Query(sort: \Exercise.name) private var exercises: [Exercise]
|
||||||
|
|
||||||
@State var workout: Workout
|
@State var workout: Workout
|
||||||
// TODO: Add (i) Button that allows editing an exercise (maybe requires NavigationStack?)
|
// TODO: Add (i) Button that allows editing an exercise (maybe requires NavigationStack?)
|
||||||
|
|
||||||
|
// TODO: Pass in some context? So that when we come from a Set and add a Set, it's treed. Or when we come from a Set and add an Exercise, we put it into it's child
|
||||||
var body: some View {
|
var body: some View {
|
||||||
Group {
|
Group {
|
||||||
List {
|
List {
|
||||||
Section(header: Text("Utilities")) {
|
Section(header: Text("Utilities")) {
|
||||||
// AddExerciseToWorkoutListItem(WorkoutItem(workoutItems: []), workout)
|
AddItemButton(label: "Set") {
|
||||||
|
addWorkoutItemtoWorkout(WorkoutItem(workoutItems: []))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Section(header: Text("Excersises")) {
|
Section(header: Text("Excersises")) {
|
||||||
if !exercises.isEmpty {
|
if !exercises.isEmpty {
|
||||||
@@ -38,6 +41,8 @@ struct AddWorkoutItemToWorkout: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.presentationDetents([.medium, .large])
|
||||||
|
.presentationDragIndicator(.visible)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func addWorkoutItemtoWorkout(_ workoutItem: WorkoutItem) {
|
private func addWorkoutItemtoWorkout(_ workoutItem: WorkoutItem) {
|
||||||
@@ -48,11 +53,11 @@ struct AddWorkoutItemToWorkout: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#Preview("With Sample Data") {
|
#Preview("With Sample Data") {
|
||||||
AddWorkoutItemToWorkout(workout: Workout.sampleData)
|
WorkoutItemLibrarySheet(workout: Workout.sampleData)
|
||||||
.modelContainer(SampleData.shared.modelContainer)
|
.modelContainer(SampleData.shared.modelContainer)
|
||||||
}
|
}
|
||||||
|
|
||||||
#Preview("Empty Database") {
|
#Preview("Empty Database") {
|
||||||
AddWorkoutItemToWorkout(workout: Workout.sampleData)
|
WorkoutItemLibrarySheet(workout: Workout.sampleData)
|
||||||
.modelContainer(for: Exercise.self, inMemory: true)
|
.modelContainer(for: Exercise.self, inMemory: true)
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user