Mercurial > public > stock-charts
annotate Sources/StockCharts/LineChart/Helpers/LineView.swift @ 116:5057c45046c1
Add default initializers
author | Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com> |
---|---|
date | Mon, 09 Aug 2021 16:32:45 +0100 |
parents | f53d8b9ca92b |
children |
rev | line source |
---|---|
5
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
1 // |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
2 // LineView.swift |
21
5135ff3343ae
Rename project to StockCharts
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
20
diff
changeset
|
3 // StockCharts |
5
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
4 // |
21
5135ff3343ae
Rename project to StockCharts
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
20
diff
changeset
|
5 // Created by Dennis Concepción Martín on 30/4/21. |
5
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
6 // |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
7 |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
8 import SwiftUI |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
9 |
18
136de51a74f2
Change struct to public
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
14
diff
changeset
|
10 public struct LineView: View { |
116
5057c45046c1
Add default initializers
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
108
diff
changeset
|
11 public var lineChartController: LineChartController |
8
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
12 |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
13 @Binding var showingIndicators: Bool |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
14 @Binding var indexPosition: Int |
20
24dfde3727c1
Make variables and structures public
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
18
diff
changeset
|
15 @State var IndicatorPointPosition: CGPoint = .zero |
24dfde3727c1
Make variables and structures public
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
18
diff
changeset
|
16 @State var pathPoints = [CGPoint]() |
5
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
17 |
18
136de51a74f2
Change struct to public
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
14
diff
changeset
|
18 public var body: some View { |
21
5135ff3343ae
Rename project to StockCharts
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
20
diff
changeset
|
19 ZStack { |
8
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
20 GeometryReader { proxy in |
116
5057c45046c1
Add default initializers
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
108
diff
changeset
|
21 LinePath(data: lineChartController.prices, width: proxy.size.width, height: proxy.size.height, pathPoints: $pathPoints) |
8
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
22 .stroke(colorLine(), lineWidth: 2) |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
23 } |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
24 |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
25 if showingIndicators { |
116
5057c45046c1
Add default initializers
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
108
diff
changeset
|
26 IndicatorPoint(lineChartController: lineChartController) |
8
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
27 .position(x: IndicatorPointPosition.x, y: IndicatorPointPosition.y) |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
28 } |
5
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
29 } |
8
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
30 .rotationEffect(.degrees(180), anchor: .center) |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
31 .rotation3DEffect(.degrees(180), axis: (x: 0.0, y: 1.0, z: 0.0)) |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
32 .contentShape(Rectangle()) // Control tappable area |
116
5057c45046c1
Add default initializers
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
108
diff
changeset
|
33 .gesture(lineChartController.dragGesture ? |
8
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
34 LongPressGesture(minimumDuration: 0.2) |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
35 .sequenced(before: DragGesture(minimumDistance: 0, coordinateSpace: .local)) |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
36 .onChanged({ value in // Get value of the gesture |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
37 switch value { |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
38 case .second(true, let drag): |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
39 if let longPressLocation = drag?.location { |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
40 dragGesture(longPressLocation) |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
41 } |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
42 default: |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
43 break |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
44 } |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
45 }) |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
46 // Hide indicator when finish |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
47 .onEnded({ value in |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
48 self.showingIndicators = false |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
49 }) |
60
e16e6bdaa31d
Add dragGesture argument
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
24
diff
changeset
|
50 : nil // On dragGesture = false |
8
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
51 ) |
5
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
52 } |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
53 |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
54 /* |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
55 Color path depending on data. |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
56 */ |
20
24dfde3727c1
Make variables and structures public
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
18
diff
changeset
|
57 public func colorLine() -> Color { |
116
5057c45046c1
Add default initializers
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
108
diff
changeset
|
58 var color = lineChartController.uptrendLineColor |
5
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
59 |
94
e0c0306fb079
Fix bug color LineChartView on dragGesture
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
60
diff
changeset
|
60 if showingIndicators { |
116
5057c45046c1
Add default initializers
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
108
diff
changeset
|
61 color = lineChartController.showingIndicatorLineColor |
5057c45046c1
Add default initializers
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
108
diff
changeset
|
62 } else if lineChartController.prices.first! > lineChartController.prices.last! { |
5057c45046c1
Add default initializers
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
108
diff
changeset
|
63 color = lineChartController.downtrendLineColor |
5057c45046c1
Add default initializers
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
108
diff
changeset
|
64 } else if lineChartController.prices.first! == lineChartController.prices.last! { |
5057c45046c1
Add default initializers
Dennis Concepcion Martin <dennisconcepcionmartin@gmail.com>
parents:
108
diff
changeset
|
65 color = lineChartController.flatTrendLineColor |
5
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
66 } |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
67 |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
68 return color |
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
69 } |
8
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
70 |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
71 /* |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
72 When the user drag on Path -> Modifiy indicator point to move it on the path accordingly |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
73 */ |
20
24dfde3727c1
Make variables and structures public
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
18
diff
changeset
|
74 public func dragGesture(_ longPressLocation: CGPoint) { |
8
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
75 let (closestXPoint, closestYPoint, yPointIndex) = getClosestValueFrom(longPressLocation, inData: pathPoints) |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
76 self.IndicatorPointPosition.x = closestXPoint |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
77 self.IndicatorPointPosition.y = closestYPoint |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
78 self.showingIndicators = true |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
79 self.indexPosition = yPointIndex |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
80 } |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
81 |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
82 /* |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
83 First, search the closest X point in Path from the tapped location. |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
84 Then, find the correspondent Y point in Path. |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
85 */ |
20
24dfde3727c1
Make variables and structures public
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
18
diff
changeset
|
86 public func getClosestValueFrom(_ value: CGPoint, inData: [CGPoint]) -> (CGFloat, CGFloat, Int) { |
8
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
87 let touchPoint: (CGFloat, CGFloat) = (value.x, value.y) |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
88 let xPathPoints = inData.map { $0.x } |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
89 let yPathPoints = inData.map { $0.y } |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
90 |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
91 // Closest X value |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
92 let closestXPoint = xPathPoints.enumerated().min( by: { abs($0.1 - touchPoint.0) < abs($1.1 - touchPoint.0) } )! |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
93 let closestYPointIndex = xPathPoints.firstIndex(of: closestXPoint.element)! |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
94 let closestYPoint = yPathPoints[closestYPointIndex] |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
95 |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
96 // Index of the closest points in the array |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
97 let yPointIndex = yPathPoints.firstIndex(of: closestYPoint)! |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
98 |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
99 return (closestXPoint.element, closestYPoint, yPointIndex) |
959175ee5ebd
Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
5
diff
changeset
|
100 } |
5
f828c7c408d4
Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff
changeset
|
101 } |