StatsDisplayView.swift 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // LoopFollow
  2. // StatsDisplayView.swift
  3. import Charts
  4. import SwiftUI
  5. struct StatsDisplayView: View {
  6. @ObservedObject var model: StatsDisplayModel
  7. var onTap: (() -> Void)?
  8. var body: some View {
  9. HStack {
  10. StatsPieChartView(
  11. pieLow: model.pieLow,
  12. pieRange: model.pieRange,
  13. pieHigh: model.pieHigh
  14. )
  15. .frame(width: 100, height: 100)
  16. VStack(spacing: 10) {
  17. HStack {
  18. statColumn(title: "Low:", value: model.lowPercent)
  19. statColumn(title: "In Range:", value: model.inRangePercent)
  20. statColumn(title: "High:", value: model.highPercent)
  21. }
  22. HStack {
  23. statColumn(title: "Avg BG:", value: model.avgBG)
  24. statColumn(title: model.estA1CTitle, value: model.estA1C)
  25. statColumn(title: model.stdDevTitle, value: model.stdDev)
  26. }
  27. }
  28. .frame(maxWidth: .infinity)
  29. }
  30. .frame(height: 100)
  31. .background(Color(.secondarySystemBackground))
  32. .contentShape(Rectangle())
  33. .onTapGesture { onTap?() }
  34. }
  35. private func statColumn(title: String, value: String) -> some View {
  36. VStack {
  37. Text(title)
  38. .font(.system(size: 15))
  39. Text(value)
  40. .font(.system(size: 15))
  41. }
  42. .frame(maxWidth: .infinity)
  43. }
  44. }
  45. struct StatsPieChartView: UIViewRepresentable {
  46. var pieLow: Double
  47. var pieRange: Double
  48. var pieHigh: Double
  49. func makeUIView(context _: Context) -> PieChartView {
  50. let chart = PieChartView()
  51. chart.legend.enabled = false
  52. chart.drawEntryLabelsEnabled = false
  53. chart.drawHoleEnabled = false
  54. chart.rotationEnabled = false
  55. chart.isUserInteractionEnabled = false
  56. chart.backgroundColor = .clear
  57. return chart
  58. }
  59. func updateUIView(_ chart: PieChartView, context _: Context) {
  60. let entries = [
  61. PieChartDataEntry(value: max(pieLow, 0.1)),
  62. PieChartDataEntry(value: max(pieRange, 0.1)),
  63. PieChartDataEntry(value: max(pieHigh, 0.1)),
  64. ]
  65. let dataSet = PieChartDataSet(entries: entries, label: "")
  66. dataSet.drawIconsEnabled = false
  67. dataSet.sliceSpace = 0
  68. dataSet.drawValuesEnabled = false
  69. dataSet.valueLineWidth = 0
  70. dataSet.formLineWidth = 0
  71. dataSet.colors = [.systemRed, .systemGreen, .systemYellow]
  72. chart.data = PieChartData(dataSet: dataSet)
  73. }
  74. }