MacMonitor CI/CD Pipeline / Build & Test (Intel x86_64) (push) Successful in 1m49s
90 lines
2.9 KiB
Swift
90 lines
2.9 KiB
Swift
import SwiftUI
|
|
import Charts
|
|
|
|
public struct TelemetryTrendChartView: View {
|
|
public let title: String
|
|
public let unit: String
|
|
public let color: Color
|
|
public let samples: [HistoricalSample<Double>]
|
|
public let maxY: Double?
|
|
|
|
public init(
|
|
title: String,
|
|
unit: String,
|
|
color: Color,
|
|
samples: [HistoricalSample<Double>],
|
|
maxY: Double? = nil
|
|
) {
|
|
self.title = title
|
|
self.unit = unit
|
|
self.color = color
|
|
self.samples = samples
|
|
self.maxY = maxY
|
|
}
|
|
|
|
private var currentValue: Double {
|
|
samples.last?.value ?? 0.0
|
|
}
|
|
|
|
private var averageValue: Double {
|
|
guard !samples.isEmpty else { return 0.0 }
|
|
return samples.reduce(0.0) { $0 + $1.value } / Double(samples.count)
|
|
}
|
|
|
|
private var maxValue: Double {
|
|
samples.map(\.value).max() ?? 0.0
|
|
}
|
|
|
|
public var body: some View {
|
|
VStack(alignment: .leading, spacing: 10) {
|
|
HStack {
|
|
Text(title)
|
|
.font(.headline)
|
|
Spacer()
|
|
HStack(spacing: 12) {
|
|
Text(String(format: "Cur: %.1f %@", currentValue, unit))
|
|
.font(.caption)
|
|
.fontWeight(.semibold)
|
|
.foregroundColor(color)
|
|
Text(String(format: "Avg: %.1f %@", averageValue, unit))
|
|
.font(.caption)
|
|
.foregroundColor(.secondary)
|
|
Text(String(format: "Max: %.1f %@", maxValue, unit))
|
|
.font(.caption)
|
|
.foregroundColor(.secondary)
|
|
}
|
|
}
|
|
|
|
Chart {
|
|
ForEach(Array(samples.enumerated()), id: \.element.id) { index, sample in
|
|
LineMark(
|
|
x: .value("Sample", index),
|
|
y: .value("Value", sample.value)
|
|
)
|
|
.interpolationMethod(.monotone)
|
|
.foregroundStyle(color)
|
|
|
|
AreaMark(
|
|
x: .value("Sample", index),
|
|
y: .value("Value", sample.value)
|
|
)
|
|
.interpolationMethod(.monotone)
|
|
.foregroundStyle(
|
|
LinearGradient(
|
|
colors: [color.opacity(0.35), color.opacity(0.05)],
|
|
startPoint: .top,
|
|
endPoint: .bottom
|
|
)
|
|
)
|
|
}
|
|
}
|
|
.chartYScale(domain: 0...(maxY ?? max(1.0, maxValue * 1.15)))
|
|
.chartXAxis(.hidden)
|
|
.frame(height: 120)
|
|
}
|
|
.padding(14)
|
|
.background(Color(NSColor.controlBackgroundColor))
|
|
.cornerRadius(10)
|
|
}
|
|
}
|