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

convert generateTargetPickerValues to generatePickerValues extension

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

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

@@ -658,3 +658,27 @@ extension OverrideConfig.StateModel: SettingsObserver {
         maxValue = settingsManager.preferences.autosensMax
         maxValue = settingsManager.preferences.autosensMax
     }
     }
 }
 }
+
+extension PickerSettingsProvider {
+    func generatePickerValues(from setting: PickerSetting, units: GlucoseUnits, roundMinToStep: Bool) -> [Decimal] {
+        if !roundMinToStep {
+            return generatePickerValues(from: setting, units: units)
+        }
+
+        // Adjust min to be divisible by step
+        var newSetting = setting
+        var min = Double(newSetting.min)
+        var step = Double(newSetting.step)
+        let remainder = min.truncatingRemainder(dividingBy: step)
+        if remainder != 0 {
+            // Move min up to the next value divisible by targetStep
+            min += (step - remainder)
+        }
+
+        newSetting.min = Decimal(min)
+
+        var values = generatePickerValues(from: newSetting, units: units)
+
+        return values
+    }
+}

+ 3 - 33
FreeAPS/Sources/Modules/OverrideConfig/View/AddOverrideForm.swift

@@ -279,12 +279,14 @@ struct AddOverrideForm: View {
                             Spacer()
                             Spacer()
 
 
                             // Picker on the right side
                             // 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(
                             Picker(selection: Binding(
                                 get: { OverrideConfig.StateModel.roundTargetToStep(state.target, targetStep) },
                                 get: { OverrideConfig.StateModel.roundTargetToStep(state.target, targetStep) },
                                 set: { state.target = $0 }
                                 set: { state.target = $0 }
                             ), label: Text("")) {
                             ), label: Text("")) {
                                 ForEach(
                                 ForEach(
-                                    generateTargetPickerValues(),
+                                    settingsProvider.generatePickerValues(from: glucoseSetting, units: state.units, roundMinToStep: true),
                                     id: \.self
                                     id: \.self
                                 ) { glucose in
                                 ) { glucose in
                                     Text(
                                     Text(
@@ -527,38 +529,6 @@ struct AddOverrideForm: View {
 
 
         return (false, nil)
         return (false, nil)
     }
     }
-
-    func generateTargetPickerValues() -> [Decimal] {
-        var values: [Decimal] = []
-        var currentValue: Double = 72
-        let step = Double(targetStep)
-
-        // Adjust currentValue to be divisible by targetStep
-        let remainder = currentValue.truncatingRemainder(dividingBy: step)
-        if remainder != 0 {
-            // Move currentValue up to the next value divisible by targetStep
-            currentValue += (step - remainder)
-        }
-
-        // Now generate the picker values starting from currentValue
-        while currentValue <= 270 {
-            values.append(Decimal(currentValue))
-            currentValue += step
-        }
-
-        // Glucose values are stored as mg/dl values, so Integers.
-        // Filter out duplicate values when rounded to 1 decimal place.
-        if state.units == .mmolL {
-            // Use a Set to track unique values rounded to 1 decimal
-            var uniqueRoundedValues = Set<String>()
-            values = values.filter { value in
-                let roundedValue = String(format: "%.1f", NSDecimalNumber(decimal: value.asMmolL).doubleValue)
-                return uniqueRoundedValues.insert(roundedValue).inserted
-            }
-        }
-
-        return values
-    }
 }
 }
 
 
 enum IsfAndOrCrOptions: String, CaseIterable {
 enum IsfAndOrCrOptions: String, CaseIterable {

+ 3 - 33
FreeAPS/Sources/Modules/OverrideConfig/View/EditOverrideForm.swift

@@ -327,13 +327,15 @@ struct EditOverrideForm: View {
                 }
                 }
                 // Target Glucose Picker
                 // Target Glucose Picker
                 if target_override {
                 if target_override {
+                    let settingsProvider = PickerSettingsProvider.shared
+                    let glucoseSetting = PickerSetting(value: 0, step: targetStep, min: 72, max: 270, type: .glucose)
                     TargetPicker(
                     TargetPicker(
                         label: "Target Glucose",
                         label: "Target Glucose",
                         selection: Binding(
                         selection: Binding(
                             get: { target ?? 100 },
                             get: { target ?? 100 },
                             set: { target = $0 }
                             set: { target = $0 }
                         ),
                         ),
-                        options: generateTargetPickerValues(),
+                        options: settingsProvider.generatePickerValues(from: glucoseSetting, units: state.units, roundMinToStep: true),
                         units: state.units,
                         units: state.units,
                         hasChanges: $hasChanges,
                         hasChanges: $hasChanges,
                         targetStep: $targetStep,
                         targetStep: $targetStep,
@@ -640,38 +642,6 @@ struct EditOverrideForm: View {
         displayPickerSmbMinutes = false
         displayPickerSmbMinutes = false
         return !toggle
         return !toggle
     }
     }
-
-    func generateTargetPickerValues() -> [Decimal] {
-        var values: [Decimal] = []
-        var currentValue: Double = 72
-        let step = Double(targetStep)
-
-        // Adjust currentValue to be divisible by targetStep
-        let remainder = currentValue.truncatingRemainder(dividingBy: step)
-        if remainder != 0 {
-            // Move currentValue up to the next value divisible by targetStep
-            currentValue += (step - remainder)
-        }
-
-        // Now generate the picker values starting from currentValue
-        while currentValue <= 270 {
-            values.append(Decimal(currentValue))
-            currentValue += step
-        }
-
-        // Glucose values are stored as mg/dl values, so Integers.
-        // Filter out duplicate values when rounded to 1 decimal place.
-        if state.units == .mmolL {
-            // Use a Set to track unique values rounded to 1 decimal
-            var uniqueRoundedValues = Set<String>()
-            values = values.filter { value in
-                let roundedValue = String(format: "%.1f", NSDecimalNumber(decimal: value.asMmolL).doubleValue)
-                return uniqueRoundedValues.insert(roundedValue).inserted
-            }
-        }
-
-        return values
-    }
 }
 }
 
 
 struct TargetPicker: View {
 struct TargetPicker: View {