85 lines
2.8 KiB
Swift
85 lines
2.8 KiB
Swift
import SwiftUI
|
|
import Charts
|
|
|
|
struct TemperatureDayOverview: View {
|
|
|
|
let points: [TemperatureMeasurement]
|
|
|
|
init(points: [TemperatureMeasurement]) {
|
|
self.points = points
|
|
}
|
|
|
|
init(storage: PersistentStorage, dateIndex: Int) {
|
|
let points = storage.loadMeasurements(for: dateIndex)
|
|
self.points = points
|
|
update()
|
|
}
|
|
|
|
mutating func update() {
|
|
self.upperTempLimit = max(40, points.maximumValue() ?? 40)
|
|
self.lowerTempLimit = min(-20, points.minimumValue() ?? -20)
|
|
let startDay = points.first?.date.dateIndex ?? Date().dateIndex
|
|
self.pastDateLimit = Date(dateIndex: startDay)
|
|
let endDay = (points.last?.date.dateIndex ?? Date().dateIndex) + 1
|
|
self.futureDateLimit = Date(dateIndex: endDay)
|
|
}
|
|
|
|
var upperTempLimit: Double = 40.0
|
|
var lowerTempLimit: Double = -20
|
|
|
|
var pastDateLimit: Date = Date().startOfDay
|
|
var futureDateLimit: Date = Date().startOfNextDay
|
|
|
|
var body: some View {
|
|
Chart {
|
|
ForEach(points) { point in
|
|
if let s = point.sensor0.optionalValue {
|
|
LineMark(
|
|
x: .value("Date", point.date),
|
|
y: .value("Temperature", s))
|
|
.foregroundStyle(by: .value("Type", "Sensor 0"))
|
|
}
|
|
if let s = point.sensor1.optionalValue {
|
|
LineMark(
|
|
x: .value("Date", point.date),
|
|
y: .value("Temperature", s))
|
|
.foregroundStyle(by: .value("Type", "Sensor 1"))
|
|
}
|
|
}
|
|
}
|
|
.aspectRatio(2.6, contentMode: .fit)
|
|
//.chartXScale(domain: pastDateLimit...futureDateLimit)
|
|
.chartYScale(domain: lowerTempLimit...upperTempLimit)
|
|
.chartXAxis {
|
|
AxisMarks(preset: .automatic)
|
|
AxisMarks.init(values: AxisMarkValues.stride(by: .hour)) {
|
|
AxisGridLine()
|
|
}
|
|
}
|
|
.chartYAxis {
|
|
AxisMarks(position: .trailing, values: .automatic) { value in
|
|
AxisValueLabel(multiLabelAlignment: .trailing) {
|
|
if let intValue = value.as(Int.self) {
|
|
Text("\(intValue)°")
|
|
.font(.system(size: 10))
|
|
//.foregroundColor(.white)
|
|
}
|
|
}
|
|
}
|
|
|
|
AxisMarks.init(values: AxisMarkValues.stride(by: 5)) {
|
|
AxisGridLine()
|
|
}
|
|
}
|
|
.padding()
|
|
}
|
|
}
|
|
|
|
struct TemperatureDayOverview_Previews: PreviewProvider {
|
|
static var previews: some View {
|
|
TemperatureDayOverview(storage: PersistentStorage.mock, dateIndex: Date().dateIndex)
|
|
.previewLayout(.fixed(width: 350, height: 150))
|
|
//.background(.gray)
|
|
}
|
|
}
|