ContactTrickEntry.swift 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. import CoreData
  2. import SwiftUI
  3. struct ContactTrickEntry: Hashable, Equatable, Sendable {
  4. var id = UUID()
  5. var name: String = ""
  6. var layout: ContactTrickLayout = .single
  7. var ring: ContactTrickLargeRing = .none
  8. var primary: ContactTrickValue = .glucose
  9. var top: ContactTrickValue = .none
  10. var bottom: ContactTrickValue = .none
  11. var contactId: String? = nil
  12. var hasHighContrast: Bool = true
  13. var ringWidth: RingWidth = .regular
  14. var ringGap: RingGap = .small
  15. var fontSize: FontSize = .regular
  16. var secondaryFontSize: FontSize = .small
  17. var fontWeight: Font.Weight = .medium
  18. var fontWidth: Font.Width = .standard
  19. var managedObjectID: NSManagedObjectID?
  20. static func == (lhs: ContactTrickEntry, rhs: ContactTrickEntry) -> Bool {
  21. lhs.id == rhs.id &&
  22. lhs.name == rhs.name &&
  23. lhs.layout == rhs.layout &&
  24. lhs.ring == rhs.ring &&
  25. lhs.primary == rhs.primary &&
  26. lhs.top == rhs.top &&
  27. lhs.bottom == rhs.bottom &&
  28. lhs.contactId == rhs.contactId &&
  29. lhs.hasHighContrast == rhs.hasHighContrast &&
  30. lhs.ringWidth == rhs.ringWidth &&
  31. lhs.ringGap == rhs.ringGap &&
  32. lhs.fontSize == rhs.fontSize &&
  33. lhs.secondaryFontSize == rhs.secondaryFontSize &&
  34. lhs.fontWeight == rhs.fontWeight &&
  35. lhs.fontWidth == rhs.fontWidth
  36. }
  37. // Convert `fontWeight` to a String for Core Data storage
  38. var fontWeightString: String {
  39. fontWeight.asString
  40. }
  41. // Initialize `fontWeight` from a String
  42. static func fontWeight(from string: String) -> Font.Weight {
  43. Font.Weight.fromString(string)
  44. }
  45. // Convert `fontWidth` to a String for Core Data storage
  46. var fontWidthString: String {
  47. fontWidth.asString
  48. }
  49. // Initialize `fontWidth` from a String
  50. static func fontWidth(from string: String) -> Font.Width {
  51. Font.Width.fromString(string)
  52. }
  53. enum FontSize: Int, Codable, Sendable, CaseIterable {
  54. case tiny = 200
  55. case small = 250
  56. case regular = 300
  57. case large = 400
  58. var displayName: String {
  59. switch self {
  60. case .tiny: return "Tiny"
  61. case .small: return "Small"
  62. case .regular: return "Regular"
  63. case .large: return "Large"
  64. }
  65. }
  66. }
  67. enum RingWidth: Int, Codable, Sendable, CaseIterable {
  68. case tiny = 3
  69. case small = 5
  70. case regular = 7
  71. case medium = 10
  72. case large = 15
  73. var displayName: String {
  74. switch self {
  75. case .tiny: return "Tiny"
  76. case .small: return "Small"
  77. case .regular: return "Regular"
  78. case .medium: return "Medium"
  79. case .large: return "Large"
  80. }
  81. }
  82. }
  83. enum RingGap: Int, Codable, Sendable, CaseIterable {
  84. case tiny = 1
  85. case small = 2
  86. case regular = 3
  87. case medium = 4
  88. case large = 5
  89. var displayName: String {
  90. switch self {
  91. case .tiny: return "Tiny"
  92. case .small: return "Small"
  93. case .regular: return "Regular"
  94. case .medium: return "Medium"
  95. case .large: return "Large"
  96. }
  97. }
  98. }
  99. }
  100. protocol ContactTrickObserver: Sendable {
  101. // TODO: is this required?
  102. // func basalProfileDidChange(_ entry: [ContactTrickEntry])
  103. }
  104. enum ContactTrickValue: String, JSON, CaseIterable, Identifiable, Codable {
  105. var id: String { rawValue }
  106. case none
  107. case glucose
  108. case eventualBG
  109. case delta
  110. case trend
  111. case lastLoopDate
  112. case cob
  113. case iob
  114. case ring
  115. var displayName: String {
  116. switch self {
  117. case .none:
  118. return NSLocalizedString("None", comment: "")
  119. case .glucose:
  120. return NSLocalizedString("Glucose Reading", comment: "")
  121. case .eventualBG:
  122. return NSLocalizedString("Eventual Glucose", comment: "")
  123. case .delta:
  124. return NSLocalizedString("Glucose Delta", comment: "")
  125. case .trend:
  126. return NSLocalizedString("Glucose Trend", comment: "")
  127. case .lastLoopDate:
  128. return NSLocalizedString("Last Loop Time", comment: "")
  129. case .cob:
  130. return NSLocalizedString("COB", comment: "")
  131. case .iob:
  132. return NSLocalizedString("IOB", comment: "")
  133. case .ring:
  134. return NSLocalizedString("Loop Status", comment: "")
  135. }
  136. }
  137. }
  138. enum ContactTrickLayout: String, JSON, CaseIterable, Identifiable, Codable {
  139. var id: String { rawValue }
  140. case single
  141. case split
  142. var displayName: String {
  143. switch self {
  144. case .single:
  145. return NSLocalizedString("Single", comment: "")
  146. case .split:
  147. return NSLocalizedString("Split", comment: "")
  148. }
  149. }
  150. }
  151. enum ContactTrickLargeRing: String, JSON, CaseIterable, Identifiable, Codable {
  152. // TODO: revisit rings for iob, cob and combined iob+cob with more user feedback
  153. var id: String { rawValue }
  154. case none
  155. case loop
  156. // case iob
  157. // case cob
  158. // case iobcob
  159. var displayName: String {
  160. switch self {
  161. case .none:
  162. return NSLocalizedString("Hidden", comment: "")
  163. case .loop:
  164. return NSLocalizedString("Loop Status", comment: "")
  165. // case .iob:
  166. // return NSLocalizedString("Insulin on Board (IOB)", comment: "")
  167. // case .cob:
  168. // return NSLocalizedString("Carbs on Board (COB)", comment: "")
  169. // case .iobcob:
  170. // return NSLocalizedString("IOB + COB", comment: "")
  171. }
  172. }
  173. }