|
|
@@ -67,7 +67,8 @@ extension OverrideProfilesConfig {
|
|
|
var editPresetPopover: some View {
|
|
|
Form {
|
|
|
nameSection(header: "Keep or change name?")
|
|
|
- settingsSection(header: "New settings to save")
|
|
|
+ // settingsSection(header: "New settings to save")
|
|
|
+ settingsConfig(header: "Change settings")
|
|
|
Section {
|
|
|
Button("Save") {
|
|
|
guard let selectedPreset = selectedPreset else { return }
|
|
|
@@ -91,6 +92,122 @@ extension OverrideProfilesConfig {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ @ViewBuilder private func settingsConfig(header: String) -> some View {
|
|
|
+ Section {
|
|
|
+ VStack {
|
|
|
+ Slider(
|
|
|
+ value: $state.percentage,
|
|
|
+ in: 10 ... 200,
|
|
|
+ step: 1,
|
|
|
+ onEditingChanged: { editing in
|
|
|
+ isEditing = editing
|
|
|
+ }
|
|
|
+ ).accentColor(state.percentage >= 130 ? .red : .blue)
|
|
|
+ Text("\(state.percentage.formatted(.number)) %")
|
|
|
+ .foregroundColor(
|
|
|
+ state
|
|
|
+ .percentage >= 130 ? .red :
|
|
|
+ (isEditing ? .orange : .blue)
|
|
|
+ )
|
|
|
+ .font(.largeTitle)
|
|
|
+ Spacer()
|
|
|
+ Toggle(isOn: $state._indefinite) {
|
|
|
+ Text("Enable indefinitely")
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if !state._indefinite {
|
|
|
+ HStack {
|
|
|
+ Text("Duration")
|
|
|
+ DecimalTextField("0", value: $state.duration, formatter: formatter, cleanInput: false)
|
|
|
+ Text("minutes").foregroundColor(.secondary)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ HStack {
|
|
|
+ Toggle(isOn: $state.override_target) {
|
|
|
+ Text("Override Profile Target")
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if state.override_target {
|
|
|
+ HStack {
|
|
|
+ Text("Target Glucose")
|
|
|
+ DecimalTextField("0", value: $state.target, formatter: glucoseFormatter, cleanInput: false)
|
|
|
+ Text(state.units.rawValue).foregroundColor(.secondary)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ HStack {
|
|
|
+ Toggle(isOn: $state.advancedSettings) {
|
|
|
+ Text("More options")
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if state.advancedSettings {
|
|
|
+ HStack {
|
|
|
+ Toggle(isOn: $state.smbIsOff) {
|
|
|
+ Text("Always Disable SMBs")
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if !state.smbIsOff {
|
|
|
+ HStack {
|
|
|
+ Toggle(isOn: $state.smbIsScheduledOff) {
|
|
|
+ Text("Schedule when SMBs are Off")
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if state.smbIsScheduledOff {
|
|
|
+ HStack {
|
|
|
+ Text("First Hour SMBs are Off (24 hours)")
|
|
|
+ DecimalTextField("0", value: $state.start, formatter: formatter, cleanInput: false)
|
|
|
+ Text("hour").foregroundColor(.secondary)
|
|
|
+ }
|
|
|
+ HStack {
|
|
|
+ Text("First Hour SMBs are Resumed (24 hours)")
|
|
|
+ DecimalTextField("0", value: $state.end, formatter: formatter, cleanInput: false)
|
|
|
+ Text("hour").foregroundColor(.secondary)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ HStack {
|
|
|
+ Toggle(isOn: $state.isfAndCr) {
|
|
|
+ Text("Change ISF and CR")
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if !state.isfAndCr {
|
|
|
+ HStack {
|
|
|
+ Toggle(isOn: $state.isf) {
|
|
|
+ Text("Change ISF")
|
|
|
+ }
|
|
|
+ }
|
|
|
+ HStack {
|
|
|
+ Toggle(isOn: $state.cr) {
|
|
|
+ Text("Change CR")
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ HStack {
|
|
|
+ Text("SMB Minutes")
|
|
|
+ DecimalTextField(
|
|
|
+ "0",
|
|
|
+ value: $state.smbMinutes,
|
|
|
+ formatter: formatter,
|
|
|
+ cleanInput: false
|
|
|
+ )
|
|
|
+ Text("minutes").foregroundColor(.secondary)
|
|
|
+ }
|
|
|
+ HStack {
|
|
|
+ Text("UAM SMB Minutes")
|
|
|
+ DecimalTextField(
|
|
|
+ "0",
|
|
|
+ value: $state.uamMinutes,
|
|
|
+ formatter: formatter,
|
|
|
+ cleanInput: false
|
|
|
+ )
|
|
|
+ Text("minutes").foregroundColor(.secondary)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } header: {
|
|
|
+ Text(header)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
@ViewBuilder private func settingsSection(header: String) -> some View {
|
|
|
Section(header: Text(header)) {
|
|
|
let percentString = Text("Override: \(Int(state.percentage))%")
|
|
|
@@ -150,139 +267,11 @@ extension OverrideProfilesConfig {
|
|
|
header: { Text("Activate profile override") }
|
|
|
footer: { VStack(alignment: .leading) {
|
|
|
Text("Swipe left on a profile to edit or delete it.")
|
|
|
- Text("When you want to edit a profile:")
|
|
|
- HStack(alignment: .top) {
|
|
|
- Text(" •")
|
|
|
- Text(
|
|
|
- "First use the profile configurator below and select the settings you want to include."
|
|
|
- )
|
|
|
- }
|
|
|
- HStack(alignment: .top) {
|
|
|
- Text(" •")
|
|
|
- Text(
|
|
|
- "Then swipe left on the profile you want to change and click the edit symbol."
|
|
|
- )
|
|
|
- }
|
|
|
- HStack(alignment: .top) {
|
|
|
- Text(" •")
|
|
|
- Text(
|
|
|
- "In the pop-up: Use the existing profile name or enter a new name and click save - Done!"
|
|
|
- )
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ settingsConfig(header: "Insulin")
|
|
|
Section {
|
|
|
- VStack {
|
|
|
- Slider(
|
|
|
- value: $state.percentage,
|
|
|
- in: 10 ... 200,
|
|
|
- step: 1,
|
|
|
- onEditingChanged: { editing in
|
|
|
- isEditing = editing
|
|
|
- }
|
|
|
- ).accentColor(state.percentage >= 130 ? .red : .blue)
|
|
|
- Text("\(state.percentage.formatted(.number)) %")
|
|
|
- .foregroundColor(
|
|
|
- state
|
|
|
- .percentage >= 130 ? .red :
|
|
|
- (isEditing ? .orange : .blue)
|
|
|
- )
|
|
|
- .font(.largeTitle)
|
|
|
- Spacer()
|
|
|
- Toggle(isOn: $state._indefinite) {
|
|
|
- Text("Enable indefinitely")
|
|
|
- }
|
|
|
- }
|
|
|
- if !state._indefinite {
|
|
|
- HStack {
|
|
|
- Text("Duration")
|
|
|
- DecimalTextField("0", value: $state.duration, formatter: formatter, cleanInput: false)
|
|
|
- Text("minutes").foregroundColor(.secondary)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- HStack {
|
|
|
- Toggle(isOn: $state.override_target) {
|
|
|
- Text("Override Profile Target")
|
|
|
- }
|
|
|
- }
|
|
|
- if state.override_target {
|
|
|
- HStack {
|
|
|
- Text("Target Glucose")
|
|
|
- DecimalTextField("0", value: $state.target, formatter: glucoseFormatter, cleanInput: false)
|
|
|
- Text(state.units.rawValue).foregroundColor(.secondary)
|
|
|
- }
|
|
|
- }
|
|
|
- HStack {
|
|
|
- Toggle(isOn: $state.advancedSettings) {
|
|
|
- Text("More options")
|
|
|
- }
|
|
|
- }
|
|
|
- if state.advancedSettings {
|
|
|
- HStack {
|
|
|
- Toggle(isOn: $state.smbIsOff) {
|
|
|
- Text("Always Disable SMBs")
|
|
|
- }
|
|
|
- }
|
|
|
- if !state.smbIsOff {
|
|
|
- HStack {
|
|
|
- Toggle(isOn: $state.smbIsScheduledOff) {
|
|
|
- Text("Schedule when SMBs are Off")
|
|
|
- }
|
|
|
- }
|
|
|
- if state.smbIsScheduledOff {
|
|
|
- HStack {
|
|
|
- Text("First Hour SMBs are Off (24 hours)")
|
|
|
- DecimalTextField("0", value: $state.start, formatter: formatter, cleanInput: false)
|
|
|
- Text("hour").foregroundColor(.secondary)
|
|
|
- }
|
|
|
- HStack {
|
|
|
- Text("First Hour SMBs are Resumed (24 hours)")
|
|
|
- DecimalTextField("0", value: $state.end, formatter: formatter, cleanInput: false)
|
|
|
- Text("hour").foregroundColor(.secondary)
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- HStack {
|
|
|
- Toggle(isOn: $state.isfAndCr) {
|
|
|
- Text("Change ISF and CR")
|
|
|
- }
|
|
|
- }
|
|
|
- if !state.isfAndCr {
|
|
|
- HStack {
|
|
|
- Toggle(isOn: $state.isf) {
|
|
|
- Text("Change ISF")
|
|
|
- }
|
|
|
- }
|
|
|
- HStack {
|
|
|
- Toggle(isOn: $state.cr) {
|
|
|
- Text("Change CR")
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- HStack {
|
|
|
- Text("SMB Minutes")
|
|
|
- DecimalTextField(
|
|
|
- "0",
|
|
|
- value: $state.smbMinutes,
|
|
|
- formatter: formatter,
|
|
|
- cleanInput: false
|
|
|
- )
|
|
|
- Text("minutes").foregroundColor(.secondary)
|
|
|
- }
|
|
|
- HStack {
|
|
|
- Text("UAM SMB Minutes")
|
|
|
- DecimalTextField(
|
|
|
- "0",
|
|
|
- value: $state.uamMinutes,
|
|
|
- formatter: formatter,
|
|
|
- cleanInput: false
|
|
|
- )
|
|
|
- Text("minutes").foregroundColor(.secondary)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
HStack {
|
|
|
Button("Start new Profile") {
|
|
|
showAlert.toggle()
|
|
|
@@ -354,8 +343,6 @@ extension OverrideProfilesConfig {
|
|
|
presetPopover
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- header: { Text("Insulin") }
|
|
|
footer: {
|
|
|
Text(
|
|
|
"Your profile basal insulin will be adjusted with the override percentage and your profile ISF and CR will be inversly adjusted with the percentage."
|