Browse Source

change ISF/CR toggles to a menu picker

Mike Plante 1 year ago
parent
commit
6471e223a9

+ 3 - 8
FreeAPS/Sources/APS/Storage/OverrideStorage.swift

@@ -124,6 +124,9 @@ final class BaseOverrideStorage: OverrideStorage, Injectable {
             newOverride.duration = override.duration as NSDecimalNumber
             newOverride.indefinite = override.indefinite
             newOverride.percentage = override.percentage
+            newOverride.isfAndCr = override.isfAndCr
+            newOverride.isf = override.isf
+            newOverride.cr = override.cr
             newOverride.enabled = override.enabled
             newOverride.smbIsOff = override.smbIsOff
             if override.overrideTarget {
@@ -136,14 +139,6 @@ final class BaseOverrideStorage: OverrideStorage, Injectable {
             if override.advancedSettings {
                 newOverride.advancedSettings = true
 
-                if !override.isfAndCr {
-                    newOverride.isfAndCr = false
-                    newOverride.isf = override.isf
-                    newOverride.cr = override.cr
-                } else {
-                    newOverride.isfAndCr = true
-                }
-
                 if override.smbIsScheduledOff {
                     newOverride.smbIsScheduledOff = true
                     newOverride.start = override.start as NSDecimalNumber

+ 32 - 9
FreeAPS/Sources/Modules/OverrideConfig/View/AddOverrideForm.swift

@@ -4,6 +4,7 @@ import SwiftUI
 struct AddOverrideForm: View {
     @Environment(\.presentationMode) var presentationMode
     @StateObject var state: OverrideConfig.StateModel
+    @State private var selectedApplyToOption: ApplyToOption = .isfAndCr
     @State private var displayPickerDuration: Bool = false
     @State private var displayPickerStart: Bool = false
     @State private var displayPickerEnd: Bool = false
@@ -18,6 +19,13 @@ struct AddOverrideForm: View {
 
     @Environment(\.dismiss) var dismiss
 
+    enum ApplyToOption: String, CaseIterable {
+        case isfAndCr = "ISF/CR"
+        case isf = "ISF"
+        case cr = "CR"
+        case none = "None"
+    }
+
     var color: LinearGradient {
         colorScheme == .dark ? LinearGradient(
             gradient: Gradient(colors: [
@@ -127,16 +135,31 @@ struct AddOverrideForm: View {
                     step: 1
                 )
 
-                Toggle(isOn: $state.isfAndCr) {
-                    Text("Change ISF and CR")
-                }
-                if !state.isfAndCr {
-                    Toggle(isOn: $state.isf) {
-                        Text("Change ISF")
+                // Picker for ISF/CR settings
+                Picker("Apply to", selection: $selectedApplyToOption) {
+                    ForEach(ApplyToOption.allCases, id: \.self) { option in
+                        Text(option.rawValue).tag(option)
                     }
-
-                    Toggle(isOn: $state.cr) {
-                        Text("Change CR")
+                }
+                .pickerStyle(MenuPickerStyle())
+                .onChange(of: selectedApplyToOption) { newValue in
+                    switch newValue {
+                    case .isfAndCr:
+                        state.isfAndCr = true
+                        state.isf = true
+                        state.cr = true
+                    case .isf:
+                        state.isfAndCr = false
+                        state.isf = true
+                        state.cr = false
+                    case .cr:
+                        state.isfAndCr = false
+                        state.isf = false
+                        state.cr = true
+                    case .none:
+                        state.isfAndCr = false
+                        state.isf = false
+                        state.cr = false
                     }
                 }
             }

+ 39 - 12
FreeAPS/Sources/Modules/OverrideConfig/View/EditOverrideForm.swift

@@ -22,6 +22,7 @@ struct EditOverrideForm: View {
     @State private var cr: Bool
     @State private var smbMinutes: Decimal?
     @State private var uamMinutes: Decimal?
+    @State private var selectedApplyToOption: ApplyToOption
 
     @State private var hasChanges = false
     @State private var isEditing = false
@@ -53,10 +54,21 @@ struct EditOverrideForm: View {
         _isfAndCr = State(initialValue: overrideToEdit.isfAndCr)
         _isf = State(initialValue: overrideToEdit.isf)
         _cr = State(initialValue: overrideToEdit.cr)
+        _selectedApplyToOption = State(
+            initialValue: overrideToEdit
+                .isfAndCr ? .isfAndCr : (overrideToEdit.isf ? .isf : (overrideToEdit.cr ? .cr : .none))
+        )
         _smbMinutes = State(initialValue: overrideToEdit.smbMinutes?.decimalValue)
         _uamMinutes = State(initialValue: overrideToEdit.uamMinutes?.decimalValue)
     }
 
+    enum ApplyToOption: String, CaseIterable {
+        case isfAndCr = "ISF/CR"
+        case isf = "ISF"
+        case cr = "CR"
+        case none = "None"
+    }
+
     var color: LinearGradient {
         colorScheme == .dark ? LinearGradient(
             gradient: Gradient(colors: [
@@ -179,18 +191,33 @@ struct EditOverrideForm: View {
                     step: 1
                 ).onChange(of: percentage) { _ in hasChanges = true }
 
-                Toggle(isOn: $isfAndCr) {
-                    Text("Change ISF and CR")
-                }.onChange(of: isfAndCr) { _ in hasChanges = true }
-
-                if !isfAndCr {
-                    Toggle(isOn: $isf) {
-                        Text("Change ISF")
-                    }.onChange(of: isf) { _ in hasChanges = true }
-
-                    Toggle(isOn: $cr) {
-                        Text("Change CR")
-                    }.onChange(of: cr) { _ in hasChanges = true }
+                // Picker for ISF/CR settings
+                Picker("Apply to", selection: $selectedApplyToOption) {
+                    ForEach(ApplyToOption.allCases, id: \.self) { option in
+                        Text(option.rawValue).tag(option)
+                    }
+                }
+                .pickerStyle(MenuPickerStyle())
+                .onChange(of: selectedApplyToOption) { newValue in
+                    switch newValue {
+                    case .isfAndCr:
+                        isfAndCr = true
+                        isf = false
+                        cr = false
+                    case .isf:
+                        isfAndCr = false
+                        isf = true
+                        cr = false
+                    case .cr:
+                        isfAndCr = false
+                        isf = false
+                        cr = true
+                    case .none:
+                        isfAndCr = false
+                        isf = false
+                        cr = false
+                    }
+                    hasChanges = true
                 }
             }
 

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

@@ -512,7 +512,19 @@ extension OverrideConfig {
                 "\(maxMinutesSMB.formatted()) min SMB" : ""
             let maxUamMinsString = (maxMinutesUAM != 0 && preset.advancedSettings && maxMinutesUAM != state.defaultUamMinutes) ?
                 "\(maxMinutesUAM.formatted()) min UAM" : ""
-            let isfAndCRstring = (preset.isf == preset.cr) ? "" : (preset.isf ? " ISF" : " CR")
+            let isfAndCRstring: String = {
+                switch (preset.isfAndCr, preset.isf, preset.cr) {
+                case (_, true, true),
+                     (true, _, _):
+                    return " ISF/CR"
+                case (false, true, false):
+                    return " ISF"
+                case (false, false, true):
+                    return " CR"
+                default:
+                    return ""
+                }
+            }()
             let isSelected = preset.id == selectedPresetID
 
             let labels: [String] = [