Просмотр исходного кода

Use TargetPicker for AddOverrideForm as well

Mike Plante 1 год назад
Родитель
Сommit
ffa0cb7373

+ 66 - 0
FreeAPS/Sources/Modules/OverrideConfig/OverrideStateModel.swift

@@ -785,3 +785,69 @@ struct RadioButton: View {
         .buttonStyle(PlainButtonStyle())
     }
 }
+
+struct TargetPicker: View {
+    let label: String
+    @Binding var selection: Decimal
+    let options: [Decimal]
+    let units: GlucoseUnits
+    var hasChanges: Binding<Bool>?
+    @Binding var targetStep: Decimal
+    @Binding var displayPickerTarget: Bool
+    var toggleScrollWheel: (_ picker: Bool) -> Bool
+
+    var body: some View {
+        HStack {
+            Text(label)
+            Spacer()
+            Text(
+                (units == .mgdL ? selection.description : selection.formattedAsMmolL) + " " + units.rawValue
+            )
+            .foregroundColor(!displayPickerTarget ? .primary : .accentColor)
+        }
+        .onTapGesture {
+            displayPickerTarget = toggleScrollWheel(displayPickerTarget)
+        }
+        if displayPickerTarget {
+            HStack {
+                // Radio buttons and text on the left side
+                VStack(alignment: .leading) {
+                    // Radio buttons for step iteration
+                    let stepChoices: [Decimal] = units == .mgdL ? [1, 5] : [1, 9]
+                    ForEach(stepChoices, id: \.self) { step in
+                        let label = (units == .mgdL ? step.description : step.formattedAsMmolL) + " " +
+                            units.rawValue
+                        RadioButton(
+                            isSelected: targetStep == step,
+                            label: label
+                        ) {
+                            targetStep = step
+                            selection = OverrideConfig.StateModel.roundTargetToStep(selection, step)
+                        }
+                        .padding(.top, 10)
+                    }
+                }
+                .frame(maxWidth: .infinity)
+
+                Spacer()
+
+                // Picker on the right side
+                Picker(selection: Binding(
+                    get: { OverrideConfig.StateModel.roundTargetToStep(selection, targetStep) },
+                    set: {
+                        selection = $0
+                        hasChanges?.wrappedValue = true // This safely updates if hasChanges is provided
+                    }
+                ), label: Text("")) {
+                    ForEach(options, id: \.self) { option in
+                        Text((units == .mgdL ? option.description : option.formattedAsMmolL) + " " + units.rawValue)
+                            .tag(option)
+                    }
+                }
+                .pickerStyle(WheelPickerStyle())
+                .frame(maxWidth: .infinity)
+            }
+            .listRowSeparator(.hidden, edges: .top)
+        }
+    }
+}

+ 22 - 63
FreeAPS/Sources/Modules/OverrideConfig/View/AddOverrideForm.swift

@@ -230,73 +230,32 @@ struct AddOverrideForm: View {
 
             Section {
                 Toggle(isOn: $state.shouldOverrideTarget) {
-                    Text("Override Profile Target")
+                    Text("Override Target")
                 }
 
                 if state.shouldOverrideTarget {
-                    HStack {
-                        Text("Target Glucose")
-                        Spacer()
-                        Text(
-                            (state.units == .mgdL ? state.target.description : state.target.formattedAsMmolL) + " " + state
-                                .units.rawValue
-                        )
-                        .foregroundColor(!displayPickerTarget ? .primary : .accentColor)
-                    }
-                    .onTapGesture {
-                        displayPickerTarget = toggleScrollWheel(displayPickerTarget)
-                    }
-
-                    if displayPickerTarget {
-                        HStack {
-                            // Radio buttons and text on the left side
-                            VStack(alignment: .leading) {
-                                // Radio buttons for step iteration
-                                let stepChoices: [Decimal] = state.units == .mgdL ? [1, 5] : [1, 9]
-                                ForEach(stepChoices, id: \.self) { step in
-                                    let label = (state.units == .mgdL ? step.description : step.formattedAsMmolL) + " " +
-                                        state.units.rawValue
-
-                                    RadioButton(
-                                        isSelected: targetStep == step,
-                                        label: label
-                                    ) {
-                                        targetStep = step
-                                        state.target = OverrideConfig.StateModel.roundTargetToStep(state.target, targetStep)
-                                    }
-                                    .padding(.top, 10)
-                                }
-                            }
-                            .frame(maxWidth: .infinity)
-
-                            Spacer()
-
-                            // Picker on the right side
-                            let settingsProvider = PickerSettingsProvider.shared
-                            let glucoseSetting = PickerSetting(value: 0, step: targetStep, min: 72, max: 270, type: .glucose)
-                            Picker(selection: Binding(
-                                get: { OverrideConfig.StateModel.roundTargetToStep(state.target, targetStep) },
-                                set: { state.target = $0 }
-                            ), label: Text("")) {
-                                ForEach(
-                                    settingsProvider.generatePickerValues(
-                                        from: glucoseSetting,
-                                        units: state.units,
-                                        roundMinToStep: true
-                                    ),
-                                    id: \.self
-                                ) { glucose in
-                                    Text(
-                                        (state.units == .mgdL ? glucose.description : glucose.formattedAsMmolL) + " " + state
-                                            .units.rawValue
-                                    )
-                                    .tag(glucose)
-                                }
-                            }
-                            .pickerStyle(WheelPickerStyle())
-                            .frame(maxWidth: .infinity)
+                    let settingsProvider = PickerSettingsProvider.shared
+                    let glucoseSetting = PickerSetting(value: 0, step: targetStep, min: 72, max: 270, type: .glucose)
+                    TargetPicker(
+                        label: "Target Glucose",
+                        selection: Binding(
+                            get: { state.target },
+                            set: { state.target = $0 }
+                        ),
+                        options: settingsProvider.generatePickerValues(
+                            from: glucoseSetting,
+                            units: state.units,
+                            roundMinToStep: true
+                        ),
+                        units: state.units,
+                        targetStep: $targetStep,
+                        displayPickerTarget: $displayPickerTarget,
+                        toggleScrollWheel: toggleScrollWheel
+                    )
+                    .onAppear {
+                        if state.target == 0 {
+                            state.target = 100
                         }
-                        .listRowSeparator(.hidden, edges: .top)
                     }
                 }
             }

+ 1 - 66
FreeAPS/Sources/Modules/OverrideConfig/View/EditOverrideForm.swift

@@ -322,6 +322,7 @@ struct EditOverrideForm: View {
                 if target_override {
                     let settingsProvider = PickerSettingsProvider.shared
                     let glucoseSetting = PickerSetting(value: 0, step: targetStep, min: 72, max: 270, type: .glucose)
+
                     TargetPicker(
                         label: "Target Glucose",
                         selection: Binding(
@@ -647,69 +648,3 @@ struct EditOverrideForm: View {
         return !toggle
     }
 }
-
-struct TargetPicker: View {
-    let label: String
-    @Binding var selection: Decimal
-    let options: [Decimal]
-    let units: GlucoseUnits
-    @Binding var hasChanges: Bool
-    @Binding var targetStep: Decimal
-    @Binding var displayPickerTarget: Bool
-    var toggleScrollWheel: (_ picker: Bool) -> Bool
-
-    var body: some View {
-        HStack {
-            Text(label)
-            Spacer()
-            Text(
-                (units == .mgdL ? selection.description : selection.formattedAsMmolL) + " " + units.rawValue
-            )
-            .foregroundColor(!displayPickerTarget ? .primary : .accentColor)
-        }
-        .onTapGesture {
-            displayPickerTarget = toggleScrollWheel(displayPickerTarget)
-        }
-        if displayPickerTarget {
-            HStack {
-                // Radio buttons and text on the left side
-                VStack(alignment: .leading) {
-                    // Radio buttons for step iteration
-                    let stepChoices: [Decimal] = units == .mgdL ? [1, 5] : [1, 9]
-                    ForEach(stepChoices, id: \.self) { step in
-                        let label = (units == .mgdL ? step.description : step.formattedAsMmolL) + " " +
-                            units.rawValue
-                        RadioButton(
-                            isSelected: targetStep == step,
-                            label: label
-                        ) {
-                            targetStep = step
-                            selection = OverrideConfig.StateModel.roundTargetToStep(selection, step)
-                        }
-                        .padding(.top, 10)
-                    }
-                }
-                .frame(maxWidth: .infinity)
-
-                Spacer()
-
-                // Picker on the right side
-                Picker(selection: Binding(
-                    get: { OverrideConfig.StateModel.roundTargetToStep(selection, targetStep) },
-                    set: {
-                        selection = $0
-                        hasChanges = true
-                    }
-                ), label: Text("")) {
-                    ForEach(options, id: \.self) { option in
-                        Text((units == .mgdL ? option.description : option.formattedAsMmolL) + " " + units.rawValue)
-                            .tag(option)
-                    }
-                }
-                .pickerStyle(WheelPickerStyle())
-                .frame(maxWidth: .infinity)
-            }
-            .listRowSeparator(.hidden, edges: .top)
-        }
-    }
-}