Skip to content

Commit 17c6f62

Browse files
authored
Merge pull request #70 from loudnate/chart-improvements
Displaying the units when highlighting chart values
2 parents f58244f + b35b2aa commit 17c6f62

File tree

6 files changed

+199
-104
lines changed

6 files changed

+199
-104
lines changed

Loop.xcodeproj/project.pbxproj

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,9 @@
124124
43E344A61B9E1B3300C85C07 /* NSBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43E344A51B9E1B3300C85C07 /* NSBundle.swift */; };
125125
43E344A81B9EAA8400C85C07 /* RemoteSettings.plist in Resources */ = {isa = PBXBuildFile; fileRef = 43E344A71B9EAA8300C85C07 /* RemoteSettings.plist */; };
126126
43EB40861C82646A00472A8C /* StatusChartManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43EB40851C82646A00472A8C /* StatusChartManager.swift */; };
127-
43EB40C21C83F84900472A8C /* StatusChartHighlightLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43EB40C11C83F84900472A8C /* StatusChartHighlightLayer.swift */; };
128127
43EDDBF31C361C75007D89B5 /* xDripG5.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43EDDBF11C361C75007D89B5 /* xDripG5.framework */; };
128+
43F41C331D3A17AA00C11ED6 /* ChartAxisValueDoubleUnit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43F41C321D3A17AA00C11ED6 /* ChartAxisValueDoubleUnit.swift */; };
129+
43F41C351D3B623800C11ED6 /* ChartPointsTouchHighlightLayerViewCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43F41C341D3B623800C11ED6 /* ChartPointsTouchHighlightLayerViewCache.swift */; };
129130
43F4EF1D1BA2A57600526CE1 /* DiagnosticLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43F4EF1C1BA2A57600526CE1 /* DiagnosticLogger.swift */; };
130131
43F5C2C91B929C09003EB13D /* HealthKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43F5C2C81B929C09003EB13D /* HealthKit.framework */; };
131132
43F5C2DB1B92A5E1003EB13D /* SettingsTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43F5C2DA1B92A5E1003EB13D /* SettingsTableViewController.swift */; };
@@ -331,12 +332,13 @@
331332
43E344A51B9E1B3300C85C07 /* NSBundle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSBundle.swift; sourceTree = "<group>"; };
332333
43E344A71B9EAA8300C85C07 /* RemoteSettings.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = RemoteSettings.plist; sourceTree = "<group>"; };
333334
43EB40851C82646A00472A8C /* StatusChartManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusChartManager.swift; sourceTree = "<group>"; };
334-
43EB40C11C83F84900472A8C /* StatusChartHighlightLayer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusChartHighlightLayer.swift; sourceTree = "<group>"; };
335335
43EDDBF01C361C75007D89B5 /* CommonCrypto.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CommonCrypto.framework; path = Carthage/Build/iOS/CommonCrypto.framework; sourceTree = "<group>"; };
336336
43EDDBF11C361C75007D89B5 /* xDripG5.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = xDripG5.framework; path = Carthage/Build/iOS/xDripG5.framework; sourceTree = "<group>"; };
337337
43EDDBF51C361D24007D89B5 /* CommonCrypto.framework.dSYM */ = {isa = PBXFileReference; lastKnownFileType = wrapper.dsym; name = CommonCrypto.framework.dSYM; path = Carthage/Build/iOS/CommonCrypto.framework.dSYM; sourceTree = "<group>"; };
338338
43EDDBF61C361D24007D89B5 /* xDripG5.framework.dSYM */ = {isa = PBXFileReference; lastKnownFileType = wrapper.dsym; name = xDripG5.framework.dSYM; path = Carthage/Build/iOS/xDripG5.framework.dSYM; sourceTree = "<group>"; };
339339
43EDEE6B1CF2E12A00393BE3 /* Loop.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Loop.entitlements; sourceTree = "<group>"; };
340+
43F41C321D3A17AA00C11ED6 /* ChartAxisValueDoubleUnit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChartAxisValueDoubleUnit.swift; sourceTree = "<group>"; };
341+
43F41C341D3B623800C11ED6 /* ChartPointsTouchHighlightLayerViewCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChartPointsTouchHighlightLayerViewCache.swift; sourceTree = "<group>"; };
340342
43F4EF1C1BA2A57600526CE1 /* DiagnosticLogger.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DiagnosticLogger.swift; sourceTree = "<group>"; };
341343
43F5C2C81B929C09003EB13D /* HealthKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = HealthKit.framework; path = System/Library/Frameworks/HealthKit.framework; sourceTree = SDKROOT; };
342344
43F5C2D41B92A4A6003EB13D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@@ -434,6 +436,7 @@
434436
43DE92601C555C26001FFDE1 /* AbsorptionTimeType+CarbKit.swift */,
435437
438849EB1D29EC34003B3F23 /* AmplitudeService.swift */,
436438
4331E0791C85650D00FBE832 /* ChartAxisValueDoubleLog.swift */,
439+
43F41C321D3A17AA00C11ED6 /* ChartAxisValueDoubleUnit.swift */,
437440
434F24CA1CFCB7AB0004498F /* GlucoseRxMessage.swift */,
438441
436FACED1D0BA636004E2427 /* InsulinDataSource.swift */,
439442
436A0DA41D236A2A00104B24 /* LoopError.swift */,
@@ -611,13 +614,13 @@
611614
437CEEC91CD84DB7003C8C80 /* BatteryLevelHUDView.swift */,
612615
437CCADB1D284B830075D2C3 /* ButtonTableViewCell.swift */,
613616
434F54581D28805E002A9274 /* ButtonTableViewCell.xib */,
617+
43F41C341D3B623800C11ED6 /* ChartPointsTouchHighlightLayerViewCache.swift */,
614618
4346D1E61C77F5FE00ABAFE3 /* ChartTableViewCell.swift */,
615619
437CEEBB1CD6DE6A003C8C80 /* HUDView.swift */,
616620
437CEEBD1CD6E0CB003C8C80 /* LoopCompletionHUDView.swift */,
617621
438DADC71CDE8F8B007697A5 /* LoopStateView.swift */,
618622
437CEEC71CD84CBB003C8C80 /* ReservoirVolumeHUDView.swift */,
619623
436FACEB1D0BA246004E2427 /* SegmentedControlTableViewCell.swift */,
620-
43EB40C11C83F84900472A8C /* StatusChartHighlightLayer.swift */,
621624
43A5676A1C96155700334FAC /* SwitchTableViewCell.swift */,
622625
434F54621D28DD80002A9274 /* ValidatingIndicatorView.swift */,
623626
);
@@ -953,6 +956,7 @@
953956
43776F901B8022E90074EA36 /* AppDelegate.swift in Sources */,
954957
437CCADA1D284ADF0075D2C3 /* AuthenticationTableViewCell.swift in Sources */,
955958
43CE7CDE1CA8B63E003CC1B0 /* NSDate.swift in Sources */,
959+
43F41C331D3A17AA00C11ED6 /* ChartAxisValueDoubleUnit.swift in Sources */,
956960
43F5C2DB1B92A5E1003EB13D /* SettingsTableViewController.swift in Sources */,
957961
43B371861CE583890013C5A6 /* BasalStateView.swift in Sources */,
958962
434FF1EA1CF26C29000DB779 /* IdentifiableClass.swift in Sources */,
@@ -972,12 +976,12 @@
972976
436FACEC1D0BA246004E2427 /* SegmentedControlTableViewCell.swift in Sources */,
973977
43DBF0591C93F73800B3C386 /* CarbEntryTableViewController.swift in Sources */,
974978
43DE925C1C547A20001FFDE1 /* WatchContext.swift in Sources */,
979+
43F41C351D3B623800C11ED6 /* ChartPointsTouchHighlightLayerViewCache.swift in Sources */,
975980
43EB40861C82646A00472A8C /* StatusChartManager.swift in Sources */,
976981
437CEEC81CD84CBB003C8C80 /* ReservoirVolumeHUDView.swift in Sources */,
977982
43C0944A1CACCC73001F6403 /* NotificationManager.swift in Sources */,
978983
434FF1EE1CF27EEF000DB779 /* UITableViewCell.swift in Sources */,
979984
438849EA1D297CB6003B3F23 /* NightscoutService.swift in Sources */,
980-
43EB40C21C83F84900472A8C /* StatusChartHighlightLayer.swift in Sources */,
981985
437CCADC1D284B830075D2C3 /* ButtonTableViewCell.swift in Sources */,
982986
4315D2871CA5CC3B00589052 /* CarbEntryEditTableViewController.swift in Sources */,
983987
4331E0781C85302200FBE832 /* CGPoint.swift in Sources */,

Loop/Managers/StatusChartManager.swift

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -73,23 +73,31 @@ class StatusChartsManager {
7373

7474
var glucoseValues: [GlucoseValue] = [] {
7575
didSet {
76-
glucosePoints = glucoseValues.map({
76+
// TODO: Use the preferred unit
77+
let unit = HKUnit.milligramsPerDeciliterUnit()
78+
let unitString = unit.glucoseUnitDisplayString
79+
80+
glucosePoints = glucoseValues.map {
7781
return ChartPoint(
7882
x: ChartAxisValueDate(date: $0.startDate, formatter: dateFormatter),
79-
y: ChartAxisValueDouble($0.quantity.doubleValueForUnit(HKUnit.milligramsPerDeciliterUnit()))
83+
y: ChartAxisValueDoubleUnit($0.quantity.doubleValueForUnit(unit), unitString: unitString)
8084
)
81-
})
85+
}
8286
}
8387
}
8488

8589
var predictedGlucoseValues: [GlucoseValue] = [] {
8690
didSet {
87-
predictedGlucosePoints = predictedGlucoseValues.map({
91+
// TODO: Use the preferred unit
92+
let unit = HKUnit.milligramsPerDeciliterUnit()
93+
let unitString = unit.glucoseUnitDisplayString
94+
95+
predictedGlucosePoints = predictedGlucoseValues.map {
8896
return ChartPoint(
8997
x: ChartAxisValueDate(date: $0.startDate, formatter: dateFormatter),
90-
y: ChartAxisValueDouble($0.quantity.doubleValueForUnit(HKUnit.milligramsPerDeciliterUnit()), formatter: integerFormatter)
98+
y: ChartAxisValueDoubleUnit($0.quantity.doubleValueForUnit(unit), unitString: unitString, formatter: integerFormatter)
9199
)
92-
})
100+
}
93101
}
94102
}
95103

@@ -98,18 +106,21 @@ class StatusChartsManager {
98106
IOBPoints = IOBValues.map {
99107
return ChartPoint(
100108
x: ChartAxisValueDate(date: $0.startDate, formatter: dateFormatter),
101-
y: ChartAxisValueDouble($0.value, formatter: decimalFormatter)
109+
y: ChartAxisValueDoubleUnit($0.value, unitString: "U", formatter: decimalFormatter)
102110
)
103111
}
104112
}
105113
}
106114

107115
var COBValues: [CarbValue] = [] {
108116
didSet {
117+
let unit = HKUnit.gramUnit()
118+
let unitString = unit.unitString
119+
109120
COBPoints = COBValues.map {
110121
ChartPoint(
111122
x: ChartAxisValueDate(date: $0.startDate, formatter: dateFormatter),
112-
y: ChartAxisValueDouble($0.quantity.doubleValueForUnit(HKUnit.gramUnit()), formatter: integerFormatter)
123+
y: ChartAxisValueDoubleUnit($0.quantity.doubleValueForUnit(unit), unitString: unitString, formatter: integerFormatter)
113124
)
114125
}
115126
}
@@ -122,7 +133,7 @@ class StatusChartsManager {
122133
let startX = ChartAxisValueDate(date: entry.startDate, formatter: dateFormatter)
123134
let endX = ChartAxisValueDate(date: entry.endDate, formatter: dateFormatter)
124135
let zero = ChartAxisValueInt(0)
125-
let value = ChartAxisValueDoubleLog(actualDouble: entry.value, formatter: decimalFormatter)
136+
let value = ChartAxisValueDoubleLog(actualDouble: entry.value, unitString: "U/hour", formatter: decimalFormatter)
126137

127138
let newPoints = [
128139
ChartPoint(x: startX, y: zero),
@@ -214,6 +225,14 @@ class StatusChartsManager {
214225

215226
private var doseChart: Chart?
216227

228+
private var glucoseChartCache: ChartPointsTouchHighlightLayerViewCache?
229+
230+
private var IOBChartCache: ChartPointsTouchHighlightLayerViewCache?
231+
232+
private var COBChartCache: ChartPointsTouchHighlightLayerViewCache?
233+
234+
private var doseChartCache: ChartPointsTouchHighlightLayerViewCache?
235+
217236
// MARK: - Generators
218237

219238
func glucoseChartWithFrame(frame: CGRect) -> Chart? {
@@ -275,7 +294,7 @@ class StatusChartsManager {
275294
prediction = ChartPointsScatterCirclesLayer(xAxis: xAxis, yAxis: yAxis, innerFrame: innerFrame, chartPoints: predictedGlucosePoints, displayDelay: 0, itemSize: CGSize(width: 2, height: 2), itemFillColor: UIColor.glucoseTintColor.colorWithAlphaComponent(0.75))
276295
}
277296

278-
let highlightLayer = StatusChartHighlightLayer(
297+
glucoseChartCache = ChartPointsTouchHighlightLayerViewCache(
279298
xAxis: xAxis,
280299
yAxis: yAxis,
281300
innerFrame: innerFrame,
@@ -292,7 +311,7 @@ class StatusChartsManager {
292311
targetOverrideDurationLayer,
293312
xAxis,
294313
yAxis,
295-
highlightLayer,
314+
glucoseChartCache?.highlightLayer,
296315
prediction,
297316
circles
298317
]
@@ -356,7 +375,7 @@ class StatusChartsManager {
356375
return v
357376
})
358377

359-
let highlightLayer = StatusChartHighlightLayer(
378+
IOBChartCache = ChartPointsTouchHighlightLayerViewCache(
360379
xAxis: xAxis,
361380
yAxis: yAxis,
362381
innerFrame: innerFrame,
@@ -371,7 +390,7 @@ class StatusChartsManager {
371390
xAxis,
372391
yAxis,
373392
zeroGuidelineLayer,
374-
highlightLayer,
393+
IOBChartCache?.highlightLayer,
375394
IOBArea,
376395
IOBLine,
377396
]
@@ -425,7 +444,7 @@ class StatusChartsManager {
425444
let gridLayer = ChartGuideLinesLayer(xAxis: xAxis, yAxis: yAxis, innerFrame: innerFrame, axis: .XAndY, settings: guideLinesLayerSettings, onlyVisibleX: true, onlyVisibleY: false)
426445

427446

428-
let highlightLayer = StatusChartHighlightLayer(
447+
COBChartCache = ChartPointsTouchHighlightLayerViewCache(
429448
xAxis: xAxis,
430449
yAxis: yAxis,
431450
innerFrame: innerFrame,
@@ -439,7 +458,7 @@ class StatusChartsManager {
439458
gridLayer,
440459
xAxis,
441460
yAxis,
442-
highlightLayer,
461+
COBChartCache?.highlightLayer,
443462
COBArea,
444463
COBLine
445464
]
@@ -492,7 +511,7 @@ class StatusChartsManager {
492511
return v
493512
})
494513

495-
let highlightLayer = StatusChartHighlightLayer(
514+
doseChartCache = ChartPointsTouchHighlightLayerViewCache(
496515
xAxis: xAxis,
497516
yAxis: yAxis,
498517
innerFrame: innerFrame,
@@ -507,7 +526,7 @@ class StatusChartsManager {
507526
xAxis,
508527
yAxis,
509528
zeroGuidelineLayer,
510-
highlightLayer,
529+
doseChartCache?.highlightLayer,
511530
doseArea,
512531
doseLine
513532
]

Loop/Models/ChartAxisValueDoubleLog.swift

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ import SwiftCharts
1212

1313
class ChartAxisValueDoubleLog: ChartAxisValueDoubleScreenLoc {
1414

15-
init(actualDouble: Double, formatter: NSNumberFormatter, labelSettings: ChartLabelSettings = ChartLabelSettings()) {
15+
let unitString: String?
16+
17+
init(actualDouble: Double, unitString: String? = nil, formatter: NSNumberFormatter, labelSettings: ChartLabelSettings = ChartLabelSettings()) {
1618
let screenLocDouble: Double
1719

1820
switch actualDouble {
@@ -24,6 +26,8 @@ class ChartAxisValueDoubleLog: ChartAxisValueDoubleScreenLoc {
2426
screenLocDouble = 0
2527
}
2628

29+
self.unitString = unitString
30+
2731
super.init(screenLocDouble: screenLocDouble, actualDouble: actualDouble, formatter: formatter, labelSettings: labelSettings)
2832
}
2933

@@ -39,7 +43,14 @@ class ChartAxisValueDoubleLog: ChartAxisValueDoubleScreenLoc {
3943
actualDouble = 0
4044
}
4145

46+
self.unitString = nil
47+
4248
super.init(screenLocDouble: screenLocDouble, actualDouble: actualDouble, formatter: formatter, labelSettings: labelSettings)
4349
}
4450

51+
override var description: String {
52+
let suffix = unitString != nil ? " \(unitString!)" : ""
53+
54+
return super.description + suffix
55+
}
4556
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
//
2+
// ChartAxisValueDoubleUnit.swift
3+
// Loop
4+
//
5+
// Created by Nate Racklyeft on 7/16/16.
6+
// Copyright © 2016 Nathan Racklyeft. All rights reserved.
7+
//
8+
9+
import UIKit
10+
import SwiftCharts
11+
12+
13+
class ChartAxisValueDoubleUnit: ChartAxisValueDouble {
14+
let unitString: String
15+
16+
init(_ double: Double, unitString: String, formatter: NSNumberFormatter) {
17+
self.unitString = unitString
18+
19+
super.init(double, formatter: formatter)
20+
}
21+
22+
init(_ double: Double, unitString: String) {
23+
self.unitString = unitString
24+
25+
super.init(double)
26+
}
27+
28+
override var description: String {
29+
return "\(super.description) \(unitString)"
30+
}
31+
}

0 commit comments

Comments
 (0)