Przeglądaj źródła

Adjust some steps; refactor SettingInputSection control

Deniz Cengiz 1 rok temu
rodzic
commit
f8b26de47e

+ 12 - 12
FreeAPS/Sources/Models/DecimalPickerSettings.swift

@@ -55,8 +55,8 @@ struct DecimalPickerSettings {
         max: 5,
         type: PickerSetting.PickerSettingType.factor
     )
-    var autosensMax = PickerSetting(value: 1.2, step: 0.5, min: 0.5, max: 2, type: PickerSetting.PickerSettingType.factor)
-    var autosensMin = PickerSetting(value: 0.7, step: 0.5, min: 0.5, max: 1, type: PickerSetting.PickerSettingType.factor)
+    var autosensMax = PickerSetting(value: 1.2, step: 0.1, min: 0.5, max: 2, type: PickerSetting.PickerSettingType.factor)
+    var autosensMin = PickerSetting(value: 0.7, step: 0.1, min: 0.5, max: 1, type: PickerSetting.PickerSettingType.factor)
     var smbDeliveryRatio = PickerSetting(value: 0.5, step: 0.1, min: 0.1, max: 1, type: PickerSetting.PickerSettingType.factor)
     var halfBasalExerciseTarget = PickerSetting(
         value: 160,
@@ -82,8 +82,8 @@ struct DecimalPickerSettings {
         type: PickerSetting.PickerSettingType.factor
     )
     var remainingCarbsCap = PickerSetting(value: 90, step: 5, min: 0, max: 200, type: PickerSetting.PickerSettingType.gramms)
-    var maxSMBBasalMinutes = PickerSetting(value: 30, step: 5, min: 0, max: 60, type: PickerSetting.PickerSettingType.minute)
-    var maxUAMSMBBasalMinutes = PickerSetting(value: 30, step: 5, min: 0, max: 60, type: PickerSetting.PickerSettingType.minute)
+    var maxSMBBasalMinutes = PickerSetting(value: 30, step: 5, min: 30, max: 180, type: PickerSetting.PickerSettingType.minute)
+    var maxUAMSMBBasalMinutes = PickerSetting(value: 30, step: 5, min: 30, max: 180, type: PickerSetting.PickerSettingType.minute)
     var smbInterval = PickerSetting(value: 3, step: 0.1, min: 0.5, max: 10, type: PickerSetting.PickerSettingType.minute)
     var bolusIncrement = PickerSetting(
         value: 0.1,
@@ -92,7 +92,7 @@ struct DecimalPickerSettings {
         max: 1,
         type: PickerSetting.PickerSettingType.insulinUnit
     )
-    var insulinPeakTime = PickerSetting(value: 75, step: 1, min: 35, max: 120, type: PickerSetting.PickerSettingType.factor)
+    var insulinPeakTime = PickerSetting(value: 75, step: 5, min: 35, max: 120, type: PickerSetting.PickerSettingType.minute)
     var carbsReqThreshold = PickerSetting(value: 1.0, step: 0.1, min: 0, max: 10, type: PickerSetting.PickerSettingType.gramms)
     var noisyCGMTargetMultiplier = PickerSetting(
         value: 1.3,
@@ -106,17 +106,17 @@ struct DecimalPickerSettings {
         step: 0.1,
         min: 0.1,
         max: 2,
-        type: PickerSetting.PickerSettingType.glucose
+        type: PickerSetting.PickerSettingType.factor
     )
-    var adjustmentFactor = PickerSetting(value: 0.8, step: 0.5, min: 0.5, max: 1.5, type: PickerSetting.PickerSettingType.factor)
+    var adjustmentFactor = PickerSetting(value: 0.8, step: 0.1, min: 0.5, max: 1.5, type: PickerSetting.PickerSettingType.factor)
     var adjustmentFactorSigmoid = PickerSetting(
         value: 0.5,
-        step: 0.5,
+        step: 0.1,
         min: 0.5,
         max: 2,
         type: PickerSetting.PickerSettingType.factor
     )
-    var weightPercentage = PickerSetting(value: 0.65, step: 0.5, min: 0.1, max: 1, type: PickerSetting.PickerSettingType.factor)
+    var weightPercentage = PickerSetting(value: 0.65, step: 0.1, min: 0.1, max: 1, type: PickerSetting.PickerSettingType.factor)
     var enableSMB_high_bg_target = PickerSetting(
         value: 110,
         step: 1,
@@ -126,9 +126,9 @@ struct DecimalPickerSettings {
     )
     var threshold_setting = PickerSetting(value: 65, step: 1, min: 50, max: 100, type: PickerSetting.PickerSettingType.glucose)
     var updateInterval = PickerSetting(value: 20, step: 5, min: 1, max: 60, type: PickerSetting.PickerSettingType.minute)
-    var delay = PickerSetting(value: 20, step: 1, min: 5, max: 60, type: PickerSetting.PickerSettingType.minute)
-    var minuteInterval = PickerSetting(value: 20, step: 5, min: 1, max: 60, type: PickerSetting.PickerSettingType.minute)
-    var timeCap = PickerSetting(value: 20, step: 5, min: 1, max: 60, type: PickerSetting.PickerSettingType.minute)
+    var delay = PickerSetting(value: 20, step: 5, min: 5, max: 60, type: PickerSetting.PickerSettingType.minute)
+    var minuteInterval = PickerSetting(value: 20, step: 5, min: 5, max: 60, type: PickerSetting.PickerSettingType.minute)
+    var timeCap = PickerSetting(value: 20, step: 5, min: 5, max: 60, type: PickerSetting.PickerSettingType.hour)
     var hours = PickerSetting(value: 6, step: 0.5, min: 2, max: 24, type: PickerSetting.PickerSettingType.hour)
     var dia = PickerSetting(value: 6, step: 0.5, min: 4, max: 10, type: PickerSetting.PickerSettingType.hour)
     var maxBolus = PickerSetting(value: 10, step: 1, min: 1, max: 30, type: PickerSetting.PickerSettingType.insulinUnit)

+ 2 - 2
FreeAPS/Sources/Modules/ISFEditor/ISFEditorStateModel.swift

@@ -76,8 +76,8 @@ extension ISFEditor {
                 return InsulinSensitivityEntry(sensitivity: rate, offset: minutes, start: fotmatter.string(from: date))
             }
             let profile = InsulinSensitivities(
-                units: units,
-                userPrefferedUnits: settingsManager.settings.units,
+                units: .mgdL,
+                userPrefferedUnits: .mgdL,
                 sensitivities: sensitivities
             )
             provider.saveProfile(profile)

+ 1 - 1
FreeAPS/Sources/Modules/TargetsEditor/TargetsEditorStateModel.swift

@@ -56,7 +56,7 @@ extension TargetsEditor {
                 let high = low
                 return BGTargetEntry(low: low, high: high, start: formatter.string(from: date), offset: minutes)
             }
-            let profile = BGTargets(units: units, userPrefferedUnits: settingsManager.settings.units, targets: targets)
+            let profile = BGTargets(units: .mgdL, userPrefferedUnits: .mgdL, targets: targets)
             provider.saveProfile(profile)
         }
 

+ 97 - 175
FreeAPS/Sources/Views/SettingInputSection.swift

@@ -34,7 +34,6 @@ struct SettingInputSection: View {
     var headerText: String?
     var footerText: String?
 
-    // Access the shared PickerSettingsProvider instance
     @ObservedObject private var pickerSettingsProvider = PickerSettingsProvider.shared
     @State private var displayPicker: Bool = false
     @State private var displayConditionalPicker: Bool = false
@@ -46,191 +45,40 @@ struct SettingInputSection: View {
                     switch type {
                     case let .decimal(key):
                         if let setting = getPickerSetting(for: key) {
-                            VStack {
-                                HStack {
-                                    Text(label)
-
-                                    Spacer()
-
-                                    Group {
-                                        if setting.type == PickerSetting.PickerSettingType.glucose {
-                                            Text(
-                                                units == .mmolL ? decimalValue.asMmolL.description : decimalValue
-                                                    .description
-                                            )
-                                            .foregroundColor(!displayPicker ? .primary : .accentColor)
-                                            Text(units == .mgdL ? " mg/dL" : " mmol/L").foregroundColor(.secondary)
-                                        } else if setting.type == PickerSetting.PickerSettingType.factor {
-                                            Text("\(decimalValue * 100)")
-                                                .foregroundColor(!displayPicker ? .primary : .accentColor)
-
-                                            Text(" %").foregroundColor(.secondary)
-                                        } else if setting.type == PickerSetting.PickerSettingType.insulinUnit {
-                                            Text("\(decimalValue)")
-                                                .foregroundColor(!displayPicker ? .primary : .accentColor)
-
-                                            Text(NSLocalizedString(" U", comment: "Insulin unit")).foregroundColor(.secondary)
-                                        } else if setting.type == PickerSetting.PickerSettingType.gramms {
-                                            Text("\(decimalValue)")
-                                                .foregroundColor(!displayPicker ? .primary : .accentColor)
-
-                                            Text(NSLocalizedString(" g", comment: "gram of carbs")).foregroundColor(.secondary)
-                                        } else if setting.type == PickerSetting.PickerSettingType.minute {
-                                            Text("\(decimalValue)")
-                                                .foregroundColor(!displayPicker ? .primary : .accentColor)
-
-                                            Text(" min").foregroundColor(.secondary)
-                                        } else if setting.type == PickerSetting.PickerSettingType.hour {
-                                            Text("\(decimalValue)")
-                                                .foregroundColor(!displayPicker ? .primary : .accentColor)
-
-                                            Text(" hr").foregroundColor(.secondary)
-                                        }
-                                    }.onTapGesture {
-                                        displayPicker.toggle()
-                                    }
-                                }.padding(.top)
-
-                                if displayPicker {
-                                    Picker(selection: $decimalValue, label: Text("")) {
-                                        ForEach(
-                                            pickerSettingsProvider.generatePickerValues(from: setting),
-                                            id: \.self
-                                        ) { value in
-                                            if setting.type == PickerSetting.PickerSettingType.glucose {
-                                                let displayValue = units == .mgdL ? value : value.asMmolL
-                                                Text("\(displayValue.description)").tag(value)
-                                            } else if setting.type == PickerSetting.PickerSettingType.factor {
-                                                let factorValue = value * 100
-                                                Text("\(factorValue.description)").tag(value)
-                                            } else {
-                                                Text("\(value.description)").tag(value)
-                                            }
-                                        }
-                                    }
-                                    .pickerStyle(WheelPickerStyle())
-                                    .frame(maxWidth: .infinity)
-                                }
-                            }
+                            pickerView(
+                                label: label,
+                                displayPicker: $displayPicker,
+                                setting: setting,
+                                decimalValue: $decimalValue
+                            )
                         }
 
                     case .boolean:
-                        HStack {
-                            Toggle(isOn: $booleanValue) {
-                                Text(label)
-                            }
-                        }.padding(.top)
+                        toggleView(label: label, isOn: $booleanValue)
 
                     case let .conditionalDecimal(key):
-                        HStack {
-                            Toggle(isOn: $booleanValue) {
-                                Text(label)
-                            }
-                        }.padding(.vertical)
-
-                        if $booleanValue.wrappedValue {
-                            if let setting = getPickerSetting(for: key) {
-                                VStack {
-                                    HStack {
-                                        Text(conditionalLabel ?? label)
-
-                                        Spacer()
-
-                                        Group {
-                                            if setting.type == PickerSetting.PickerSettingType.glucose {
-                                                Text(
-                                                    units == .mmolL ? decimalValue.asMmolL.description : decimalValue
-                                                        .description
-                                                )
-                                                .foregroundColor(!displayPicker ? .primary : .accentColor)
-                                                Text(units == .mgdL ? " mg/dL" : " mmol/L").foregroundColor(.secondary)
-                                            } else if setting.type == PickerSetting.PickerSettingType.factor {
-                                                Text("\(decimalValue * 100)")
-                                                    .foregroundColor(!displayPicker ? .primary : .accentColor)
-
-                                                Text(" %").foregroundColor(.secondary)
-                                            } else if setting.type == PickerSetting.PickerSettingType.insulinUnit {
-                                                Text("\(decimalValue)")
-                                                    .foregroundColor(!displayPicker ? .primary : .accentColor)
-
-                                                Text(NSLocalizedString(" U", comment: "Insulin unit")).foregroundColor(.secondary)
-                                            } else if setting.type == PickerSetting.PickerSettingType.gramms {
-                                                Text("\(decimalValue)")
-                                                    .foregroundColor(!displayPicker ? .primary : .accentColor)
-
-                                                Text(NSLocalizedString(" g", comment: "gram of carbs"))
-                                                    .foregroundColor(.secondary)
-                                            } else if setting.type == PickerSetting.PickerSettingType.minute {
-                                                Text("\(decimalValue)")
-                                                    .foregroundColor(!displayPicker ? .primary : .accentColor)
-
-                                                Text(" min").foregroundColor(.secondary)
-                                            } else if setting.type == PickerSetting.PickerSettingType.hour {
-                                                Text("\(decimalValue)")
-                                                    .foregroundColor(!displayPicker ? .primary : .accentColor)
-
-                                                Text(" hr").foregroundColor(.secondary)
-                                            }
-                                        }.onTapGesture {
-                                            displayConditionalPicker.toggle()
-                                        }
-                                    }.padding(.top)
-
-                                    if displayConditionalPicker {
-                                        Picker(selection: $decimalValue, label: Text("")) {
-                                            ForEach(
-                                                pickerSettingsProvider.generatePickerValues(from: setting),
-                                                id: \.self
-                                            ) { value in
-                                                if setting.type == PickerSetting.PickerSettingType.glucose {
-                                                    let displayValue = units == .mgdL ? value : value.asMmolL
-                                                    Text("\(displayValue.description) \(units.rawValue)").tag(value)
-                                                } else if setting.type == PickerSetting.PickerSettingType.factor {
-                                                    let factorValue = value * 100
-                                                    Text("\(factorValue.description) %").tag(value)
-                                                } else {
-                                                    Text("\(value.description)").tag(value)
-                                                }
-                                            }
-                                        }
-                                        .pickerStyle(WheelPickerStyle())
-                                        .frame(maxWidth: .infinity)
-                                    }
-                                }
+                        VStack {
+                            toggleView(label: label, isOn: $booleanValue)
+                            if booleanValue, let setting = getPickerSetting(for: key) {
+                                pickerView(
+                                    label: conditionalLabel ?? label,
+                                    displayPicker: $displayConditionalPicker,
+                                    setting: setting,
+                                    decimalValue: $decimalValue
+                                )
                             }
                         }
                     }
 
-                    HStack(alignment: .top) {
-                        Text(miniHint)
-                            .font(.footnote)
-                            .foregroundColor(.secondary)
-                            .lineLimit(nil)
-                        Spacer()
-                        Button(
-                            action: {
-                                shouldDisplayHint.toggle()
-                                selectedVerboseHint = shouldDisplayHint ? verboseHint : nil
-                            },
-                            label: {
-                                HStack {
-                                    Image(systemName: "questionmark.circle")
-                                }
-                            }
-                        ).buttonStyle(BorderlessButtonStyle())
-                    }.padding(.vertical)
+                    hintSection(
+                        miniHint: miniHint,
+                        shouldDisplayHint: $shouldDisplayHint,
+                        verboseHint: verboseHint
+                    )
                 }
             },
-            header: {
-                if let headerText = headerText {
-                    Text(headerText)
-                }
-            },
-            footer: {
-                if let footerText = footerText {
-                    Text(footerText)
-                }
-            }
+            header: { headerText.map(Text.init) },
+            footer: { footerText.map(Text.init) }
         ).listRowBackground(Color.chart)
     }
 
@@ -331,4 +179,78 @@ struct SettingInputSection: View {
             return nil
         }
     }
+
+    private func pickerView(
+        label: String,
+        displayPicker: Binding<Bool>,
+        setting: PickerSetting,
+        decimalValue: Binding<Decimal>
+    ) -> some View {
+        VStack {
+            HStack {
+                Text(label)
+                Spacer()
+                displayText(for: setting, decimalValue: decimalValue.wrappedValue)
+                    .foregroundColor(!displayPicker.wrappedValue ? .primary : .accentColor)
+                    .onTapGesture {
+                        displayPicker.wrappedValue.toggle()
+                    }
+            }.padding(.top)
+
+            if displayPicker.wrappedValue {
+                Picker(selection: decimalValue, label: Text("")) {
+                    ForEach(pickerSettingsProvider.generatePickerValues(from: setting), id: \.self) { value in
+                        displayText(for: setting, decimalValue: value).tag(value)
+                    }
+                }
+                .pickerStyle(WheelPickerStyle())
+                .frame(maxWidth: .infinity)
+            }
+        }
+    }
+
+    private func displayText(for setting: PickerSetting, decimalValue: Decimal) -> Text {
+        switch setting.type {
+        case .glucose:
+            let displayValue = units == .mmolL ? decimalValue.asMmolL : decimalValue
+            return Text("\(displayValue.description) \(units.rawValue)")
+        case .factor:
+            return Text("\(decimalValue * 100) %")
+        case .insulinUnit:
+            return Text("\(decimalValue) U")
+        case .gramms:
+            return Text("\(decimalValue) g")
+        case .minute:
+            return Text("\(decimalValue) min")
+        case .hour:
+            return Text("\(decimalValue) hr")
+        }
+    }
+
+    private func toggleView(label: String, isOn: Binding<Bool>) -> some View {
+        HStack {
+            Toggle(isOn: isOn) {
+                Text(label)
+            }
+        }.padding(.top)
+    }
+
+    private func hintSection(miniHint: String, shouldDisplayHint: Binding<Bool>, verboseHint: String) -> some View {
+        HStack(alignment: .top) {
+            Text(miniHint)
+                .font(.footnote)
+                .foregroundColor(.secondary)
+                .lineLimit(nil)
+            Spacer()
+            Button(action: {
+                shouldDisplayHint.wrappedValue.toggle()
+                selectedVerboseHint = shouldDisplayHint.wrappedValue ? verboseHint : nil
+            }) {
+                HStack {
+                    Image(systemName: "questionmark.circle")
+                }
+            }
+            .buttonStyle(BorderlessButtonStyle())
+        }.padding(.vertical)
+    }
 }