Yakov Karpov 5 лет назад
Родитель
Сommit
2fbf114e4f

+ 4 - 24
FreeAPS.xcodeproj/project.pbxproj

@@ -207,7 +207,6 @@
 		5D16287A969E64D18CE40E44 /* PumpConfigViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F60E97100041040446F44E7 /* PumpConfigViewModel.swift */; };
 		5D16287A969E64D18CE40E44 /* PumpConfigViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F60E97100041040446F44E7 /* PumpConfigViewModel.swift */; };
 		63E890B4D951EAA91C071D5C /* BasalProfileEditorViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAFF91130F2FCCC7EBBA11AD /* BasalProfileEditorViewModel.swift */; };
 		63E890B4D951EAA91C071D5C /* BasalProfileEditorViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAFF91130F2FCCC7EBBA11AD /* BasalProfileEditorViewModel.swift */; };
 		642F76A05A4FF530463A9FD0 /* NightscoutConfigRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8782B44544F38F2B2D82C38E /* NightscoutConfigRootView.swift */; };
 		642F76A05A4FF530463A9FD0 /* NightscoutConfigRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8782B44544F38F2B2D82C38E /* NightscoutConfigRootView.swift */; };
-		6610FA1525FAED29004781D7 /* SampleData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6610F9F325FAED29004781D7 /* SampleData.swift */; };
 		6610FA1725FAED29004781D7 /* PointData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6610F9F625FAED29004781D7 /* PointData.swift */; };
 		6610FA1725FAED29004781D7 /* PointData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6610F9F625FAED29004781D7 /* PointData.swift */; };
 		6610FA1825FAED29004781D7 /* BoundTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6610F9F725FAED29004781D7 /* BoundTypes.swift */; };
 		6610FA1825FAED29004781D7 /* BoundTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6610F9F725FAED29004781D7 /* BoundTypes.swift */; };
 		6610FA1925FAED29004781D7 /* InformationBarEntryData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6610F9F825FAED29004781D7 /* InformationBarEntryData.swift */; };
 		6610FA1925FAED29004781D7 /* InformationBarEntryData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6610F9F825FAED29004781D7 /* InformationBarEntryData.swift */; };
@@ -229,12 +228,10 @@
 		6610FA2925FAED29004781D7 /* ChartsConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6610FA0C25FAED29004781D7 /* ChartsConfig.swift */; };
 		6610FA2925FAED29004781D7 /* ChartsConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6610FA0C25FAED29004781D7 /* ChartsConfig.swift */; };
 		6610FA2A25FAED29004781D7 /* GlucosePointView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6610FA0E25FAED29004781D7 /* GlucosePointView.swift */; };
 		6610FA2A25FAED29004781D7 /* GlucosePointView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6610FA0E25FAED29004781D7 /* GlucosePointView.swift */; };
 		6610FA2B25FAED29004781D7 /* PredictionPointView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6610FA0F25FAED29004781D7 /* PredictionPointView.swift */; };
 		6610FA2B25FAED29004781D7 /* PredictionPointView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6610FA0F25FAED29004781D7 /* PredictionPointView.swift */; };
-		6610FA2C25FAED29004781D7 /* getPredictionColor().swift in Sources */ = {isa = PBXBuildFile; fileRef = 6610FA1125FAED29004781D7 /* getPredictionColor().swift */; };
-		6610FA2D25FAED29004781D7 /* getGlucoseArrowImage().swift in Sources */ = {isa = PBXBuildFile; fileRef = 6610FA1225FAED29004781D7 /* getGlucoseArrowImage().swift */; };
 		6610FA2E25FAED29004781D7 /* APSDataFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6610FA1325FAED29004781D7 /* APSDataFormatter.swift */; };
 		6610FA2E25FAED29004781D7 /* APSDataFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6610FA1325FAED29004781D7 /* APSDataFormatter.swift */; };
 		6610FA2F25FAED29004781D7 /* getChartWidth().swift in Sources */ = {isa = PBXBuildFile; fileRef = 6610FA1425FAED29004781D7 /* getChartWidth().swift */; };
 		6610FA2F25FAED29004781D7 /* getChartWidth().swift in Sources */ = {isa = PBXBuildFile; fileRef = 6610FA1425FAED29004781D7 /* getChartWidth().swift */; };
 		6632A0DC746872439A858B44 /* ISFEditorDataFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79BDA519C9B890FD9A5DFCF3 /* ISFEditorDataFlow.swift */; };
 		6632A0DC746872439A858B44 /* ISFEditorDataFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79BDA519C9B890FD9A5DFCF3 /* ISFEditorDataFlow.swift */; };
-		66C5083C25FD97FA00E4D76A /* MainChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66C5083B25FD97FA00E4D76A /* MainChartView.swift */; };
+		66C5083C25FD97FA00E4D76A /* CombinedChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66C5083B25FD97FA00E4D76A /* CombinedChartView.swift */; };
 		69A31254F2451C20361D172F /* BolusViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 223EC0494F55A91E3EA69EF4 /* BolusViewModel.swift */; };
 		69A31254F2451C20361D172F /* BolusViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 223EC0494F55A91E3EA69EF4 /* BolusViewModel.swift */; };
 		69B9A368029F7EB39F525422 /* CREditorViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64AA5E04A2761F6EEA6568E1 /* CREditorViewModel.swift */; };
 		69B9A368029F7EB39F525422 /* CREditorViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64AA5E04A2761F6EEA6568E1 /* CREditorViewModel.swift */; };
 		6B9625766B697D1C98E455A2 /* PumpSettingsEditorViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72778B68C3004F71F6E79BDC /* PumpSettingsEditorViewModel.swift */; };
 		6B9625766B697D1C98E455A2 /* PumpSettingsEditorViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72778B68C3004F71F6E79BDC /* PumpSettingsEditorViewModel.swift */; };
@@ -505,7 +502,6 @@
 		5F48C3AC770D4CCD0EA2B0C2 /* AddCarbsDataFlow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AddCarbsDataFlow.swift; sourceTree = "<group>"; };
 		5F48C3AC770D4CCD0EA2B0C2 /* AddCarbsDataFlow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AddCarbsDataFlow.swift; sourceTree = "<group>"; };
 		618E62C9757B2F95431B5DC0 /* AddCarbsProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AddCarbsProvider.swift; sourceTree = "<group>"; };
 		618E62C9757B2F95431B5DC0 /* AddCarbsProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AddCarbsProvider.swift; sourceTree = "<group>"; };
 		64AA5E04A2761F6EEA6568E1 /* CREditorViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CREditorViewModel.swift; sourceTree = "<group>"; };
 		64AA5E04A2761F6EEA6568E1 /* CREditorViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CREditorViewModel.swift; sourceTree = "<group>"; };
-		6610F9F325FAED29004781D7 /* SampleData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SampleData.swift; sourceTree = "<group>"; };
 		6610F9F625FAED29004781D7 /* PointData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PointData.swift; sourceTree = "<group>"; };
 		6610F9F625FAED29004781D7 /* PointData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PointData.swift; sourceTree = "<group>"; };
 		6610F9F725FAED29004781D7 /* BoundTypes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoundTypes.swift; sourceTree = "<group>"; };
 		6610F9F725FAED29004781D7 /* BoundTypes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoundTypes.swift; sourceTree = "<group>"; };
 		6610F9F825FAED29004781D7 /* InformationBarEntryData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InformationBarEntryData.swift; sourceTree = "<group>"; };
 		6610F9F825FAED29004781D7 /* InformationBarEntryData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InformationBarEntryData.swift; sourceTree = "<group>"; };
@@ -527,11 +523,9 @@
 		6610FA0C25FAED29004781D7 /* ChartsConfig.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChartsConfig.swift; sourceTree = "<group>"; };
 		6610FA0C25FAED29004781D7 /* ChartsConfig.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChartsConfig.swift; sourceTree = "<group>"; };
 		6610FA0E25FAED29004781D7 /* GlucosePointView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GlucosePointView.swift; sourceTree = "<group>"; };
 		6610FA0E25FAED29004781D7 /* GlucosePointView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GlucosePointView.swift; sourceTree = "<group>"; };
 		6610FA0F25FAED29004781D7 /* PredictionPointView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PredictionPointView.swift; sourceTree = "<group>"; };
 		6610FA0F25FAED29004781D7 /* PredictionPointView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PredictionPointView.swift; sourceTree = "<group>"; };
-		6610FA1125FAED29004781D7 /* getPredictionColor().swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "getPredictionColor().swift"; sourceTree = "<group>"; };
-		6610FA1225FAED29004781D7 /* getGlucoseArrowImage().swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "getGlucoseArrowImage().swift"; sourceTree = "<group>"; };
 		6610FA1325FAED29004781D7 /* APSDataFormatter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APSDataFormatter.swift; sourceTree = "<group>"; };
 		6610FA1325FAED29004781D7 /* APSDataFormatter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APSDataFormatter.swift; sourceTree = "<group>"; };
 		6610FA1425FAED29004781D7 /* getChartWidth().swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "getChartWidth().swift"; sourceTree = "<group>"; };
 		6610FA1425FAED29004781D7 /* getChartWidth().swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "getChartWidth().swift"; sourceTree = "<group>"; };
-		66C5083B25FD97FA00E4D76A /* MainChartView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainChartView.swift; sourceTree = "<group>"; };
+		66C5083B25FD97FA00E4D76A /* CombinedChartView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CombinedChartView.swift; sourceTree = "<group>"; };
 		67F94DD2853CF42BA4E30616 /* BasalProfileEditorDataFlow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BasalProfileEditorDataFlow.swift; sourceTree = "<group>"; };
 		67F94DD2853CF42BA4E30616 /* BasalProfileEditorDataFlow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BasalProfileEditorDataFlow.swift; sourceTree = "<group>"; };
 		680C4420C9A345D46D90D06C /* ManualTempBasalProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ManualTempBasalProvider.swift; sourceTree = "<group>"; };
 		680C4420C9A345D46D90D06C /* ManualTempBasalProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ManualTempBasalProvider.swift; sourceTree = "<group>"; };
 		6BA56D2DCAB9E0A8AF24D984 /* BasalProfileEditorBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BasalProfileEditorBuilder.swift; sourceTree = "<group>"; };
 		6BA56D2DCAB9E0A8AF24D984 /* BasalProfileEditorBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BasalProfileEditorBuilder.swift; sourceTree = "<group>"; };
@@ -1301,7 +1295,6 @@
 		6610F9F125FAED29004781D7 /* Charts */ = {
 		6610F9F125FAED29004781D7 /* Charts */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
-				6610F9F225FAED29004781D7 /* Sample Data */,
 				6610F9F425FAED29004781D7 /* Models */,
 				6610F9F425FAED29004781D7 /* Models */,
 				6610F9FE25FAED29004781D7 /* Extensions */,
 				6610F9FE25FAED29004781D7 /* Extensions */,
 				6610FA0425FAED29004781D7 /* Views */,
 				6610FA0425FAED29004781D7 /* Views */,
@@ -1310,14 +1303,6 @@
 			path = Charts;
 			path = Charts;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
-		6610F9F225FAED29004781D7 /* Sample Data */ = {
-			isa = PBXGroup;
-			children = (
-				6610F9F325FAED29004781D7 /* SampleData.swift */,
-			);
-			path = "Sample Data";
-			sourceTree = "<group>";
-		};
 		6610F9F425FAED29004781D7 /* Models */ = {
 		6610F9F425FAED29004781D7 /* Models */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
@@ -1361,7 +1346,7 @@
 			children = (
 			children = (
 				6610FA0625FAED29004781D7 /* PredictionsChartView.swift */,
 				6610FA0625FAED29004781D7 /* PredictionsChartView.swift */,
 				6610FA0725FAED29004781D7 /* PointChartView.swift */,
 				6610FA0725FAED29004781D7 /* PointChartView.swift */,
-				66C5083B25FD97FA00E4D76A /* MainChartView.swift */,
+				66C5083B25FD97FA00E4D76A /* CombinedChartView.swift */,
 			);
 			);
 			path = Charts;
 			path = Charts;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
@@ -1388,8 +1373,6 @@
 		6610FA1025FAED29004781D7 /* Helpers */ = {
 		6610FA1025FAED29004781D7 /* Helpers */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
-				6610FA1125FAED29004781D7 /* getPredictionColor().swift */,
-				6610FA1225FAED29004781D7 /* getGlucoseArrowImage().swift */,
 				6610FA1325FAED29004781D7 /* APSDataFormatter.swift */,
 				6610FA1325FAED29004781D7 /* APSDataFormatter.swift */,
 				6610FA1425FAED29004781D7 /* getChartWidth().swift */,
 				6610FA1425FAED29004781D7 /* getChartWidth().swift */,
 			);
 			);
@@ -1730,11 +1713,9 @@
 				3883583425EEB38000E024B2 /* PumpSettings.swift in Sources */,
 				3883583425EEB38000E024B2 /* PumpSettings.swift in Sources */,
 				3811DEB125C9D88300A708ED /* Keychain.swift in Sources */,
 				3811DEB125C9D88300A708ED /* Keychain.swift in Sources */,
 				382C133725F13A1E00715CE1 /* InsulinSensitivities.swift in Sources */,
 				382C133725F13A1E00715CE1 /* InsulinSensitivities.swift in Sources */,
-				6610FA2C25FAED29004781D7 /* getPredictionColor().swift in Sources */,
 				3811DE7B25C9D6D300A708ED /* LoginProvider.swift in Sources */,
 				3811DE7B25C9D6D300A708ED /* LoginProvider.swift in Sources */,
 				383948D625CD4D8900E91849 /* FileStorage.swift in Sources */,
 				383948D625CD4D8900E91849 /* FileStorage.swift in Sources */,
 				389FE32A25F3AC44002E92E0 /* GlucoseChartView.swift in Sources */,
 				389FE32A25F3AC44002E92E0 /* GlucoseChartView.swift in Sources */,
-				6610FA1525FAED29004781D7 /* SampleData.swift in Sources */,
 				3811DE4125C9D4A100A708ED /* SettingsRootView.swift in Sources */,
 				3811DE4125C9D4A100A708ED /* SettingsRootView.swift in Sources */,
 				388E595C25AD948C0019842D /* FreeAPSApp.swift in Sources */,
 				388E595C25AD948C0019842D /* FreeAPSApp.swift in Sources */,
 				6610FA2A25FAED29004781D7 /* GlucosePointView.swift in Sources */,
 				6610FA2A25FAED29004781D7 /* GlucosePointView.swift in Sources */,
@@ -1802,7 +1783,6 @@
 				3811DE4F25C9D4B800A708ED /* AuthotizedRootDataFlow.swift in Sources */,
 				3811DE4F25C9D4B800A708ED /* AuthotizedRootDataFlow.swift in Sources */,
 				38BF021F25E7F0DE00579895 /* DeviceDataManager.swift in Sources */,
 				38BF021F25E7F0DE00579895 /* DeviceDataManager.swift in Sources */,
 				3811DE5025C9D4B800A708ED /* AuthotizedRootProvider.swift in Sources */,
 				3811DE5025C9D4B800A708ED /* AuthotizedRootProvider.swift in Sources */,
-				6610FA2D25FAED29004781D7 /* getGlucoseArrowImage().swift in Sources */,
 				38A504A425DD9C4000C5B9E8 /* UserDefaultsExtensions.swift in Sources */,
 				38A504A425DD9C4000C5B9E8 /* UserDefaultsExtensions.swift in Sources */,
 				38FE826A25CC82DB001FF17A /* NetworkService.swift in Sources */,
 				38FE826A25CC82DB001FF17A /* NetworkService.swift in Sources */,
 				3883581C25EE79BB00E024B2 /* DecimalTextField.swift in Sources */,
 				3883581C25EE79BB00E024B2 /* DecimalTextField.swift in Sources */,
@@ -1905,7 +1885,7 @@
 				BF1667ADE69E4B5B111CECAE /* ManualTempBasalProvider.swift in Sources */,
 				BF1667ADE69E4B5B111CECAE /* ManualTempBasalProvider.swift in Sources */,
 				C967DACD3B1E638F8B43BE06 /* ManualTempBasalViewModel.swift in Sources */,
 				C967DACD3B1E638F8B43BE06 /* ManualTempBasalViewModel.swift in Sources */,
 				7BCFACB97C821041BA43A114 /* ManualTempBasalRootView.swift in Sources */,
 				7BCFACB97C821041BA43A114 /* ManualTempBasalRootView.swift in Sources */,
-				66C5083C25FD97FA00E4D76A /* MainChartView.swift in Sources */,
+				66C5083C25FD97FA00E4D76A /* CombinedChartView.swift in Sources */,
 				38A00B2325FC2B55006BC0B0 /* LRUCache.swift in Sources */,
 				38A00B2325FC2B55006BC0B0 /* LRUCache.swift in Sources */,
 				91732A8060347C0E67024D80 /* AutotuneConfigBuilder.swift in Sources */,
 				91732A8060347C0E67024D80 /* AutotuneConfigBuilder.swift in Sources */,
 				3083261C4B268E353F36CD0B /* AutotuneConfigDataFlow.swift in Sources */,
 				3083261C4B268E353F36CD0B /* AutotuneConfigDataFlow.swift in Sources */,

+ 1 - 1
FreeAPS/Sources/Charts/Extensions/View+Modifiers.swift

@@ -9,7 +9,7 @@ private struct InformationBarEntryModifier: ViewModifier {
     }
     }
 }
 }
 
 
-internal extension View {
+extension View {
     func informationBarEntryStyle() -> some View {
     func informationBarEntryStyle() -> some View {
         modifier(InformationBarEntryModifier())
         modifier(InformationBarEntryModifier())
     }
     }

+ 9 - 15
FreeAPS/Sources/Charts/Helpers/getGlucoseArrowImage().swift

@@ -11,11 +11,9 @@ func getGlucoseArrowImage(for delta: BloodGlucose.Direction) -> Image {
     let error = "arrow.left.arrow.right"
     let error = "arrow.left.arrow.right"
 
 
     switch delta {
     switch delta {
-    case .tripleUp:
-        arrow = up
-    case .doubleUp:
-        arrow = up
-    case .singleUp:
+    case .doubleUp,
+         .singleUp,
+         .tripleUp:
         arrow = up
         arrow = up
     case .fortyFiveUp:
     case .fortyFiveUp:
         arrow = upForward
         arrow = upForward
@@ -23,17 +21,13 @@ func getGlucoseArrowImage(for delta: BloodGlucose.Direction) -> Image {
         arrow = forward
         arrow = forward
     case .fortyFiveDown:
     case .fortyFiveDown:
         arrow = downForward
         arrow = downForward
-    case .singleDown:
-        arrow = down
-    case .doubleDown:
+    case .doubleDown,
+         .singleDown,
+         .tripleDown:
         arrow = down
         arrow = down
-    case .tripleDown:
-        arrow = down
-    case .none:
-        arrow = error
-    case .notComputable:
-        arrow = error
-    case .rateOutOfRange:
+    case .none,
+         .notComputable,
+         .rateOutOfRange:
         arrow = error
         arrow = error
     }
     }
 
 

+ 0 - 18
FreeAPS/Sources/Charts/Helpers/getPredictionColor().swift

@@ -1,18 +0,0 @@
-import SwiftUI
-
-func getPredictionColor(for type: PredictionType, value: Int?) -> Color {
-    let color: Color
-
-    switch type {
-    case .iob:
-        color = Color(.systemTeal)
-    case .cob:
-        color = Color(.systemOrange)
-    case .zt:
-        color = Color(.systemPink)
-    case .uam:
-        color = Color(.systemIndigo)
-    }
-
-    return color.opacity(value != nil ? 1 : 0)
-}

+ 1 - 1
FreeAPS/Sources/Charts/Models/APSDataTypes.swift

@@ -1,6 +1,6 @@
 import Foundation
 import Foundation
 
 
-public enum APSDataTypes {
+enum APSDataTypes {
     case delta
     case delta
     case glucose
     case glucose
     case cob
     case cob

+ 5 - 5
FreeAPS/Sources/Charts/Models/GlucosePointData.swift

@@ -1,8 +1,8 @@
 import SwiftUI
 import SwiftUI
 
 
-public struct GlucosePointData: PointData {
-    public var id = UUID()
-    public let value: Int?
-    public let xPosition: CGFloat
-    public let yPosition: CGFloat?
+struct GlucosePointData: PointData {
+    var id = UUID()
+    let value: Int?
+    let xPosition: CGFloat
+    let yPosition: CGFloat?
 }
 }

+ 2 - 2
FreeAPS/Sources/Charts/Models/InformationBarEntryData.swift

@@ -1,7 +1,7 @@
 import Foundation
 import Foundation
 
 
-public struct InformationBarEntryData: Identifiable, Hashable {
-    public var id = UUID()
+struct InformationBarEntryData: Identifiable, Hashable {
+    var id = UUID()
     let label: String
     let label: String
     let value: Double
     let value: Double
     let type: APSDataTypes
     let type: APSDataTypes

+ 1 - 2
FreeAPS/Sources/Charts/Models/PointData.swift

@@ -1,7 +1,6 @@
-import Foundation
 import SwiftUI
 import SwiftUI
 
 
-public protocol PointData: Identifiable, Hashable {
+protocol PointData: Identifiable, Hashable {
     var id: UUID { get }
     var id: UUID { get }
     var value: Int? { get }
     var value: Int? { get }
     var xPosition: CGFloat { get }
     var xPosition: CGFloat { get }

+ 2 - 2
FreeAPS/Sources/Charts/Models/PredictionLineData.swift

@@ -1,7 +1,7 @@
 import Foundation
 import Foundation
 
 
-public struct PredictionLineData: Identifiable, Hashable {
-    public var id = UUID()
+struct PredictionLineData: Identifiable, Hashable {
+    var id = UUID()
     let type: PredictionType
     let type: PredictionType
     var values: [BloodGlucose]
     var values: [BloodGlucose]
 }
 }

+ 1 - 1
FreeAPS/Sources/Charts/Models/PredictionType.swift

@@ -1,6 +1,6 @@
 import SwiftUI
 import SwiftUI
 
 
-public enum PredictionType: String {
+enum PredictionType: String {
     case iob
     case iob
     case cob
     case cob
     case zt
     case zt

+ 0 - 51
FreeAPS/Sources/Charts/Sample Data/SampleData.swift

@@ -1,51 +0,0 @@
-import Foundation
-
-enum SampleData {
-    private static var baseComponents: DateComponents = {
-        var dateComponents = DateComponents()
-        dateComponents.year = 2021
-        dateComponents.month = 3
-        dateComponents.day = 8
-        dateComponents.timeZone = TimeZone(abbreviation: "MSK")
-        dateComponents.hour = 8
-        return dateComponents
-    }()
-
-    private static func generateDate(baseDateComponents: DateComponents, minutes: Int) -> Date {
-        var localComponents = baseDateComponents
-        localComponents.minute = minutes
-        let userCalendar = Calendar(identifier: .gregorian)
-        return userCalendar.date(from: localComponents)!
-    }
-
-    private static func generateGlucoseStream(startingPoint: Int, length: Int, amount: Int, direction: Int) -> [Int] {
-        // Downwards
-        if direction == 0 {
-            return (1 ... length).map { startingPoint - $0 * amount }
-        }
-        return (1 ... length).map { startingPoint + $0 * amount }
-    }
-
-    static var sampleData: [BloodGlucose] {
-        let mediumUp = generateGlucoseStream(startingPoint: 77, length: 80, amount: 2, direction: 1)
-        let fastUp = generateGlucoseStream(startingPoint: mediumUp.last!, length: 20, amount: 5, direction: 1)
-        let fastDown = generateGlucoseStream(startingPoint: fastUp.last!, length: 12, amount: 13, direction: 0)
-        let mediumDown = generateGlucoseStream(startingPoint: fastDown.last!, length: 33, amount: 3, direction: 0)
-        let slowUp = generateGlucoseStream(startingPoint: mediumDown.last!, length: 144, amount: 1, direction: 1)
-
-        let glucose = mediumUp + fastUp + fastDown + mediumDown + slowUp
-        let normalTime = (0 ... 278).map { generateDate(baseDateComponents: baseComponents, minutes: $0 * 5) }
-        let tenMinutes = (279 ... 288).map { generateDate(baseDateComponents: baseComponents, minutes: $0 * 30) }
-        let time = normalTime + tenMinutes
-
-        return zip(glucose, time).map { BloodGlucose(
-            sgv: $0,
-            direction: nil,
-            date: UInt64($1.timeIntervalSince1970),
-            dateString: $1,
-            filtered: nil,
-            noise: nil,
-            glucose: nil
-        ) }
-    }
-}

+ 2 - 2
FreeAPS/Sources/Charts/Views/Charts/MainChartView.swift

@@ -1,6 +1,6 @@
 import SwiftUI
 import SwiftUI
 
 
-struct MainChartView: View {
+struct CombinedChartView: View {
     let maxWidth: CGFloat
     let maxWidth: CGFloat
     let showHours: Int
     let showHours: Int
     @Binding var glucoseData: [BloodGlucose]
     @Binding var glucoseData: [BloodGlucose]
@@ -31,7 +31,7 @@ struct MainChartView: View {
     }
     }
 }
 }
 
 
-extension MainChartView {
+extension CombinedChartView {
     func getAllValues() -> [Int] {
     func getAllValues() -> [Int] {
         let glucoseValues = glucoseData.compactMap(\.sgv)
         let glucoseValues = glucoseData.compactMap(\.sgv)
         guard let predictionValues = getPredictionValues() else {
         guard let predictionValues = getPredictionValues() else {

+ 1 - 1
FreeAPS/Sources/Charts/Views/Charts/PointChartView.swift

@@ -13,7 +13,7 @@ struct PointChartView<PointEntry: View>: View {
     let hoursMultiplier: Double = 12
     let hoursMultiplier: Double = 12
     let pointSize: CGFloat = ChartsConfig.glucosePointSize / 2
     let pointSize: CGFloat = ChartsConfig.glucosePointSize / 2
 
 
-    public var body: some View {
+    var body: some View {
         let firstEntryTime = glucoseData
         let firstEntryTime = glucoseData
             .map(\.dateString)
             .map(\.dateString)
             .first ?? Date()
             .first ?? Date()

+ 2 - 2
FreeAPS/Sources/Charts/Views/Charts/PredictionsChartView.swift

@@ -1,6 +1,6 @@
 import SwiftUI
 import SwiftUI
 
 
-public struct PredictionsChartView: View {
+struct PredictionsChartView: View {
     let minValue: Int
     let minValue: Int
     let maxValue: Int
     let maxValue: Int
     let maxWidth: CGFloat
     let maxWidth: CGFloat
@@ -27,7 +27,7 @@ public struct PredictionsChartView: View {
         }
         }
     }
     }
 
 
-    public var body: some View {
+    var body: some View {
         ZStack {
         ZStack {
             chartsData
             chartsData
         }
         }

+ 39 - 3
FreeAPS/Sources/Charts/Views/Components/GlucoseArrowView.swift

@@ -1,15 +1,51 @@
 import SwiftUI
 import SwiftUI
 
 
-public struct GlucoseArrowView: View {
+struct GlucoseArrowView: View {
     let direction: BloodGlucose.Direction
     let direction: BloodGlucose.Direction
 
 
-    public var body: some View {
-        getGlucoseArrowImage(for: direction)
+    var body: some View {
+        arrowImage
             .foregroundColor(Color(.systemBlue))
             .foregroundColor(Color(.systemBlue))
             .informationBarEntryStyle()
             .informationBarEntryStyle()
     }
     }
 }
 }
 
 
+extension GlucoseArrowView {
+    var arrowImage: Image {
+        let arrow: String
+
+        let up = "arrow.up"
+        let upForward = "arrow.up.forward"
+        let forward = "arrow.forward"
+        let downForward = "arrow.down.forward"
+        let down = "arrow.down"
+        let error = "arrow.left.arrow.right"
+
+        switch direction {
+        case .doubleUp,
+             .singleUp,
+             .tripleUp:
+            arrow = up
+        case .fortyFiveUp:
+            arrow = upForward
+        case .flat:
+            arrow = forward
+        case .fortyFiveDown:
+            arrow = downForward
+        case .doubleDown,
+             .singleDown,
+             .tripleDown:
+            arrow = down
+        case .none,
+             .notComputable,
+             .rateOutOfRange:
+            arrow = error
+        }
+
+        return Image(systemName: arrow)
+    }
+}
+
 struct GlucoseArrowView_Previews: PreviewProvider {
 struct GlucoseArrowView_Previews: PreviewProvider {
     static var previews: some View {
     static var previews: some View {
         GlucoseArrowView(direction: .fortyFiveDown)
         GlucoseArrowView(direction: .fortyFiveDown)

+ 2 - 2
FreeAPS/Sources/Charts/Views/Components/GlucoseInformationBarView.swift

@@ -1,12 +1,12 @@
 import SwiftUI
 import SwiftUI
 
 
-public struct GlucoseInformationBarView: View {
+struct GlucoseInformationBarView: View {
     let data: [InformationBarEntryData]
     let data: [InformationBarEntryData]
     let glucoseValue: Double
     let glucoseValue: Double
     let glucoseDelta: Double
     let glucoseDelta: Double
     let direction: BloodGlucose.Direction
     let direction: BloodGlucose.Direction
 
 
-    public var body: some View {
+    var body: some View {
         let halvedEntryData = data.halve()
         let halvedEntryData = data.halve()
         HStack {
         HStack {
             VStack {
             VStack {

+ 2 - 6
FreeAPS/Sources/Charts/Views/Components/HoursPickerView.swift

@@ -1,14 +1,10 @@
 import SwiftUI
 import SwiftUI
 
 
-public struct HoursPickerView: View {
+struct HoursPickerView: View {
     @Binding var selectedHour: Int
     @Binding var selectedHour: Int
     private let avaliableHours = [1, 3, 6, 12]
     private let avaliableHours = [1, 3, 6, 12]
 
 
-    public init(selectedHour: Binding<Int>) {
-        _selectedHour = selectedHour
-    }
-
-    public var body: some View {
+    var body: some View {
         Picker("Show Hours", selection: $selectedHour) {
         Picker("Show Hours", selection: $selectedHour) {
             ForEach(avaliableHours, id: \.self) { hour in
             ForEach(avaliableHours, id: \.self) { hour in
                 Text(String(hour) + "HR")
                 Text(String(hour) + "HR")

+ 20 - 1
FreeAPS/Sources/Charts/Views/Points/PredictionPointView.swift

@@ -7,7 +7,7 @@ struct PredictionPointView: View {
     var body: some View {
     var body: some View {
         Circle()
         Circle()
             .strokeBorder(
             .strokeBorder(
-                getPredictionColor(for: predictionType, value: value),
+                predictionColor,
                 lineWidth: 1.5,
                 lineWidth: 1.5,
                 antialiased: true
                 antialiased: true
             )
             )
@@ -15,6 +15,25 @@ struct PredictionPointView: View {
     }
     }
 }
 }
 
 
+extension PredictionPointView {
+    var predictionColor: Color {
+        let color: Color
+
+        switch predictionType {
+        case .iob:
+            color = Color(.systemTeal)
+        case .cob:
+            color = Color(.systemOrange)
+        case .zt:
+            color = Color(.systemPink)
+        case .uam:
+            color = Color(.systemIndigo)
+        }
+
+        return color.opacity(value != nil ? 1 : 0)
+    }
+}
+
 struct PredictionPointView_Previews: PreviewProvider {
 struct PredictionPointView_Previews: PreviewProvider {
     static var previews: some View {
     static var previews: some View {
         PredictionPointView(predictionType: .iob, value: 3)
         PredictionPointView(predictionType: .iob, value: 3)

+ 30 - 9
FreeAPS/Sources/Modules/Home/View/HomeRootView.swift

@@ -5,10 +5,10 @@ extension Home {
         @EnvironmentObject var viewModel: ViewModel<Provider>
         @EnvironmentObject var viewModel: ViewModel<Provider>
         @State var showHours = 1
         @State var showHours = 1
 
 
-        var chart: some View {
+        var mainChart: some View {
             GeometryReader { geo in
             GeometryReader { geo in
                 ScrollView(.horizontal, showsIndicators: false) {
                 ScrollView(.horizontal, showsIndicators: false) {
-                    MainChartView(
+                    CombinedChartView(
                         maxWidth: geo.size.width,
                         maxWidth: geo.size.width,
                         showHours: showHours,
                         showHours: showHours,
                         glucoseData: $viewModel.glucose,
                         glucoseData: $viewModel.glucose,
@@ -16,6 +16,24 @@ extension Home {
                     )
                     )
                 }
                 }
             }
             }
+            .padding(.vertical)
+            .background(Color(.systemGray6))
+            .cornerRadius(12)
+        }
+
+        var previewChart: some View {
+            GeometryReader { geo in
+                CombinedChartView(
+                    maxWidth: geo.size.width,
+                    showHours: 24,
+                    glucoseData: $viewModel.glucose,
+                    predictionsData: .constant([])
+                )
+            }
+            .frame(maxWidth: .infinity)
+            .padding(.vertical)
+            .background(Color(.systemGray6))
+            .cornerRadius(10)
         }
         }
 
 
         var body: some View {
         var body: some View {
@@ -26,13 +44,16 @@ extension Home {
                         Text("Header")
                         Text("Header")
                     }
                     }
                     ScrollView(.vertical, showsIndicators: false) {
                     ScrollView(.vertical, showsIndicators: false) {
-                        HoursPickerView(selectedHour: $showHours)
-                        chart
-                            .frame(height: 300)
-                            .padding(.vertical)
-                            .background(Color(.systemGray6))
-                            .cornerRadius(20)
-                            .padding()
+                        HoursPickerView(selectedHour: $showHours).padding(.horizontal)
+
+                        mainChart
+                            .frame(height: geo.size.height * 0.6)
+
+                            .padding(.horizontal)
+
+                        previewChart
+                            .frame(height: 50)
+                            .padding(.horizontal)
                         // GlucoseChartView(glucose: $viewModel.glucose, suggestion: $viewModel.suggestion).frame(height: 150)
                         // GlucoseChartView(glucose: $viewModel.glucose, suggestion: $viewModel.suggestion).frame(height: 150)
                         if let reason = viewModel.suggestion?.reason {
                         if let reason = viewModel.suggestion?.reason {
                             Text(reason).font(.caption).padding()
                             Text(reason).font(.caption).padding()