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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }