| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290 |
- import Foundation
- import SwiftUI
- extension PreferencesEditor {
- class ViewModel<Provider>: BaseViewModel<Provider>, ObservableObject,
- PreferencesSettable where Provider: PreferencesEditorProvider
- {
- @Injected() var settingsManager: SettingsManager!
- private(set) var preferences = Preferences()
- @Published var unitsIndex = 1
- @Published var allowAnnouncements = false
- @Published var insulinReqFraction: Decimal = 0.7
- @Published var decimalFields: [Field<Decimal>] = []
- @Published var boolFields: [Field<Bool>] = []
- @Published var insulinCurveField = Field<InsulinCurve>(
- displayName: "Insulin curve",
- keypath: \.curve,
- value: .rapidActing
- )
- override func subscribe() {
- preferences = provider.preferences
- unitsIndex = settingsManager.settings.units == .mgdL ? 0 : 1
- allowAnnouncements = settingsManager.settings.allowAnnouncements
- insulinCurveField.value = preferences.curve
- insulinCurveField.settable = self
- insulinReqFraction = settingsManager.settings.insulinReqFraction ?? 0.7
- $unitsIndex
- .removeDuplicates()
- .sink { [weak self] index in
- self?.settingsManager.settings.units = index == 0 ? .mgdL : .mmolL
- }
- .store(in: &lifetime)
- $allowAnnouncements
- .removeDuplicates()
- .sink { [weak self] allow in
- self?.settingsManager.settings.allowAnnouncements = allow
- }
- .store(in: &lifetime)
- $insulinReqFraction
- .removeDuplicates()
- .sink { [weak self] fraction in
- self?.settingsManager.settings.insulinReqFraction = fraction
- }
- .store(in: &lifetime)
- boolFields = [
- Field(
- displayName: "Rewind Resets Autosens",
- keypath: \.rewindResetsAutosens,
- value: preferences.rewindResetsAutosens,
- settable: self
- ),
- Field(
- displayName: "High Temptarget Raises Sensitivity",
- keypath: \.highTemptargetRaisesSensitivity,
- value: preferences.highTemptargetRaisesSensitivity,
- settable: self
- ),
- Field(
- displayName: "Low Temptarget Lowers Sensitivity",
- keypath: \.lowTemptargetLowersSensitivity,
- value: preferences.lowTemptargetLowersSensitivity,
- settable: self
- ),
- Field(
- displayName: "Sensitivity Raises Target",
- keypath: \.sensitivityRaisesTarget,
- value: preferences.sensitivityRaisesTarget,
- settable: self
- ),
- Field(
- displayName: "Resistance Lowers Target",
- keypath: \.resistanceLowersTarget,
- value: preferences.resistanceLowersTarget,
- settable: self
- ),
- Field(
- displayName: "Exercise Mode",
- keypath: \.exerciseMode,
- value: preferences.exerciseMode,
- settable: self
- ),
- Field(
- displayName: "Wide BG Target Range",
- keypath: \.wideBGTargetRange,
- value: preferences.wideBGTargetRange,
- settable: self
- ),
- Field(
- displayName: "Skip Neutral Temps",
- keypath: \.skipNeutralTemps,
- value: preferences.skipNeutralTemps,
- settable: self
- ),
- Field(
- displayName: "Unsuspend If No Temp",
- keypath: \.unsuspendIfNoTemp,
- value: preferences.unsuspendIfNoTemp,
- settable: self
- ),
- Field(
- displayName: "Enable UAM",
- keypath: \.enableUAM,
- value: preferences.enableUAM,
- settable: self
- ),
- // Field(
- // displayName: "A52 Risk Enable",
- // keypath: \.a52RiskEnable,
- // value: preferences.a52RiskEnable,
- // settable: self
- // ),
- Field(
- displayName: "Enable SMB With COB",
- keypath: \.enableSMBWithCOB,
- value: preferences.enableSMBWithCOB,
- settable: self
- ),
- Field(
- displayName: "Enable SMB With Temptarget",
- keypath: \.enableSMBWithTemptarget,
- value: preferences.enableSMBWithTemptarget,
- settable: self
- ),
- Field(
- displayName: "Enable SMB Always",
- keypath: \.enableSMBAlways,
- value: preferences.enableSMBAlways,
- settable: self
- ),
- Field(
- displayName: "Enable SMB After Carbs",
- keypath: \.enableSMBAfterCarbs,
- value: preferences.enableSMBAfterCarbs,
- settable: self
- ),
- Field(
- displayName: "Allow SMB With High Temptarget",
- keypath: \.allowSMBWithHighTemptarget,
- value: preferences.allowSMBWithHighTemptarget,
- settable: self
- ),
- Field(
- displayName: "Use Custom Peak Time",
- keypath: \.useCustomPeakTime,
- value: preferences.useCustomPeakTime,
- settable: self
- ),
- Field(
- displayName: "Suspend Zeros IOB",
- keypath: \.suspendZerosIOB,
- value: preferences.suspendZerosIOB,
- settable: self
- )
- ]
- decimalFields = [
- Field(
- displayName: "Max IOB",
- keypath: \.maxIOB,
- value: preferences.maxIOB,
- settable: self
- ),
- Field(
- displayName: "Max Daily Safety Multiplier",
- keypath: \.maxDailySafetyMultiplier,
- value: preferences.maxDailySafetyMultiplier,
- settable: self
- ),
- Field(
- displayName: "Current Basal Safety Multiplier",
- keypath: \.currentBasalSafetyMultiplier,
- value: preferences.currentBasalSafetyMultiplier,
- settable: self
- ),
- Field(
- displayName: "Autosens Max",
- keypath: \.autosensMax,
- value: preferences.autosensMax,
- settable: self
- ),
- Field(
- displayName: "Autosens Min",
- keypath: \.autosensMin,
- value: preferences.autosensMin,
- settable: self
- ),
- Field(
- displayName: "Half Basal Exercise Target",
- keypath: \.halfBasalExerciseTarget,
- value: preferences.halfBasalExerciseTarget,
- settable: self
- ),
- Field(
- displayName: "Max COB",
- keypath: \.maxCOB,
- value: preferences.maxCOB,
- settable: self
- ),
- Field(
- displayName: "Bolus Snooze DIA Divisor",
- keypath: \.bolusSnoozeDIADivisor,
- value: preferences.bolusSnoozeDIADivisor,
- settable: self
- ),
- Field(
- displayName: "Min 5m Carbimpact",
- keypath: \.min5mCarbimpact,
- value: preferences.min5mCarbimpact,
- settable: self
- ),
- Field(
- displayName: "Autotune ISF Adjustment Fraction",
- keypath: \.autotuneISFAdjustmentFraction,
- value: preferences.autotuneISFAdjustmentFraction,
- settable: self
- ),
- Field(
- displayName: "Remaining Carbs Fraction",
- keypath: \.remainingCarbsFraction,
- value: preferences.remainingCarbsFraction,
- settable: self
- ),
- Field(
- displayName: "Remaining Carbs Cap",
- keypath: \.remainingCarbsCap,
- value: preferences.remainingCarbsCap,
- settable: self
- ),
- Field(
- displayName: "Max SMB Basal Minutes",
- keypath: \.maxSMBBasalMinutes,
- value: preferences.maxSMBBasalMinutes,
- settable: self
- ),
- Field(
- displayName: "Max UAM SMB Basal Minutes",
- keypath: \.maxUAMSMBBasalMinutes,
- value: preferences.maxUAMSMBBasalMinutes,
- settable: self
- ),
- Field(
- displayName: "SMB Interval",
- keypath: \.smbInterval,
- value: preferences.smbInterval,
- settable: self
- ),
- Field(
- displayName: "Bolus Increment",
- keypath: \.bolusIncrement,
- value: preferences.bolusIncrement,
- settable: self
- ),
- Field(
- displayName: "Insulin Peak Time",
- keypath: \.insulinPeakTime,
- value: preferences.insulinPeakTime,
- settable: self
- ),
- Field(
- displayName: "Carbs Req Threshold",
- keypath: \.carbsReqThreshold,
- value: preferences.carbsReqThreshold,
- settable: self
- ),
- Field(
- displayName: "Noisy CGM Target Multiplier",
- keypath: \.noisyCGMTargetMultiplier,
- value: preferences.noisyCGMTargetMultiplier,
- settable: self
- )
- ]
- }
- func onSet<T>(_ keypath: WritableKeyPath<Preferences, T>, value: T) {
- preferences[keyPath: keypath] = value
- save()
- }
- func save() {
- provider.savePreferences(preferences)
- }
- }
- }
|