polscm32 aka Marvout 1 год назад
Родитель
Сommit
706a5b72c0

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

@@ -42,8 +42,6 @@ extension OverrideConfig {
         var units: GlucoseUnits = .mgdL
         var units: GlucoseUnits = .mgdL
 
 
         // temp target stuff
         // temp target stuff
-        @Published var low: Decimal = 0
-        @Published var high: Decimal = 0
         @Published var tempTargetDuration: Decimal = 0
         @Published var tempTargetDuration: Decimal = 0
         @Published var tempTargetName: String = ""
         @Published var tempTargetName: String = ""
         @Published var tempTargetTarget: Decimal = 0 // lel
         @Published var tempTargetTarget: Decimal = 0 // lel
@@ -495,6 +493,7 @@ extension OverrideConfig.StateModel {
             if let tempTargetToEdit = try viewContext.existingObject(with: firstID) as? TempTargetStored {
             if let tempTargetToEdit = try viewContext.existingObject(with: firstID) as? TempTargetStored {
                 currentActiveTempTarget = tempTargetToEdit
                 currentActiveTempTarget = tempTargetToEdit
                 activeTempTargetName = tempTargetToEdit.name ?? "Custom Temp Target"
                 activeTempTargetName = tempTargetToEdit.name ?? "Custom Temp Target"
+                tempTargetTarget = tempTargetToEdit.target?.decimalValue ?? 0
             }
             }
         } catch {
         } catch {
             debugPrint(
             debugPrint(
@@ -729,7 +728,7 @@ extension OverrideConfig.StateModel {
     func computeHalfBasalTarget() -> Double {
     func computeHalfBasalTarget() -> Double {
         let ratio = Decimal(percentage / 100)
         let ratio = Decimal(percentage / 100)
         let normalTarget: Decimal = 100
         let normalTarget: Decimal = 100
-        var target: Decimal = low
+        var target: Decimal = tempTargetTarget
         if units == .mmolL {
         if units == .mmolL {
             target = target.asMgdL }
             target = target.asMgdL }
         var hbtcalc = halfBasalTarget
         var hbtcalc = halfBasalTarget
@@ -738,6 +737,30 @@ extension OverrideConfig.StateModel {
         }
         }
         return round(Double(hbtcalc))
         return round(Double(hbtcalc))
     }
     }
+
+    func computeSliderLow() -> Double {
+        var minSens: Double = 15
+        var target = tempTargetTarget
+        if units == .mmolL {
+            target = Decimal(round(Double(tempTargetTarget.asMgdL))) }
+        if target == 0 { return minSens }
+        if target < 100 ||
+            (
+                !settingsManager.preferences.highTemptargetRaisesSensitivity && !settingsManager.preferences
+                    .exerciseMode
+            ) { minSens = 100 }
+        return minSens
+    }
+
+    func computeSliderHigh() -> Double {
+        var maxSens = Double(maxValue * 100)
+        var target = tempTargetTarget
+        if target == 0 { return maxSens }
+        if units == .mmolL {
+            target = Decimal(round(Double(tempTargetTarget.asMgdL))) }
+        if target > 100 || !settingsManager.preferences.lowTemptargetLowersSensitivity { maxSens = 100 }
+        return maxSens
+    }
 }
 }
 
 
 extension OverrideConfig.StateModel: SettingsObserver {
 extension OverrideConfig.StateModel: SettingsObserver {

+ 36 - 53
FreeAPS/Sources/Modules/OverrideConfig/View/AddTempTargetForm.swift

@@ -86,37 +86,40 @@ struct AddTempTargetForm: View {
             Text("Name")
             Text("Name")
         }.listRowBackground(Color.chart)
         }.listRowBackground(Color.chart)
 
 
-        Section {
-            VStack {
-                Text("\(state.percentage.formatted(.number)) % Insulin")
-                    .foregroundColor(isUsingSlider ? .orange : Color.tabBar)
-                    .font(.largeTitle)
+        if state.computeSliderLow() != state.computeSliderHigh() {
+            Section {
+                VStack {
+                    Text("\(state.percentage.formatted(.number)) % Insulin")
+                        .foregroundColor(isUsingSlider ? .orange : Color.tabBar)
+                        .font(.largeTitle)
 
 
-                Slider(value: $state.percentage, in: computeSliderLow() ... computeSliderHigh(), step: 5) {}
-                minimumValueLabel: {
-                    Text("\(computeSliderLow(), specifier: "%.0f")%")
-                }
-                maximumValueLabel: {
-                    Text("\(computeSliderHigh(), specifier: "%.0f")%")
-                }
-                onEditingChanged: { editing in
-                    isUsingSlider = editing
-                    state.halfBasalTarget = Decimal(state.computeHalfBasalTarget())
-                }
+                    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(!sliderEnabled)
 
 
-                Divider()
-                Text(
-                    state
-                        .units == .mgdL ?
-                        "Half Basal Exercise Target at: \(state.computeHalfBasalTarget().formatted(.number.precision(.fractionLength(0)))) mg/dl" :
-                        "Half Basal Exercise Target at: \(state.computeHalfBasalTarget().asMmolL.formatted(.number.grouping(.never).rounded().precision(.fractionLength(1)))) mmol/L"
-                )
-                .foregroundColor(.secondary)
-                .font(.caption).italic()
-            }
-        } header: {
-            Text("% Insulin")
-        }.listRowBackground(Color.chart)
+                    Divider()
+                    Text(
+                        state
+                            .units == .mgdL ?
+                            "Half Basal Exercise Target at: \(state.computeHalfBasalTarget().formatted(.number.precision(.fractionLength(0)))) mg/dl" :
+                            "Half Basal Exercise Target at: \(state.computeHalfBasalTarget().asMmolL.formatted(.number.grouping(.never).rounded().precision(.fractionLength(1)))) mmol/L"
+                    )
+                    .foregroundColor(.secondary)
+                    .font(.caption).italic()
+                }
+            } header: {
+                Text("% Insulin")
+            }.listRowBackground(Color.chart)
+        }
 
 
         Section {
         Section {
             HStack {
             HStack {
@@ -160,6 +163,10 @@ struct AddTempTargetForm: View {
         }.listRowBackground(Color.chart)
         }.listRowBackground(Color.chart)
     }
     }
 
 
+    var sliderEnabled: Bool {
+        state.computeSliderHigh() > state.computeSliderLow()
+    }
+
     private func setupAlertString() async {
     private func setupAlertString() async {
         alertString =
         alertString =
             (
             (
@@ -184,28 +191,4 @@ struct AddTempTargetForm: View {
                 comment: ""
                 comment: ""
             )
             )
     }
     }
-
-    func computeSliderLow() -> Double {
-        var minSens: Double = 15
-        var target = state.low
-        if state.units == .mmolL {
-            target = Decimal(round(Double(state.low.asMgdL))) }
-        if target == 0 { return minSens }
-        if target < 100 ||
-            (
-                !state.settingsManager.preferences.highTemptargetRaisesSensitivity && !state.settingsManager.preferences
-                    .exerciseMode
-            ) { minSens = 100 }
-        return minSens
-    }
-
-    func computeSliderHigh() -> Double {
-        var maxSens = Double(state.maxValue * 100)
-        var target = state.low
-        if target == 0 { return maxSens }
-        if state.units == .mmolL {
-            target = Decimal(round(Double(state.low.asMgdL))) }
-        if target > 100 || !state.settingsManager.preferences.lowTemptargetLowersSensitivity { maxSens = 100 }
-        return maxSens
-    }
 }
 }

+ 71 - 0
FreeAPS/Sources/Modules/OverrideConfig/View/EditTempTargetForm.swift

@@ -11,9 +11,12 @@ struct EditTempTargetForm: View {
     @State private var target: Decimal
     @State private var target: Decimal
     @State private var duration: Decimal
     @State private var duration: Decimal
     @State private var date: Date
     @State private var date: Date
+    @State private var halfBasalTarget: Decimal
+    @State private var percentage: Decimal
 
 
     @State private var hasChanges = false
     @State private var hasChanges = false
     @State private var showAlert = false
     @State private var showAlert = false
+    @State private var isUsingSlider = false
 
 
     init(tempTargetToEdit: TempTargetStored, state: OverrideConfig.StateModel) {
     init(tempTargetToEdit: TempTargetStored, state: OverrideConfig.StateModel) {
         tempTarget = tempTargetToEdit
         tempTarget = tempTargetToEdit
@@ -22,6 +25,16 @@ struct EditTempTargetForm: View {
         _target = State(initialValue: tempTargetToEdit.target?.decimalValue ?? 0)
         _target = State(initialValue: tempTargetToEdit.target?.decimalValue ?? 0)
         _duration = State(initialValue: tempTargetToEdit.duration?.decimalValue ?? 0)
         _duration = State(initialValue: tempTargetToEdit.duration?.decimalValue ?? 0)
         _date = State(initialValue: tempTargetToEdit.date ?? Date())
         _date = State(initialValue: tempTargetToEdit.date ?? Date())
+        _halfBasalTarget = State(initialValue: tempTargetToEdit.halfBasalTarget?.decimalValue ?? 160)
+
+        let normalTarget: Decimal = 100
+        if let halfBasal = tempTargetToEdit.halfBasalTarget?.decimalValue {
+            let target = state.units == .mgdL ? state.tempTargetTarget.asMgdL : state.tempTargetTarget
+            let ratio = (halfBasal - normalTarget + (normalTarget * target) / 2) / normalTarget
+            _percentage = State(initialValue: ratio * 100)
+        } else {
+            _percentage = State(initialValue: 100)
+        }
     }
     }
 
 
     var color: LinearGradient {
     var color: LinearGradient {
@@ -100,6 +113,63 @@ struct EditTempTargetForm: View {
         }.listRowBackground(Color.chart)
         }.listRowBackground(Color.chart)
 
 
         Section {
         Section {
+            VStack {
+                VStack {
+                    Text("\(state.percentage.formatted(.number)) % Insulin")
+                        .foregroundColor(isUsingSlider ? .orange : Color.tabBar)
+                        .font(.largeTitle)
+
+                    Slider(value: Binding(
+                        get: {
+                            Double(truncating: percentage as NSNumber) // Decimal in Double umwandeln
+                        },
+                        set: { newValue in
+                            percentage = Decimal(newValue) // Den neuen Slider-Wert speichern
+                            hasChanges = true
+
+                            // Berechne das halfBasalTarget basierend auf dem neuen percentage-Wert
+                            let ratio = Decimal(Int(percentage) / 100)
+                            let normalTarget: Decimal = 100
+                            var target: Decimal = state.tempTargetTarget
+                            if state.units == .mmolL {
+                                target = target.asMgdL
+                            }
+
+                            if ratio != 1 {
+                                let hbtcalc = ((2 * ratio * normalTarget) - normalTarget - (ratio * target)) / (ratio - 1)
+                                halfBasalTarget = hbtcalc
+                            } else {
+                                halfBasalTarget = normalTarget
+                            }
+                        }
+                    ), in: Double(state.computeSliderLow()) ... Double(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()
+                    Text(
+                        state
+                            .units == .mgdL ?
+                            "Half Basal Exercise Target at: \(state.halfBasalTarget.formatted(.number.precision(.fractionLength(0)))) mg/dl" :
+                            "Half Basal Exercise Target at: \(state.halfBasalTarget.asMmolL.formatted(.number.grouping(.never).rounded().precision(.fractionLength(1)))) mmol/L"
+                    )
+                    .foregroundColor(.secondary)
+                    .font(.caption).italic()
+                }
+            }
+        } header: {
+            Text("% Insulin")
+        }.listRowBackground(Color.chart)
+
+        Section {
             HStack {
             HStack {
                 Text("Target")
                 Text("Target")
                 Spacer()
                 Spacer()
@@ -184,6 +254,7 @@ struct EditTempTargetForm: View {
         tempTarget.duration = NSDecimalNumber(decimal: duration)
         tempTarget.duration = NSDecimalNumber(decimal: duration)
         tempTarget.date = date
         tempTarget.date = date
         tempTarget.isUploadedToNS = false
         tempTarget.isUploadedToNS = false
+        tempTarget.halfBasalTarget = NSDecimalNumber(decimal: halfBasalTarget)
     }
     }
 
 
     private func resetValues() {
     private func resetValues() {