Преглед изворни кода

fix struct TargetPicker use in addtempTarget

Robert пре 1 година
родитељ
комит
7b59b9c955

+ 3 - 2
FreeAPS/Sources/Modules/OverrideConfig/OverrideStateModel.swift

@@ -908,8 +908,9 @@ extension OverrideConfig.StateModel {
         computeSliderHigh(usingTarget: initialTarget) > computeSliderLow(usingTarget: initialTarget)
     }
 
-    func computeHalfBasalTarget() -> Double {
-        let adjustmentRatio = Decimal(percentage / 100)
+    func computeHalfBasalTarget(using initialPercentage: Double? = nil) -> Double {
+        let adjustmentPercentage = initialPercentage ?? percentage
+        let adjustmentRatio = Decimal(adjustmentPercentage / 100)
         let tempTargetValue: Decimal = tempTargetTarget
         var halfBasalTargetValue = halfBasalTarget
         if adjustmentRatio != 1 {

+ 24 - 63
FreeAPS/Sources/Modules/OverrideConfig/View/AddTempTargetForm.swift

@@ -16,6 +16,7 @@ struct AddTempTargetForm: View {
     @State private var showPresetAlert = false
     @State private var alertString = ""
     @State private var isUsingSlider = false
+    @State private var hasChanges = false
 
     @State private var didPressSave =
         false // only used for fixing the Disclaimer showing up after pressing save (after the state was resetted), maybe refactor this...
@@ -154,72 +155,32 @@ struct AddTempTargetForm: View {
             }.listRowBackground(Color.chart)
 
             Section {
+                let settingsProvider = PickerSettingsProvider.shared
+                let glucoseSetting = PickerSetting(value: 0, step: targetStep, min: 80, max: 270, type: .glucose)
                 HStack {
-                    Text("Target Glucose")
-                    Spacer()
-                    Text(formattedGlucose(glucose: state.tempTargetTarget))
-                        .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.tempTargetTarget = OverrideConfig.StateModel.roundTargetToStep(
-                                        state.tempTargetTarget,
-                                        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: 80, max: 270, type: .glucose)
-                        Picker(selection: Binding(
-                            get: { OverrideConfig.StateModel.roundTargetToStep(state.tempTargetTarget, targetStep) },
+                    TargetPicker(
+                        label: "Target Glucose",
+                        selection: Binding(
+                            get: { state.tempTargetTarget },
                             set: { state.tempTargetTarget = $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)
-                        .onChange(of: state.tempTargetTarget) {
-                            state.percentage = Double(state.computeAdjustedPercentage() * 100)
-                        }
-                    }
+                        ),
+                        options: settingsProvider.generatePickerValues(
+                            from: glucoseSetting,
+                            units: state.units,
+                            roundMinToStep: true
+                        ),
+                        units: state.units,
+                        hasChanges: $hasChanges,
+                        targetStep: $targetStep,
+                        displayPickerTarget: $displayPickerTarget,
+                        toggleScrollWheel: toggleScrollWheel
+                    )
                 }
-            }.listRowBackground(Color.chart)
+                .onChange(of: state.tempTargetTarget) {
+                    state.percentage = Double(state.computeAdjustedPercentage() * 100)
+                }
+            }
+            .listRowBackground(Color.chart)
 
             if state.tempTargetTarget != state.normalTarget {
                 let computedHalfBasalTarget = Decimal(state.computeHalfBasalTarget())

+ 45 - 43
FreeAPS/Sources/Modules/OverrideConfig/View/EditOverrideForm.swift

@@ -665,57 +665,59 @@ struct TargetPicker: View {
     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 {
+        VStack {
             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)
+                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)
                         }
-                        .padding(.top, 10)
                     }
-                }
-                .frame(maxWidth: .infinity)
+                    .frame(maxWidth: .infinity)
 
-                Spacer()
+                    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)
+                    // 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)
                 }
-                .pickerStyle(WheelPickerStyle())
-                .frame(maxWidth: .infinity)
+                .listRowSeparator(.hidden, edges: .top)
             }
-            .listRowSeparator(.hidden, edges: .top)
         }
     }
 }