ソースを参照

Merge pull request #431 from AndreasStokholm/fix/therapy-charts

fix: Draw Therapy Settings charts with correct time in both DST and non-DST time
Deniz Cengiz 1 年間 前
コミット
0e4a0c3287

+ 12 - 5
Trio/Sources/Modules/BasalProfileEditor/View/BasalProfileEditorRootView.swift

@@ -10,6 +10,7 @@ extension BasalProfileEditor {
 
 
         let chartScale = Calendar.current
         let chartScale = Calendar.current
             .date(from: DateComponents(year: 2001, month: 01, day: 01, hour: 0, minute: 0, second: 0))
             .date(from: DateComponents(year: 2001, month: 01, day: 01, hour: 0, minute: 0, second: 0))
+        let tzOffset = TimeZone.current.secondsFromGMT()
 
 
         @Environment(\.colorScheme) var colorScheme
         @Environment(\.colorScheme) var colorScheme
         @Environment(AppState.self) var appState
         @Environment(AppState.self) var appState
@@ -28,12 +29,17 @@ extension BasalProfileEditor {
             return formatter
             return formatter
         }
         }
 
 
+        var now = Date()
         var basalScheduleChart: some View {
         var basalScheduleChart: some View {
             Chart {
             Chart {
                 ForEach(state.chartData!, id: \.self) { profile in
                 ForEach(state.chartData!, id: \.self) { profile in
+                    let startDate = Calendar.current.startOfDay(for: now)
+                        .addingTimeInterval(profile.startDate.timeIntervalSinceReferenceDate + Double(tzOffset))
+                    let endDate = Calendar.current.startOfDay(for: now)
+                        .addingTimeInterval(profile.endDate!.timeIntervalSinceReferenceDate + Double(tzOffset))
                     RectangleMark(
                     RectangleMark(
-                        xStart: .value("start", profile.startDate),
-                        xEnd: .value("end", profile.endDate!),
+                        xStart: .value("start", startDate),
+                        xEnd: .value("end", endDate),
                         yStart: .value("rate-start", profile.amount),
                         yStart: .value("rate-start", profile.amount),
                         yEnd: .value("rate-end", 0)
                         yEnd: .value("rate-end", 0)
                     ).foregroundStyle(
                     ).foregroundStyle(
@@ -47,10 +53,10 @@ extension BasalProfileEditor {
                         )
                         )
                     ).alignsMarkStylesWithPlotArea()
                     ).alignsMarkStylesWithPlotArea()
 
 
-                    LineMark(x: .value("End Date", profile.endDate!), y: .value("Amount", profile.amount))
+                    LineMark(x: .value("End Date", endDate), y: .value("Amount", profile.amount))
                         .lineStyle(.init(lineWidth: 1)).foregroundStyle(Color.insulin)
                         .lineStyle(.init(lineWidth: 1)).foregroundStyle(Color.insulin)
 
 
-                    LineMark(x: .value("Start Date", profile.startDate), y: .value("Amount", profile.amount))
+                    LineMark(x: .value("Start Date", startDate), y: .value("Amount", profile.amount))
                         .lineStyle(.init(lineWidth: 1)).foregroundStyle(Color.insulin)
                         .lineStyle(.init(lineWidth: 1)).foregroundStyle(Color.insulin)
                 }
                 }
             }
             }
@@ -67,7 +73,8 @@ extension BasalProfileEditor {
                 }
                 }
             }
             }
             .chartXScale(
             .chartXScale(
-                domain: Calendar.current.startOfDay(for: chartScale!) ... Calendar.current.startOfDay(for: chartScale!)
+                domain: Calendar.current.startOfDay(for: now) ... Calendar
+                    .current.startOfDay(for: now)
                     .addingTimeInterval(60 * 60 * 24)
                     .addingTimeInterval(60 * 60 * 24)
             )
             )
         }
         }

+ 11 - 11
Trio/Sources/Modules/CarbRatioEditor/View/CarbRatioEditorRootView.swift

@@ -177,23 +177,22 @@ extension CarbRatioEditor {
             }
             }
         }
         }
 
 
-        let chartScale = Calendar.current
-            .date(from: DateComponents(year: 2001, month: 01, day: 01, hour: 0, minute: 0, second: 0))
-
+        var now = Date()
         var chart: some View {
         var chart: some View {
             Chart {
             Chart {
                 ForEach(state.items.indexed(), id: \.1.id) { index, item in
                 ForEach(state.items.indexed(), id: \.1.id) { index, item in
                     let displayValue = state.rateValues[item.rateIndex]
                     let displayValue = state.rateValues[item.rateIndex]
 
 
-                    let tzOffset = TimeZone.current.secondsFromGMT() * -1
-                    let startDate = Date(timeIntervalSinceReferenceDate: state.timeValues[item.timeIndex])
-                        .addingTimeInterval(TimeInterval(tzOffset))
+                    let startDate = Calendar.current
+                        .startOfDay(for: now)
+                        .addingTimeInterval(state.timeValues[item.timeIndex])
                     let endDate = state.items
                     let endDate = state.items
                         .count > index + 1 ?
                         .count > index + 1 ?
-                        Date(timeIntervalSinceReferenceDate: state.timeValues[state.items[index + 1].timeIndex])
-                        .addingTimeInterval(TimeInterval(tzOffset)) :
-                        Date(timeIntervalSinceReferenceDate: state.timeValues.last!).addingTimeInterval(30 * 60)
-                        .addingTimeInterval(TimeInterval(tzOffset))
+                        Calendar.current.startOfDay(for: now)
+                        .addingTimeInterval(state.timeValues[state.items[index + 1].timeIndex])
+                        :
+                        Calendar.current.startOfDay(for: now)
+                        .addingTimeInterval(state.timeValues.last! + 30 * 60)
                     RectangleMark(
                     RectangleMark(
                         xStart: .value("start", startDate),
                         xStart: .value("start", startDate),
                         xEnd: .value("end", endDate),
                         xEnd: .value("end", endDate),
@@ -224,7 +223,8 @@ extension CarbRatioEditor {
                 }
                 }
             }
             }
             .chartXScale(
             .chartXScale(
-                domain: Calendar.current.startOfDay(for: chartScale!) ... Calendar.current.startOfDay(for: chartScale!)
+                domain: Calendar.current.startOfDay(for: now) ... Calendar
+                    .current.startOfDay(for: now)
                     .addingTimeInterval(60 * 60 * 24)
                     .addingTimeInterval(60 * 60 * 24)
             )
             )
             .chartYAxis {
             .chartYAxis {

+ 12 - 10
Trio/Sources/Modules/ISFEditor/View/ISFEditorRootView.swift

@@ -177,8 +177,7 @@ extension ISFEditor {
             }
             }
         }
         }
 
 
-        let chartScale = Calendar.current
-            .date(from: DateComponents(year: 2001, month: 01, day: 01, hour: 0, minute: 0, second: 0))
+        var now = Date()
 
 
         var chart: some View {
         var chart: some View {
             Chart {
             Chart {
@@ -190,15 +189,17 @@ extension ISFEditor {
                     // However, swift doesn't understand languages that use comma as decimal delminator
                     // However, swift doesn't understand languages that use comma as decimal delminator
                     let displayValueFloat = Double(displayValue.replacingOccurrences(of: ",", with: "."))
                     let displayValueFloat = Double(displayValue.replacingOccurrences(of: ",", with: "."))
 
 
-                    let tzOffset = TimeZone.current.secondsFromGMT() * -1
-                    let startDate = Date(timeIntervalSinceReferenceDate: state.timeValues[item.timeIndex])
-                        .addingTimeInterval(TimeInterval(tzOffset))
+                    let startDate = Calendar.current
+                        .startOfDay(for: now)
+                        .addingTimeInterval(state.timeValues[item.timeIndex])
+
                     let endDate = state.items
                     let endDate = state.items
                         .count > index + 1 ?
                         .count > index + 1 ?
-                        Date(timeIntervalSinceReferenceDate: state.timeValues[state.items[index + 1].timeIndex])
-                        .addingTimeInterval(TimeInterval(tzOffset)) :
-                        Date(timeIntervalSinceReferenceDate: state.timeValues.last!).addingTimeInterval(30 * 60)
-                        .addingTimeInterval(TimeInterval(tzOffset))
+                        Calendar.current.startOfDay(for: now)
+                        .addingTimeInterval(state.timeValues[state.items[index + 1].timeIndex])
+                        :
+                        Calendar.current.startOfDay(for: now)
+                        .addingTimeInterval(state.timeValues.last! + 30 * 60)
                     RectangleMark(
                     RectangleMark(
                         xStart: .value("start", startDate),
                         xStart: .value("start", startDate),
                         xEnd: .value("end", endDate),
                         xEnd: .value("end", endDate),
@@ -229,7 +230,8 @@ extension ISFEditor {
                 }
                 }
             }
             }
             .chartXScale(
             .chartXScale(
-                domain: Calendar.current.startOfDay(for: chartScale!) ... Calendar.current.startOfDay(for: chartScale!)
+                domain: Calendar.current.startOfDay(for: now) ... Calendar
+                    .current.startOfDay(for: now)
                     .addingTimeInterval(60 * 60 * 24)
                     .addingTimeInterval(60 * 60 * 24)
             )
             )
             .chartYAxis {
             .chartYAxis {

+ 12 - 11
Trio/Sources/Modules/TargetsEditor/View/TargetsEditorRootView.swift

@@ -169,9 +169,7 @@ extension TargetsEditor {
             }
             }
         }
         }
 
 
-        let chartScale = Calendar.current
-            .date(from: DateComponents(year: 2001, month: 01, day: 01, hour: 0, minute: 0, second: 0))
-
+        var now = Date()
         var chart: some View {
         var chart: some View {
             Chart {
             Chart {
                 ForEach(state.items.indexed(), id: \.1.id) { index, item in
                 ForEach(state.items.indexed(), id: \.1.id) { index, item in
@@ -182,15 +180,17 @@ extension TargetsEditor {
                     // However, swift doesn't understand languages that use comma as decimal delminator
                     // However, swift doesn't understand languages that use comma as decimal delminator
                     let displayValueFloat = Double(displayValue.replacingOccurrences(of: ",", with: "."))
                     let displayValueFloat = Double(displayValue.replacingOccurrences(of: ",", with: "."))
 
 
-                    let tzOffset = TimeZone.current.secondsFromGMT() * -1
-                    let startDate = Date(timeIntervalSinceReferenceDate: state.timeValues[item.timeIndex])
-                        .addingTimeInterval(TimeInterval(tzOffset))
+                    let startDate = Calendar.current
+                        .startOfDay(for: now)
+                        .addingTimeInterval(state.timeValues[item.timeIndex])
+
                     let endDate = state.items
                     let endDate = state.items
                         .count > index + 1 ?
                         .count > index + 1 ?
-                        Date(timeIntervalSinceReferenceDate: state.timeValues[state.items[index + 1].timeIndex])
-                        .addingTimeInterval(TimeInterval(tzOffset)) :
-                        Date(timeIntervalSinceReferenceDate: state.timeValues.last!).addingTimeInterval(30 * 60)
-                        .addingTimeInterval(TimeInterval(tzOffset))
+                        Calendar.current.startOfDay(for: now)
+                        .addingTimeInterval(state.timeValues[state.items[index + 1].timeIndex])
+                        :
+                        Calendar.current.startOfDay(for: now)
+                        .addingTimeInterval(state.timeValues.last! + 30 * 60)
 
 
                     LineMark(x: .value("End Date", startDate), y: .value("Target", displayValueFloat ?? 0.0))
                     LineMark(x: .value("End Date", startDate), y: .value("Target", displayValueFloat ?? 0.0))
                         .lineStyle(.init(lineWidth: 1)).foregroundStyle(Color.green.gradient)
                         .lineStyle(.init(lineWidth: 1)).foregroundStyle(Color.green.gradient)
@@ -206,7 +206,8 @@ extension TargetsEditor {
                 }
                 }
             }
             }
             .chartXScale(
             .chartXScale(
-                domain: Calendar.current.startOfDay(for: chartScale!) ... Calendar.current.startOfDay(for: chartScale!)
+                domain: Calendar.current.startOfDay(for: now) ... Calendar
+                    .current.startOfDay(for: now)
                     .addingTimeInterval(60 * 60 * 24)
                     .addingTimeInterval(60 * 60 * 24)
             )
             )
             .chartYAxis {
             .chartYAxis {