Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions LoopFollow/Charts/BGChartModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ final class BGChartModel: ObservableObject {
@Published var now: Date = .init()
@Published var diaMarkers: [Date] = []
@Published var midnightMarkers: [Date] = []
@Published var priorDayTimeMarkers: [Date] = []
@Published var thirtyMinMark: Date? = nil
@Published var ninetyMinMark: Date? = nil

Expand All @@ -179,6 +180,7 @@ final class BGChartModel: ObservableObject {
@Published var show90Min: Bool = false
@Published var showMidnight: Bool = false
@Published var smallGraphTreatments: Bool = true
@Published var showPriorDayTime: Bool = false

private static let doseFormatter: NumberFormatter = {
let nf = NumberFormatter()
Expand Down Expand Up @@ -411,6 +413,7 @@ final class BGChartModel: ObservableObject {
show90Min = Storage.shared.show90MinLine.value
showMidnight = Storage.shared.showMidnightLines.value
smallGraphTreatments = Storage.shared.smallGraphTreatments.value
showPriorDayTime = Storage.shared.showPriorDayTimeLines.value

// Advanced-settings visibility toggles. The Nightscout controllers
// collect the data regardless (it also feeds the info rows), so hidden
Expand Down Expand Up @@ -596,6 +599,17 @@ final class BGChartModel: ObservableObject {
}
return cal
}()

// Mark the current local time on each prior day. Calendar arithmetic
// preserves the displayed time of day across daylight-saving changes.
var priorDayTimes: [Date] = []
var priorDayTime = calendar.date(byAdding: .day, value: -1, to: currentNow)
while let marker = priorDayTime, marker > domainStart {
priorDayTimes.append(marker)
priorDayTime = calendar.date(byAdding: .day, value: -1, to: marker)
}
priorDayTimeMarkers = priorDayTimes

var cursor = calendar.startOfDay(for: domainStart)
while cursor <= domainEnd {
if cursor >= domainStart {
Expand Down
12 changes: 12 additions & 0 deletions LoopFollow/Charts/BGChartView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1095,6 +1095,9 @@ private struct BGChartCanvas: View, Equatable {
if showTreatments {
treatmentMarks
}
if model.showPriorDayTime {
priorDayTimeRuleMarks
}
if !isSmall {
ruleMarks
} else if model.showMidnight {
Expand Down Expand Up @@ -1462,6 +1465,15 @@ private struct BGChartCanvas: View, Equatable {
}
}

@ChartContentBuilder
private var priorDayTimeRuleMarks: some ChartContent {
ForEach(model.priorDayTimeMarkers.filter { $0 >= windowStart && $0 <= windowEnd }, id: \.self) { d in
RuleMark(x: .value("same time on prior day", d))
.lineStyle(StrokeStyle(lineWidth: 1, dash: isSmall ? [2, 2] : [2, 5]))
.foregroundStyle(Color.orange.opacity(isSmall ? 1 : 0.5))
}
}

@ChartContentBuilder
private var ruleMarks: some ChartContent {
RuleMark(y: .value("low", model.lowLine))
Expand Down
4 changes: 4 additions & 0 deletions LoopFollow/Settings/GraphSettingsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ struct GraphSettingsView: View {
@ObservedObject private var show30MinLine = Storage.shared.show30MinLine
@ObservedObject private var show90MinLine = Storage.shared.show90MinLine
@ObservedObject private var showMidnightLines = Storage.shared.showMidnightLines
@ObservedObject private var showPriorDayTimeLines = Storage.shared.showPriorDayTimeLines
@ObservedObject private var showYesterdayLine = Storage.shared.showYesterdayLine
@ObservedObject private var smallGraphTreatments = Storage.shared.smallGraphTreatments

Expand Down Expand Up @@ -50,6 +51,9 @@ struct GraphSettingsView: View {

Toggle("Show Midnight Lines", isOn: $showMidnightLines.value)
.onChange(of: showMidnightLines.value) { _ in markDirty() }

Toggle("Show Prior Day Time Lines", isOn: $showPriorDayTimeLines.value)
.onChange(of: showPriorDayTimeLines.value) { _ in markDirty() }
}

// ── Treatments ───────────────────────────────────────────────
Expand Down
1 change: 1 addition & 0 deletions LoopFollow/Settings/SettingsMenuView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,7 @@ enum SettingsRoute: Hashable, Identifiable {
SettingsLeaf("Show −90 min Line", ["-90"]),
SettingsLeaf("Show Yesterday's BG", ["yesterday"]),
SettingsLeaf("Show Midnight Lines"),
SettingsLeaf("Show Prior Day Time Lines", ["prior day", "same time", "yesterday"]),
SettingsLeaf("Show Carb/Bolus Values", ["carbs"]),
SettingsLeaf("Show Carb Absorption"),
SettingsLeaf("Treatments on Small Graph"),
Expand Down
1 change: 1 addition & 0 deletions LoopFollow/Storage/Storage.swift
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ class Storage {
var show30MinLine = StorageValue<Bool>(key: "show30MinLine", defaultValue: false)
var show90MinLine = StorageValue<Bool>(key: "show90MinLine", defaultValue: false)
var showMidnightLines = StorageValue<Bool>(key: "showMidnightMarkers", defaultValue: false)
var showPriorDayTimeLines = StorageValue<Bool>(key: "showPriorDayTimeMarkers", defaultValue: false)
var showYesterdayLine = StorageValue<Bool>(key: "showYesterdayLine", defaultValue: false)
var smallGraphTreatments = StorageValue<Bool>(key: "smallGraphTreatments", defaultValue: true)

Expand Down
Loading