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

TempTarget contributions (#92)

* Condition to show slider & show percentage for Presets

* based on Normal Target

* normalTarget to start with
Robert 1 год назад
Родитель
Сommit
c9e23bf096

+ 23 - 13
FreeAPS/Sources/Modules/OverrideConfig/OverrideStateModel.swift

@@ -46,6 +46,7 @@ extension OverrideConfig {
         var units: GlucoseUnits = .mgdL
 
         // temp target stuff
+        let normalTarget: Decimal = 100
         var tempTargetDuration: Decimal = 0
         var tempTargetName: String = ""
         var tempTargetTarget: Decimal = 0 // lel
@@ -854,13 +855,16 @@ extension OverrideConfig.StateModel {
     func handleAdjustSensToggle() {
         if !didAdjustSens {
             halfBasalTarget = settingHalfBasalTarget
-            percentage = Double(computeAdjustedPercentage(using: settingHalfBasalTarget) * 100)
+            percentage = Double(computeAdjustedPercentage(usingHBT: settingHalfBasalTarget) * 100)
         }
     }
 
+    func isAdjustSensEnabled(usingTarget initialTarget: Decimal? = nil) -> Bool {
+        computeSliderHigh(usingTarget: initialTarget) > computeSliderLow(usingTarget: initialTarget)
+    }
+
     func computeHalfBasalTarget() -> Double {
         let adjustmentRatio = Decimal(percentage / 100)
-        let normalTarget: Decimal = 100
         let tempTargetValue: Decimal = tempTargetTarget
         var halfBasalTargetValue = halfBasalTarget
         if adjustmentRatio != 1 {
@@ -870,11 +874,12 @@ extension OverrideConfig.StateModel {
         return round(Double(halfBasalTargetValue))
     }
 
-    func computeSliderLow() -> Double {
+    func computeSliderLow(usingTarget initialTarget: Decimal? = nil) -> Double {
         var minSens: Double = 15
-        let tempTargetValue = tempTargetTarget
+        var calcTarget = initialTarget
+        let tempTargetValue = calcTarget != nil ? calcTarget : tempTargetTarget
         if tempTargetValue == 0 { return minSens }
-        if tempTargetValue < 100 ||
+        if tempTargetValue ?? normalTarget <= normalTarget ||
             (
                 !settingsManager.preferences.highTemptargetRaisesSensitivity && !settingsManager.preferences
                     .exerciseMode
@@ -883,25 +888,30 @@ extension OverrideConfig.StateModel {
         return minSens
     }
 
-    func computeSliderHigh() -> Double {
+    func computeSliderHigh(usingTarget initialTarget: Decimal? = nil) -> Double {
+        var calcTarget = initialTarget
+        let tempTargetValue = calcTarget != nil ? calcTarget : tempTargetTarget
         var maxSens = Double(maxValue * 100)
-        let tempTargetValue = tempTargetTarget
         if tempTargetValue == 0 { return maxSens }
-        if tempTargetValue > 100 || !settingsManager.preferences.lowTemptargetLowersSensitivity { maxSens = 100 }
+        if tempTargetValue ?? normalTarget >= normalTarget || !settingsManager.preferences
+            .lowTemptargetLowersSensitivity { maxSens = 100 }
         return maxSens
     }
 
-    func computeAdjustedPercentage(using initialHalfBasalTarget: Decimal? = nil) -> Decimal {
+    func computeAdjustedPercentage(
+        usingHBT initialHalfBasalTarget: Decimal? = nil,
+        usingTarget initialTarget: Decimal? = nil
+    ) -> Decimal {
         let halfBasalTargetValue = initialHalfBasalTarget ?? halfBasalTarget
-        let normalTarget: Decimal = 100
+        let calcTarget = initialTarget
         let deviationFromNormal = (halfBasalTargetValue - normalTarget)
-        let tempTargetValue = tempTargetTarget
+        let tempTargetValue = calcTarget != nil ? calcTarget : tempTargetTarget
         var adjustmentRatio: Decimal = 1
 
-        if deviationFromNormal * (deviationFromNormal + tempTargetValue - normalTarget) <= 0 {
+        if deviationFromNormal * (deviationFromNormal + (tempTargetValue ?? normalTarget) - normalTarget) <= 0 {
             adjustmentRatio = maxValue
         } else {
-            adjustmentRatio = deviationFromNormal / (deviationFromNormal + tempTargetValue - normalTarget)
+            adjustmentRatio = deviationFromNormal / (deviationFromNormal + (tempTargetValue ?? normalTarget) - normalTarget)
         }
 
         adjustmentRatio = min(adjustmentRatio, maxValue)

+ 64 - 69
FreeAPS/Sources/Modules/OverrideConfig/View/AddTempTargetForm.swift

@@ -58,10 +58,6 @@ struct AddTempTargetForm: View {
         return formatter
     }
 
-    var isSliderEnabled: Bool {
-        state.computeSliderHigh() > state.computeSliderLow()
-    }
-
     var body: some View {
         NavigationView {
             List {
@@ -95,9 +91,7 @@ struct AddTempTargetForm: View {
             }
             .onAppear {
                 targetStep = state.units == .mgdL ? 5 : 9
-                Task {
-                    await state.getCurrentGlucoseTarget()
-                }
+                state.tempTargetTarget = state.normalTarget
             }
         }
     }
@@ -210,72 +204,73 @@ struct AddTempTargetForm: View {
                 }
             }.listRowBackground(Color.chart)
 
-            if state.tempTargetTarget != state.currentGlucoseTarget {
+            if state.tempTargetTarget != state.normalTarget {
                 let computedHalfBasalTarget = state.computeHalfBasalTarget()
-
-                Section(
-                    header: HStack {
-                        if state
-                            .tempTargetTarget > state.currentGlucoseTarget
-                        {
-                            HStack(spacing: 5) {
-                                Text("Sensitivity")
-                                Image(systemName: "arrow.up.circle")
-                                Text("Insulin")
-                                Image(systemName: "arrow.down.circle")
-                                Text("using \(formattedPercentage(state.percentage))% of default.")
+                if state.isAdjustSensEnabled() {
+                    Section(
+                        header: HStack {
+                            if state
+                                .tempTargetTarget > state.normalTarget
+                            {
+                                HStack(spacing: 5) {
+                                    Text("Sensitivity")
+                                    Image(systemName: "arrow.up.circle")
+                                    Text("Insulin")
+                                    Image(systemName: "arrow.down.circle")
+                                    Text("using \(formattedPercentage(state.percentage))% of default.")
+                                }
                             }
-                        } else {
-                            HStack(spacing: 5) {
-                                Text("Sensitivity")
-                                Image(systemName: "arrow.down.circle")
-                                Text("Insulin")
-                                Image(systemName: "arrow.up.circle")
-                                Text("using \(formattedPercentage(state.percentage))% of default.")
+                            if state.tempTargetTarget < state.normalTarget {
+                                HStack(spacing: 5) {
+                                    Text("Sensitivity")
+                                    Image(systemName: "arrow.down.circle")
+                                    Text("Insulin")
+                                    Image(systemName: "arrow.up.circle")
+                                    Text("using \(formattedPercentage(state.percentage))% of default.")
+                                }
                             }
                         }
-                    }
-                    .textCase(.none)
-                    .foregroundStyle(colorScheme == .dark ? Color.orange : Color.accentColor),
-                    content: {
-                        VStack {
-                            Text("\(Int(state.percentage)) % Insulin")
-                                .foregroundColor(isUsingSlider ? .orange : Color.tabBar)
-                                .font(.title3)
-                                .fontWeight(.bold)
-                            Slider(
-                                value: $state.percentage,
-                                in: state.computeSliderLow() ... state.computeSliderHigh(),
-                                step: 5
-                            ) {} minimumValueLabel: {
-                                Text("\(state.computeSliderLow(), specifier: "%.0f")%")
-                            } maximumValueLabel: {
-                                Text("\(state.computeSliderHigh(), specifier: "%.0f")%")
-                            } onEditingChanged: { editing in
-                                isUsingSlider = editing
-                                state.halfBasalTarget = Decimal(state.computeHalfBasalTarget())
-                            }
-                            .disabled(!isSliderEnabled)
-
-                            Divider()
-
-                            HStack {
-                                Text(
-                                    "Half Basal Exercise Target:"
-                                )
-                                Spacer()
-                                Text(
-                                    (
-                                        state.units == .mgdL ? computedHalfBasalTarget.description : computedHalfBasalTarget
-                                            .formattedAsMmolL
-                                    ) + " " + state.units.rawValue
-                                )
-                            }.foregroundStyle(.primary)
-                        }.padding(.vertical, 10)
-                    }
-                )
-                .listRowBackground(Color.chart)
-                .padding(.top, -10)
+                        .textCase(.none)
+                        .foregroundStyle(colorScheme == .dark ? Color.orange : Color.accentColor),
+                        content: {
+                            VStack {
+                                Text("\(Int(state.percentage)) % Insulin")
+                                    .foregroundColor(isUsingSlider ? .orange : Color.tabBar)
+                                    .font(.title3)
+                                    .fontWeight(.bold)
+                                Slider(
+                                    value: $state.percentage,
+                                    in: state.computeSliderLow() ... state.computeSliderHigh(),
+                                    step: 5
+                                ) {} minimumValueLabel: {
+                                    Text("\(state.computeSliderLow(), specifier: "%.0f")%")
+                                } maximumValueLabel: {
+                                    Text("\(state.computeSliderHigh(), specifier: "%.0f")%")
+                                } onEditingChanged: { editing in
+                                    isUsingSlider = editing
+                                    state.halfBasalTarget = Decimal(state.computeHalfBasalTarget())
+                                }
+
+                                Divider()
+
+                                HStack {
+                                    Text(
+                                        "Half Basal Exercise Target:"
+                                    )
+                                    Spacer()
+                                    Text(
+                                        (
+                                            state.units == .mgdL ? computedHalfBasalTarget.description : computedHalfBasalTarget
+                                                .formattedAsMmolL
+                                        ) + " " + state.units.rawValue
+                                    )
+                                }.foregroundStyle(.primary)
+                            }.padding(.vertical, 10)
+                        }
+                    )
+                    .listRowBackground(Color.chart)
+                    .padding(.top, -10)
+                }
             }
         }
     }

+ 13 - 1
FreeAPS/Sources/Modules/OverrideConfig/View/OverrideRootView.swift

@@ -405,7 +405,16 @@ extension OverrideConfig {
 
         private func tempTargetView(for preset: TempTargetStored) -> some View {
             var target = preset.target
+            let presetTarget = Decimal(target as! Double.RawValue)
             let isSelected = preset.id?.uuidString == selectedTempTargetPresetID
+            let presetHalfBasalTarget = Decimal(
+                preset.halfBasalTarget as? Double
+                    .RawValue ?? Double(state.settingHalfBasalTarget)
+            )
+            let percentage = Int(
+                state
+                    .computeAdjustedPercentage(usingHBT: presetHalfBasalTarget, usingTarget: presetTarget) * 100
+            )
 
             return ZStack(alignment: .trailing, content: {
                 HStack {
@@ -427,7 +436,10 @@ extension OverrideConfig {
                             Text("min")
                                 .foregroundColor(.secondary)
                                 .font(.caption)
-
+                            if state.isAdjustSensEnabled(usingTarget: presetTarget) { Text(", \(percentage)%")
+                                .foregroundColor(.secondary)
+                                .font(.caption)
+                            }
                             Spacer()
                         }.padding(.top, 2)
                     }