wip
This commit is contained in:
@ -5,11 +5,7 @@ import SwiftUI
|
||||
@Model
|
||||
final class Exercise {
|
||||
var name: String = ""
|
||||
var setup: String = ""
|
||||
var descr: String = ""
|
||||
var sets: Int = 0
|
||||
var reps: Int = 0
|
||||
var weight: Int = 0
|
||||
|
||||
@Relationship(deleteRule: .nullify, inverse: \ExerciseType.exercises)
|
||||
var type: ExerciseType?
|
||||
@ -23,13 +19,9 @@ final class Exercise {
|
||||
@Relationship(deleteRule: .nullify, inverse: \WorkoutLog.exercise)
|
||||
var logs: [WorkoutLog]? = []
|
||||
|
||||
init(name: String, setup: String, descr: String, sets: Int, reps: Int, weight: Int) {
|
||||
init(name: String, descr: String) {
|
||||
self.name = name
|
||||
self.setup = setup
|
||||
self.descr = descr
|
||||
self.sets = sets
|
||||
self.reps = reps
|
||||
self.weight = weight
|
||||
}
|
||||
|
||||
static let unnamed = "Unnamed Exercise"
|
||||
@ -37,7 +29,7 @@ final class Exercise {
|
||||
|
||||
extension Exercise: EditableEntity {
|
||||
static func createNew() -> Exercise {
|
||||
return Exercise(name: "", setup: "", descr: "", sets: 3, reps: 10, weight: 30)
|
||||
return Exercise(name: "", descr: "")
|
||||
}
|
||||
|
||||
static var navigationTitle: String {
|
||||
@ -76,20 +68,5 @@ fileprivate struct ExerciseFormView: View {
|
||||
TextEditor(text: $model.descr)
|
||||
.frame(minHeight: 100)
|
||||
}
|
||||
|
||||
Section(header: Text("Setup")) {
|
||||
TextEditor(text: $model.setup)
|
||||
.frame(minHeight: 100)
|
||||
}
|
||||
|
||||
Section(header: Text("Weight")) {
|
||||
HStack {
|
||||
Text("\(model.weight)")
|
||||
.bold()
|
||||
Text("lbs")
|
||||
Spacer()
|
||||
Stepper("", value: $model.weight, in: 0...1000)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -6,6 +6,27 @@ import SwiftUI
|
||||
final class Split {
|
||||
var name: String = ""
|
||||
var intro: String = ""
|
||||
var color: String = "indigo"
|
||||
var systemImage: String = "dumbbell.fill"
|
||||
|
||||
// Returns the SwiftUI Color for the stored color name
|
||||
func getColor() -> Color {
|
||||
switch color {
|
||||
case "red": return .red
|
||||
case "orange": return .orange
|
||||
case "yellow": return .yellow
|
||||
case "green": return .green
|
||||
case "mint": return .mint
|
||||
case "teal": return .teal
|
||||
case "cyan": return .cyan
|
||||
case "blue": return .blue
|
||||
case "indigo": return .indigo
|
||||
case "purple": return .purple
|
||||
case "pink": return .pink
|
||||
case "brown": return .brown
|
||||
default: return .indigo
|
||||
}
|
||||
}
|
||||
|
||||
@Relationship(deleteRule: .cascade, inverse: \SplitExerciseAssignment.split)
|
||||
var exercises: [SplitExerciseAssignment]? = []
|
||||
@ -13,9 +34,11 @@ final class Split {
|
||||
@Relationship(deleteRule: .nullify, inverse: \Workout.split)
|
||||
var workouts: [Workout]? = []
|
||||
|
||||
init(name: String, intro: String) {
|
||||
init(name: String, intro: String, color: String = "indigo", systemImage: String = "dumbbell.fill") {
|
||||
self.name = name
|
||||
self.intro = intro
|
||||
self.color = color
|
||||
self.systemImage = systemImage
|
||||
}
|
||||
|
||||
static let unnamed = "Unnamed Split"
|
||||
@ -53,6 +76,12 @@ fileprivate struct SplitFormView: View {
|
||||
@State private var itemToEdit: SplitExerciseAssignment? = nil
|
||||
@State private var itemToDelete: SplitExerciseAssignment? = nil
|
||||
|
||||
// Available colors for splits
|
||||
private let availableColors = ["red", "orange", "yellow", "green", "mint", "teal", "cyan", "blue", "indigo", "purple", "pink", "brown"]
|
||||
|
||||
// Available system images for splits
|
||||
private let availableIcons = ["dumbbell.fill", "figure.strengthtraining.traditional", "figure.run", "figure.hiking", "figure.cooldown", "figure.boxing", "figure.wrestling", "figure.gymnastics", "figure.handball", "figure.core.training", "heart.fill", "bolt.fill"]
|
||||
|
||||
var body: some View {
|
||||
Section(header: Text("Name")) {
|
||||
TextField("Name", text: $model.name)
|
||||
@ -64,6 +93,32 @@ fileprivate struct SplitFormView: View {
|
||||
.frame(minHeight: 100)
|
||||
}
|
||||
|
||||
Section(header: Text("Appearance")) {
|
||||
Picker("Color", selection: $model.color) {
|
||||
ForEach(availableColors, id: \.self) { colorName in
|
||||
let tempSplit = Split(name: "", intro: "", color: colorName)
|
||||
HStack {
|
||||
Circle()
|
||||
.fill(tempSplit.getColor())
|
||||
.frame(width: 20, height: 20)
|
||||
Text(colorName.capitalized)
|
||||
}
|
||||
.tag(colorName)
|
||||
}
|
||||
}
|
||||
|
||||
Picker("Icon", selection: $model.systemImage) {
|
||||
ForEach(availableIcons, id: \.self) { iconName in
|
||||
HStack {
|
||||
Image(systemName: iconName)
|
||||
.frame(width: 24, height: 24)
|
||||
Text(iconName.replacingOccurrences(of: ".fill", with: "").replacingOccurrences(of: "figure.", with: "").capitalized)
|
||||
}
|
||||
.tag(iconName)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Section(header: Text("Exercises")) {
|
||||
NavigationLink {
|
||||
NavigationStack {
|
||||
@ -109,9 +164,9 @@ fileprivate struct SplitFormView: View {
|
||||
ExercisePickerView { exercise in
|
||||
itemToEdit = SplitExerciseAssignment(
|
||||
order: 0,
|
||||
sets: exercise.sets,
|
||||
reps: exercise.reps,
|
||||
weight: exercise.weight,
|
||||
sets: 3,
|
||||
reps: 10,
|
||||
weight: 40,
|
||||
split: model,
|
||||
exercise: exercise
|
||||
)
|
||||
|
@ -7,6 +7,9 @@ final class WorkoutLog {
|
||||
var sets: Int = 0
|
||||
var reps: Int = 0
|
||||
var weight: Int = 0
|
||||
var status: WorkoutStatus? = WorkoutStatus.notStarted
|
||||
var order: Int = 0
|
||||
|
||||
var completed: Bool = false
|
||||
|
||||
@Relationship(deleteRule: .nullify)
|
||||
@ -15,13 +18,15 @@ final class WorkoutLog {
|
||||
@Relationship(deleteRule: .nullify)
|
||||
var exercise: Exercise?
|
||||
|
||||
init(workout: Workout, exercise: Exercise, date: Date, sets: Int, reps: Int, weight: Int, completed: Bool) {
|
||||
init(workout: Workout, exercise: Exercise, date: Date, order: Int = 0, sets: Int, reps: Int, weight: Int, status: WorkoutStatus = .notStarted, completed: Bool = false) {
|
||||
self.date = date
|
||||
self.order = order
|
||||
self.sets = sets
|
||||
self.reps = reps
|
||||
self.weight = weight
|
||||
self.completed = completed
|
||||
self.status = status
|
||||
self.workout = workout
|
||||
self.exercise = exercise
|
||||
self.completed = completed
|
||||
}
|
||||
}
|
||||
|
22
Workouts/Models/WorkoutStatus.swift
Normal file
22
Workouts/Models/WorkoutStatus.swift
Normal file
@ -0,0 +1,22 @@
|
||||
//
|
||||
// WorkoutStatus.swift
|
||||
// Workouts
|
||||
//
|
||||
// Created by rzen on 7/16/25 at 7:03 PM.
|
||||
//
|
||||
// Copyright 2025 Rouslan Zenetl. All Rights Reserved.
|
||||
//
|
||||
|
||||
enum WorkoutStatus: Int, Codable {
|
||||
case notStarted = 1
|
||||
case inProgress = 2
|
||||
case completed = 3
|
||||
|
||||
var checkboxStatus: CheckboxStatus {
|
||||
switch (self) {
|
||||
case .notStarted: .unchecked
|
||||
case .inProgress: .intermediate
|
||||
case .completed: .checked
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user