PreferencesEditorViewModel.swift 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. import Foundation
  2. import SwiftUI
  3. extension PreferencesEditor {
  4. class ViewModel<Provider>: BaseViewModel<Provider>, ObservableObject,
  5. PreferencesSettable where Provider: PreferencesEditorProvider
  6. {
  7. @Injected() var settingsManager: SettingsManager!
  8. private(set) var preferences = Preferences()
  9. @Published var unitsIndex = 1
  10. @Published var decimalFields: [Field<Decimal>] = []
  11. @Published var boolFields: [Field<Bool>] = []
  12. @Published var insulinCirveField = Field<InsulinCurve>(
  13. displayName: "Insulin curve",
  14. keypath: \.curve,
  15. value: .rapidActing
  16. )
  17. override func subscribe() {
  18. preferences = provider.preferences
  19. unitsIndex = settingsManager.settings.units == .mgdL ? 0 : 1
  20. insulinCirveField.value = preferences.curve
  21. insulinCirveField.settable = self
  22. $unitsIndex
  23. .sink { [weak self] index in
  24. self?.settingsManager.settings.units = index == 0 ? .mgdL : .mmolL
  25. }
  26. .store(in: &lifetime)
  27. boolFields = [
  28. Field(
  29. displayName: "Rewind Resets Autosens",
  30. keypath: \.rewindResetsAutosens,
  31. value: preferences.rewindResetsAutosens,
  32. settable: self
  33. ),
  34. Field(
  35. displayName: "High Temptarget Raises Sensitivity",
  36. keypath: \.highTemptargetRaisesSensitivity,
  37. value: preferences.highTemptargetRaisesSensitivity,
  38. settable: self
  39. ),
  40. Field(
  41. displayName: "Low Temptarget Lowers Sensitivity",
  42. keypath: \.lowTemptargetLowersSensitivity,
  43. value: preferences.lowTemptargetLowersSensitivity,
  44. settable: self
  45. ),
  46. Field(
  47. displayName: "Sensitivity Raises Target",
  48. keypath: \.sensitivityRaisesTarget,
  49. value: preferences.sensitivityRaisesTarget,
  50. settable: self
  51. ),
  52. Field(
  53. displayName: "Resistance Lowers Target",
  54. keypath: \.resistanceLowersTarget,
  55. value: preferences.resistanceLowersTarget,
  56. settable: self
  57. ),
  58. Field(
  59. displayName: "Exercise Mode",
  60. keypath: \.exerciseMode,
  61. value: preferences.exerciseMode,
  62. settable: self
  63. ),
  64. Field(
  65. displayName: "Wide BG Target Range",
  66. keypath: \.wideBGTargetRange,
  67. value: preferences.wideBGTargetRange,
  68. settable: self
  69. ),
  70. Field(
  71. displayName: "Skip Neutral Temps",
  72. keypath: \.skipNeutralTemps,
  73. value: preferences.skipNeutralTemps,
  74. settable: self
  75. ),
  76. Field(
  77. displayName: "Unsuspend If No Temp",
  78. keypath: \.unsuspendIfNoTemp,
  79. value: preferences.unsuspendIfNoTemp,
  80. settable: self
  81. ),
  82. Field(
  83. displayName: "Enable UAM",
  84. keypath: \.enableUAM,
  85. value: preferences.enableUAM,
  86. settable: self
  87. ),
  88. Field(
  89. displayName: "A52 Risk Enable",
  90. keypath: \.a52RiskEnable,
  91. value: preferences.a52RiskEnable,
  92. settable: self
  93. ),
  94. Field(
  95. displayName: "Enable SMB With COB",
  96. keypath: \.enableSMBWithCOB,
  97. value: preferences.enableSMBWithCOB,
  98. settable: self
  99. ),
  100. Field(
  101. displayName: "Enable SMB With Temptarget",
  102. keypath: \.enableSMBWithTemptarget,
  103. value: preferences.enableSMBWithTemptarget,
  104. settable: self
  105. ),
  106. Field(
  107. displayName: "Enable SMB Always",
  108. keypath: \.enableSMBAlways,
  109. value: preferences.enableSMBAlways,
  110. settable: self
  111. ),
  112. Field(
  113. displayName: "Enable SMB After Carbs",
  114. keypath: \.enableSMBAfterCarbs,
  115. value: preferences.enableSMBAfterCarbs,
  116. settable: self
  117. ),
  118. Field(
  119. displayName: "Allow SMB With High Temptarget",
  120. keypath: \.allowSMBWithHighTemptarget,
  121. value: preferences.allowSMBWithHighTemptarget,
  122. settable: self
  123. ),
  124. Field(
  125. displayName: "Use Custom Peak Time",
  126. keypath: \.useCustomPeakTime,
  127. value: preferences.useCustomPeakTime,
  128. settable: self
  129. ),
  130. Field(
  131. displayName: "Suspend Zeros IOB",
  132. keypath: \.suspendZerosIOB,
  133. value: preferences.suspendZerosIOB,
  134. settable: self
  135. )
  136. ]
  137. decimalFields = [
  138. Field(
  139. displayName: "Max IOB",
  140. keypath: \.maxIOB,
  141. value: preferences.maxIOB,
  142. settable: self
  143. ),
  144. Field(
  145. displayName: "Max Daily Safety Multiplier",
  146. keypath: \.maxDailySafetyMultiplier,
  147. value: preferences.maxDailySafetyMultiplier,
  148. settable: self
  149. ),
  150. Field(
  151. displayName: "Current Basal Safety Multiplier",
  152. keypath: \.currentBasalSafetyMultiplier,
  153. value: preferences.currentBasalSafetyMultiplier,
  154. settable: self
  155. ),
  156. Field(
  157. displayName: "Autosens Max",
  158. keypath: \.autosensMax,
  159. value: preferences.autosensMax,
  160. settable: self
  161. ),
  162. Field(
  163. displayName: "Autosens Min",
  164. keypath: \.autosensMin,
  165. value: preferences.autosensMin,
  166. settable: self
  167. ),
  168. Field(
  169. displayName: "Half Basal Exercise Target",
  170. keypath: \.halfBasalExerciseTarget,
  171. value: preferences.halfBasalExerciseTarget,
  172. settable: self
  173. ),
  174. Field(
  175. displayName: "Max COB",
  176. keypath: \.maxCOB,
  177. value: preferences.maxCOB,
  178. settable: self
  179. ),
  180. Field(
  181. displayName: "Bolus Snooze DIA Divisor",
  182. keypath: \.bolusSnoozeDIADivisor,
  183. value: preferences.bolusSnoozeDIADivisor,
  184. settable: self
  185. ),
  186. Field(
  187. displayName: "Min 5m Carbimpact",
  188. keypath: \.min5mCarbimpact,
  189. value: preferences.min5mCarbimpact,
  190. settable: self
  191. ),
  192. Field(
  193. displayName: "Autotune ISF Adjustment Fraction",
  194. keypath: \.autotuneISFAdjustmentFraction,
  195. value: preferences.autotuneISFAdjustmentFraction,
  196. settable: self
  197. ),
  198. Field(
  199. displayName: "Remaining Carbs Fraction",
  200. keypath: \.remainingCarbsFraction,
  201. value: preferences.remainingCarbsFraction,
  202. settable: self
  203. ),
  204. Field(
  205. displayName: "Remaining Carbs Cap",
  206. keypath: \.remainingCarbsCap,
  207. value: preferences.remainingCarbsCap,
  208. settable: self
  209. ),
  210. Field(
  211. displayName: "Max SMB Basal Minutes",
  212. keypath: \.maxSMBBasalMinutes,
  213. value: preferences.maxSMBBasalMinutes,
  214. settable: self
  215. ),
  216. Field(
  217. displayName: "Max UAM SMB Basal Minutes",
  218. keypath: \.maxUAMSMBBasalMinutes,
  219. value: preferences.maxUAMSMBBasalMinutes,
  220. settable: self
  221. ),
  222. Field(
  223. displayName: "SMB Interval",
  224. keypath: \.smbInterval,
  225. value: preferences.smbInterval,
  226. settable: self
  227. ),
  228. Field(
  229. displayName: "Bolus Increment",
  230. keypath: \.bolusIncrement,
  231. value: preferences.bolusIncrement,
  232. settable: self
  233. ),
  234. Field(
  235. displayName: "Insulin Peak Time",
  236. keypath: \.insulinPeakTime,
  237. value: preferences.insulinPeakTime,
  238. settable: self
  239. ),
  240. Field(
  241. displayName: "Carbs Req Threshold",
  242. keypath: \.carbsReqThreshold,
  243. value: preferences.carbsReqThreshold,
  244. settable: self
  245. ),
  246. Field(
  247. displayName: "Noisy CGM Target Multiplier",
  248. keypath: \.noisyCGMTargetMultiplier,
  249. value: preferences.noisyCGMTargetMultiplier,
  250. settable: self
  251. )
  252. ]
  253. }
  254. func onSet<T>(_ keypath: WritableKeyPath<Preferences, T>, value: T) {
  255. preferences[keyPath: keypath] = value
  256. save()
  257. }
  258. func save() {
  259. provider.savePreferences(preferences)
  260. }
  261. }
  262. }