Meshtastic-Apple/Meshtastic/Views/Nodes/Helpers/Map/PositionAltitudeChart.swift
Blake McAnally 4d547e48db This change fixes several lint errors throughout the project, and moves the SwiftLint build phase to before compilation.
After this change, a developer can now clone the project and run without the build failing due to lint errors! 😃

* I ran `swiftlint --fix` to resolve many auto-correctable issues (mostly whitespace)
* Excluded the `Meshtastic/Protobufs` directory from lint, since that code is automatically generated.
* Converted some single letter method parameters to lowercase.
* Converted several instances `force_cast` to instead use `guard` or `if let` to unwrap optional values. During this change, some of the SwiftUI views became "too complex to be solved in a reasonable time", so I broke up the views into distinct sub-expressions.

I was able to build and run the app on an iOS simulator.
2024-05-31 21:48:50 -05:00

77 lines
2 KiB
Swift

//
// PositionAltitudeChart.swift
// Meshtastic
//
// Copyright(c) Garth Vander Houwen 11/17/23.
//
import SwiftUI
import Charts
#if canImport(MapKit)
import MapKit
#endif
struct PositionAltitude {
let time: Date
var altitude: Measurement<UnitLength>
}
@available(iOS 17.0, macOS 14.0, *)
struct PositionAltitudeChart: View {
@Environment(\.dismiss) private var dismiss
@ObservedObject var node: NodeInfoEntity
@State private var lineWidth = 2.0
var data: [PositionAltitude] {
let fiveYearsAgo = Calendar.current.date(byAdding: .year, value: -5, to: Date())
guard let nodePositions = node.positions,
let positions = Array(nodePositions) as? [PositionEntity]
else {
return []
}
let filteredPositions = positions.filter({$0.time != nil && ($0.time ?? fiveYearsAgo!) > fiveYearsAgo!})
return filteredPositions.map {
PositionAltitude(
time: $0.time ?? Date(),
altitude: Measurement(value: Double($0.altitude), unit: .meters)
)
}
}
var body: some View {
GroupBox(label: Label("Altitude", systemImage: "mountain.2")) {
Chart(data, id: \.time) {
LineMark(
x: .value("Time", $0.time),
y: .value("Altitude", PlottableMeasurement(measurement: $0.altitude))
)
.accessibilityLabel($0.time.formatted(date: .abbreviated, time: .shortened))
.accessibilityValue("\($0.altitude)")
.lineStyle(StrokeStyle(lineWidth: lineWidth))
.interpolationMethod(.linear)
.symbol(Circle().strokeBorder(lineWidth: lineWidth))
.symbolSize(60)
}
.chartYAxis {
AxisMarks { value in
AxisGridLine()
AxisValueLabel("""
\(value.as(PlottableMeasurement.self)!
.measurement
.converted(to: .meters),
format: .measurement(
width: .wide,
numberFormatStyle: .number.precision(
.fractionLength(0))
)
)
""")
}
}
.chartXAxis(.visible)
}
.background(Color(UIColor.secondarySystemBackground))
.opacity(/*@START_MENU_TOKEN@*/0.8/*@END_MENU_TOKEN@*/)
}
}