Files
Andras Samu ebaaf81d19 feat: new protocol for chained functions, and added support for expli… (#252)
* feat: new protocol for chained functions, and added support for explicit Y ranges. X coming as well

* feat: add new axis interface (#253)
2022-10-24 16:07:51 +02:00

84 lines
3.2 KiB
Swift

import SwiftUI
struct LineShapeView: View, Animatable {
var chartData: ChartData
var chartProperties: LineChartProperties
var geometry: GeometryProxy
var style: ChartStyle
var trimTo: Double = 0
var animatableData: CGFloat {
get { CGFloat(trimTo) }
set { trimTo = Double(newValue) }
}
var chartMarkColor: LinearGradient {
if let customColor = chartProperties.customChartMarksColors {
return customColor.linearGradient(from: .leading, to: .trailing)
}
return LinearGradient(gradient: style.foregroundColor.first?.gradient ?? ColorGradient.orangeBright.gradient,
startPoint: .leading,
endPoint: .trailing)
}
var body: some View {
ZStack {
LineShape(data: chartData.normalisedData, lineStyle: chartProperties.lineStyle)
.trim(from: 0, to: CGFloat(trimTo))
.stroke(LinearGradient(gradient: style.foregroundColor.first?.gradient ?? ColorGradient.orangeBright.gradient,
startPoint: .leading,
endPoint: .trailing),
style: StrokeStyle(lineWidth: chartProperties.lineWidth, lineJoin: .round))
.toStandardCoordinateSystem()
.clipped()
if chartProperties.showChartMarks {
MarkerShape(data: chartData.normalisedData)
.trim(from: 0, to: CGFloat(trimTo))
.fill(.white,
strokeBorder: chartMarkColor,
lineWidth: chartProperties.lineWidth)
.toStandardCoordinateSystem()
}
}
}
}
struct LineShapeView_Previews: PreviewProvider {
static let chartData = ChartData([6, 8, 6], rangeY: 6...10)
static let chartDataOutOfRange = ChartData([-1, 8, 6, 12, 3], rangeY: -5...15)
static let chartDataOutOfRange2 = ChartData([6,6,8,5], rangeY: 5...10)
static let chartStyle = ChartStyle(backgroundColor: Color.white,
foregroundColor: [ColorGradient(Color.orange, Color.red)])
static var previews: some View {
Group {
GeometryReader { geometry in
LineShapeView(chartData: chartData,
chartProperties: LineChartProperties(),
geometry: geometry,
style: chartStyle,
trimTo: 1.0)
}
GeometryReader { geometry in
LineShapeView(chartData: chartDataOutOfRange,
chartProperties: LineChartProperties(),
geometry: geometry,
style: chartStyle,
trimTo: 1.0)
}
GeometryReader { geometry in
LineShapeView(chartData: chartDataOutOfRange2,
chartProperties: LineChartProperties(),
geometry: geometry,
style: chartStyle,
trimTo: 1.0)
}
}
}
}