annotate Sources/StockCharts/LineChart/Helpers/LineView.swift @ 101:ffc7731f7206

Change opacity
author Dennis Concepción Martín <dennisconcepcionmartin@gmail.com>
date Tue, 22 Jun 2021 16:39:09 +0200
parents e0c0306fb079
children 766a1169564b
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 {
24
127af64e264e Change var to public var
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 21
diff changeset
11 public var data: [Double]
127af64e264e Change var to public var
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 21
diff changeset
12 public var dates: [String]?
127af64e264e Change var to public var
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 21
diff changeset
13 public var hours: [String]?
60
e16e6bdaa31d Add dragGesture argument
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 24
diff changeset
14 public var dragGesture: Bool?
8
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
15
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
16 @Binding var showingIndicators: Bool
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
17 @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
18 @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
19 @State var pathPoints = [CGPoint]()
5
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
20
18
136de51a74f2 Change struct to public
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 14
diff changeset
21 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
22 ZStack {
8
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
23 GeometryReader { proxy in
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
24 LinePath(data: data, width: proxy.size.width, height: proxy.size.height, pathPoints: $pathPoints)
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
25 .stroke(colorLine(), lineWidth: 2)
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
26 }
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
27
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
28 if showingIndicators {
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
29 IndicatorPoint()
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
30 .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
31 }
5
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
32 }
8
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
33 .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
34 .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
35 .contentShape(Rectangle()) // Control tappable area
60
e16e6bdaa31d Add dragGesture argument
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 24
diff changeset
36 .gesture(dragGesture ?? true ?
8
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
37 LongPressGesture(minimumDuration: 0.2)
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
38 .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
39 .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
40 switch value {
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
41 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
42 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
43 dragGesture(longPressLocation)
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 default:
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
46 break
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
47 }
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
48 })
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
49 // Hide indicator when finish
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
50 .onEnded({ value in
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
51 self.showingIndicators = false
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
52 })
60
e16e6bdaa31d Add dragGesture argument
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 24
diff changeset
53 : 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
54 )
5
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
55 }
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
56
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
57 /*
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
58 Color path depending on data.
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
59 */
20
24dfde3727c1 Make variables and structures public
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 18
diff changeset
60 public func colorLine() -> Color {
5
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
61 var color = Color(.systemGreen)
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
62
94
e0c0306fb079 Fix bug color LineChartView on dragGesture
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 60
diff changeset
63 if showingIndicators {
e0c0306fb079 Fix bug color LineChartView on dragGesture
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 60
diff changeset
64 color = Color(.systemBlue)
e0c0306fb079 Fix bug color LineChartView on dragGesture
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 60
diff changeset
65 } else if data.first! > data.last! {
5
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
66 color = Color(.systemRed)
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
67 } else if data.first! == data.last! {
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
68 color = Color(.systemTeal)
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
69 }
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
70
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
71 return color
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
72 }
8
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
73
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
74 /*
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
75 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
76 */
20
24dfde3727c1 Make variables and structures public
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 18
diff changeset
77 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
78 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
79 self.IndicatorPointPosition.x = closestXPoint
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
80 self.IndicatorPointPosition.y = closestYPoint
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
81 self.showingIndicators = true
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
82 self.indexPosition = yPointIndex
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
83 }
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
84
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
85 /*
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
86 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
87 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
88 */
20
24dfde3727c1 Make variables and structures public
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 18
diff changeset
89 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
90 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
91 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
92 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
93
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
94 // Closest X value
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
95 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
96 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
97 let closestYPoint = yPathPoints[closestYPointIndex]
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 // 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
100 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
101
959175ee5ebd Implement interaction with ChartView
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents: 5
diff changeset
102 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
103 }
5
f828c7c408d4 Add source code
Dennis Concepción Martín <66180929+denniscm190@users.noreply.github.com>
parents:
diff changeset
104 }