|
|
@@ -5,6 +5,7 @@ import Swinject
|
|
|
|
|
|
struct TagCloudView: View {
|
|
|
var tags: [String]
|
|
|
+ var shouldParseToMmolL: Bool
|
|
|
|
|
|
@State private var totalHeight
|
|
|
// = CGFloat.zero // << variant for ScrollView/List
|
|
|
@@ -25,7 +26,7 @@ struct TagCloudView: View {
|
|
|
|
|
|
return ZStack(alignment: .topLeading) {
|
|
|
ForEach(self.tags, id: \.self) { tag in
|
|
|
- self.item(for: tag)
|
|
|
+ self.item(for: tag, isMmolL: shouldParseToMmolL)
|
|
|
.padding([.horizontal, .vertical], 2)
|
|
|
.alignmentGuide(.leading, computeValue: { d in
|
|
|
if abs(width - d.width) > g.size.width
|
|
|
@@ -52,7 +53,41 @@ struct TagCloudView: View {
|
|
|
}.background(viewHeightReader($totalHeight))
|
|
|
}
|
|
|
|
|
|
- private func item(for textTag: String) -> some View {
|
|
|
+// private func item(for textTag: String) -> some View {
|
|
|
+// var colorOfTag: Color {
|
|
|
+// switch textTag {
|
|
|
+// case textTag where textTag.contains("SMB Delivery Ratio:"):
|
|
|
+// return .uam
|
|
|
+// case textTag where textTag.contains("Bolus"):
|
|
|
+// return .green
|
|
|
+// case textTag where textTag.contains("TDD:"),
|
|
|
+// textTag where textTag.contains("tdd_factor"),
|
|
|
+// textTag where textTag.contains("Sigmoid function"),
|
|
|
+// textTag where textTag.contains("Logarithmic formula"),
|
|
|
+// textTag where textTag.contains("AF:"),
|
|
|
+// textTag where textTag.contains("Autosens/Dynamic Limit:"),
|
|
|
+// textTag where textTag.contains("Dynamic ISF/CR"),
|
|
|
+// textTag where textTag.contains("Basal ratio"),
|
|
|
+// textTag where textTag.contains("SMB Ratio"):
|
|
|
+// return .zt
|
|
|
+// case textTag where textTag.contains("Middleware:"):
|
|
|
+// return .red
|
|
|
+// case textTag where textTag.contains("SMB Ratio"):
|
|
|
+// return .orange
|
|
|
+// default:
|
|
|
+// return .insulin
|
|
|
+// }
|
|
|
+// }
|
|
|
+//
|
|
|
+// return ZStack { Text(textTag)
|
|
|
+// .padding(.vertical, 2)
|
|
|
+// .padding(.horizontal, 4)
|
|
|
+// .font(.subheadline)
|
|
|
+// .background(colorOfTag.opacity(0.8))
|
|
|
+// .foregroundColor(Color.white)
|
|
|
+// .cornerRadius(2) }
|
|
|
+// }
|
|
|
+ private func item(for textTag: String, isMmolL: Bool) -> some View {
|
|
|
var colorOfTag: Color {
|
|
|
switch textTag {
|
|
|
case textTag where textTag.contains("SMB Delivery Ratio:"):
|
|
|
@@ -78,13 +113,71 @@ struct TagCloudView: View {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return ZStack { Text(textTag)
|
|
|
- .padding(.vertical, 2)
|
|
|
- .padding(.horizontal, 4)
|
|
|
- .font(.subheadline)
|
|
|
- .background(colorOfTag.opacity(0.8))
|
|
|
- .foregroundColor(Color.white)
|
|
|
- .cornerRadius(2) }
|
|
|
+ func formattedTextTag(for tag: String) -> String {
|
|
|
+ // List of glucose-related tags
|
|
|
+ let glucoseTags = ["ISF:", "Target:", "minPredBG", "minGuardBG", "IOBpredBG", "COBpredBG", "UAMpredBG", "Dev:"]
|
|
|
+
|
|
|
+ var updatedTag = tag
|
|
|
+
|
|
|
+ // Apply conversion if necessary
|
|
|
+ for glucoseTag in glucoseTags {
|
|
|
+ if glucoseTag == "ISF:" {
|
|
|
+ // Handle the special ISF case with the arrow
|
|
|
+ if let range = updatedTag.range(of: "\(glucoseTag)\\s*\\d+→\\d+", options: .regularExpression) {
|
|
|
+ let glucoseValueString = updatedTag[range]
|
|
|
+ let values = glucoseValueString.components(separatedBy: "→")
|
|
|
+
|
|
|
+ if let firstValue = Double(
|
|
|
+ values[0]
|
|
|
+ .components(separatedBy: CharacterSet.decimalDigits.inverted).joined()
|
|
|
+ ),
|
|
|
+ let secondValue = Double(
|
|
|
+ values[1]
|
|
|
+ .components(separatedBy: CharacterSet.decimalDigits.inverted).joined()
|
|
|
+ )
|
|
|
+ {
|
|
|
+ let formattedFirstValue = isMmolL ? Double(firstValue.asMmolL) : firstValue
|
|
|
+ let formattedSecondValue = isMmolL ? Double(secondValue.asMmolL) : secondValue
|
|
|
+
|
|
|
+ let formattedGlucoseValueString =
|
|
|
+ "\(glucoseTag) \(formattedFirstValue)→\(formattedSecondValue)"
|
|
|
+ updatedTag = updatedTag.replacingOccurrences(
|
|
|
+ of: glucoseValueString,
|
|
|
+ with: formattedGlucoseValueString
|
|
|
+ )
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // General case for other glucose tags
|
|
|
+ if let range = updatedTag.range(of: "\(glucoseTag)\\s*\\d+", options: .regularExpression) {
|
|
|
+ let glucoseValueString = updatedTag[range]
|
|
|
+ if let glucoseValue = Double(
|
|
|
+ glucoseValueString
|
|
|
+ .components(separatedBy: CharacterSet.decimalDigits.inverted).joined()
|
|
|
+ ) {
|
|
|
+ let formattedValue = isMmolL ? Double(glucoseValue.asMmolL) : glucoseValue
|
|
|
+ updatedTag = updatedTag.replacingOccurrences(
|
|
|
+ of: glucoseValueString,
|
|
|
+ with: "\(glucoseTag) \(formattedValue)"
|
|
|
+ )
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return updatedTag
|
|
|
+ }
|
|
|
+
|
|
|
+ let formattedTextTag = formattedTextTag(for: textTag)
|
|
|
+
|
|
|
+ return ZStack {
|
|
|
+ Text(formattedTextTag)
|
|
|
+ .padding(.vertical, 2)
|
|
|
+ .padding(.horizontal, 4)
|
|
|
+ .font(.subheadline)
|
|
|
+ .background(colorOfTag.opacity(0.8))
|
|
|
+ .foregroundColor(Color.white)
|
|
|
+ .cornerRadius(2)
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
private func viewHeightReader(_ binding: Binding<CGFloat>) -> some View {
|
|
|
@@ -102,11 +195,14 @@ struct TestTagCloudView: View {
|
|
|
var body: some View {
|
|
|
VStack {
|
|
|
Text("Header").font(.largeTitle)
|
|
|
- TagCloudView(tags: ["Ninetendo", "XBox", "PlayStation", "PlayStation 2", "PlayStation 3", "PlayStation 4"])
|
|
|
+ TagCloudView(
|
|
|
+ tags: ["Ninetendo", "XBox", "PlayStation", "PlayStation 2", "PlayStation 3", "PlayStation 4"],
|
|
|
+ shouldParseToMmolL: false
|
|
|
+ )
|
|
|
Text("Some other text")
|
|
|
Divider()
|
|
|
Text("Some other cloud")
|
|
|
- TagCloudView(tags: ["Apple", "Google", "Amazon", "Microsoft", "Oracle", "Facebook"])
|
|
|
+ TagCloudView(tags: ["Apple", "Google", "Amazon", "Microsoft", "Oracle", "Facebook"], shouldParseToMmolL: false)
|
|
|
}
|
|
|
}
|
|
|
}
|