Skip to content

Commit 7bca99e

Browse files
authored
Merge pull request #192 from willdale/191-barchart-didnt-show-correctly-when-replacing-point-in-bardataset
191: Fix redrawing of bar chart when data changes
2 parents 5755f03 + 73570f3 commit 7bca99e

File tree

3 files changed

+26
-17
lines changed

3 files changed

+26
-17
lines changed

Sources/SwiftUICharts/BarChart/Views/StackedBarChart.swift

+1
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ public struct StackedBarChart<ChartData>: View where ChartData: StackedBarChartD
6565
.clipShape(RoundedRectangleBarShape(chartData.barStyle.cornerRadius))
6666
.scaleEffect(y: startAnimation ? divideByZeroProtection(CGFloat.self, dataSet.maxValue(), chartData.maxValue) : 0, anchor: .bottom)
6767
.scaleEffect(x: chartData.barStyle.barWidth, anchor: .center)
68+
.animation(.default, value: chartData.dataSets)
6869
.background(Color(.gray).opacity(0.000000001))
6970
.animateOnAppear(using: chartData.chartStyle.globalAnimation) {
7071
self.startAnimation = true

Sources/SwiftUICharts/BarChart/Views/SubViews/BarChartSubViews.swift

+6-6
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import SwiftUI
1717
*/
1818
internal struct BarChartBarStyleSubView<CD: BarChartData>: View {
1919

20-
private let chartData: CD
20+
@ObservedObject private var chartData: CD
2121

2222
internal init(chartData: CD) {
2323
self.chartData = chartData
@@ -67,7 +67,7 @@ internal struct BarChartBarStyleSubView<CD: BarChartData>: View {
6767
*/
6868
internal struct BarChartDataPointSubView<CD: BarChartData>: View {
6969

70-
private let chartData: CD
70+
@ObservedObject private var chartData: CD
7171

7272
internal init(chartData: CD) {
7373
self.chartData = chartData
@@ -119,7 +119,7 @@ internal struct BarChartDataPointSubView<CD: BarChartData>: View {
119119

120120
internal struct RangedBarChartBarStyleSubView<CD:RangedBarChartData>: View {
121121

122-
private let chartData: CD
122+
@ObservedObject private var chartData: CD
123123

124124
internal init(chartData: CD) {
125125
self.chartData = chartData
@@ -175,7 +175,7 @@ internal struct RangedBarChartBarStyleSubView<CD:RangedBarChartData>: View {
175175
// MARK: DataPoints
176176
internal struct RangedBarChartDataPointSubView<CD:RangedBarChartData>: View {
177177

178-
private let chartData: CD
178+
@ObservedObject private var chartData: CD
179179

180180
internal init(chartData: CD) {
181181
self.chartData = chartData
@@ -234,7 +234,7 @@ internal struct RangedBarChartDataPointSubView<CD:RangedBarChartData>: View {
234234
*/
235235
internal struct HorizontalBarChartBarStyleSubView<CD: HorizontalBarChartData>: View {
236236

237-
private let chartData: CD
237+
@ObservedObject private var chartData: CD
238238

239239
internal init(chartData: CD) {
240240
self.chartData = chartData
@@ -284,7 +284,7 @@ internal struct HorizontalBarChartBarStyleSubView<CD: HorizontalBarChartData>: V
284284
*/
285285
internal struct HorizontalBarChartDataPointSubView<CD: HorizontalBarChartData>: View {
286286

287-
private let chartData: CD
287+
@ObservedObject private var chartData: CD
288288

289289
internal init(chartData: CD) {
290290
self.chartData = chartData

Sources/SwiftUICharts/BarChart/Views/SubViews/Bars.swift

+19-11
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import SwiftUI
2020
internal struct ColourBar<CD: CTBarChartDataProtocol & GetDataProtocol,
2121
DP: CTStandardDataPointProtocol & CTBarDataPointBaseProtocol>: View {
2222

23-
private let chartData: CD
23+
@ObservedObject private var chartData: CD
2424
private let colour: Color
2525
private let dataPoint: DP
2626

@@ -42,6 +42,7 @@ internal struct ColourBar<CD: CTBarChartDataProtocol & GetDataProtocol,
4242
.scaleEffect(y: startAnimation ? divideByZeroProtection(CGFloat.self, dataPoint.value, chartData.maxValue) : 0, anchor: .bottom)
4343
.scaleEffect(x: chartData.barStyle.barWidth, anchor: .center)
4444
.background(Color(.gray).opacity(0.000000001))
45+
.animation(.default, value: chartData.dataSets)
4546
.animateOnAppear(using: chartData.chartStyle.globalAnimation) {
4647
self.startAnimation = true
4748
}
@@ -62,7 +63,7 @@ internal struct ColourBar<CD: CTBarChartDataProtocol & GetDataProtocol,
6263
internal struct GradientColoursBar<CD: CTBarChartDataProtocol & GetDataProtocol,
6364
DP: CTStandardDataPointProtocol & CTBarDataPointBaseProtocol>: View {
6465

65-
private let chartData: CD
66+
@ObservedObject private var chartData: CD
6667
private let dataPoint: DP
6768
private let colours: [Color]
6869
private let startPoint: UnitPoint
@@ -91,6 +92,7 @@ internal struct GradientColoursBar<CD: CTBarChartDataProtocol & GetDataProtocol,
9192
endPoint: endPoint))
9293
.scaleEffect(y: startAnimation ? divideByZeroProtection(CGFloat.self, dataPoint.value, chartData.maxValue) : 0, anchor: .bottom)
9394
.scaleEffect(x: chartData.barStyle.barWidth, anchor: .center)
95+
.animation(.default, value: chartData.dataSets)
9496
.background(Color(.gray).opacity(0.000000001))
9597
.animateOnAppear(using: chartData.chartStyle.globalAnimation) {
9698
self.startAnimation = true
@@ -113,7 +115,7 @@ internal struct GradientColoursBar<CD: CTBarChartDataProtocol & GetDataProtocol,
113115
internal struct GradientStopsBar<CD: CTBarChartDataProtocol & GetDataProtocol,
114116
DP: CTStandardDataPointProtocol & CTBarDataPointBaseProtocol>: View {
115117

116-
private let chartData: CD
118+
@ObservedObject private var chartData: CD
117119
private let dataPoint: DP
118120
private let stops: [Gradient.Stop]
119121
private let startPoint: UnitPoint
@@ -142,6 +144,7 @@ internal struct GradientStopsBar<CD: CTBarChartDataProtocol & GetDataProtocol,
142144
endPoint: endPoint))
143145
.scaleEffect(y: startAnimation ? divideByZeroProtection(CGFloat.self, dataPoint.value, chartData.maxValue) : 0, anchor: .bottom)
144146
.scaleEffect(x: chartData.barStyle.barWidth, anchor: .center)
147+
.animation(.default, value: chartData.dataSets)
145148
.background(Color(.gray).opacity(0.000000001))
146149
.animateOnAppear(using: chartData.chartStyle.globalAnimation) {
147150
self.startAnimation = true
@@ -160,7 +163,7 @@ internal struct GradientStopsBar<CD: CTBarChartDataProtocol & GetDataProtocol,
160163
*/
161164
internal struct StackElementSubView: View {
162165

163-
private let dataSet: StackedBarDataSet
166+
private var dataSet: StackedBarDataSet
164167
private let specifier: String
165168
private let formatter: NumberFormatter?
166169

@@ -176,7 +179,6 @@ internal struct StackElementSubView: View {
176179

177180
internal var body: some View {
178181
GeometryReader { geo in
179-
180182
VStack(spacing: 0) {
181183
ForEach(dataSet.dataPoints.reversed()) { dataPoint in
182184
if dataPoint.group.colour.colourType == .colour,
@@ -334,7 +336,7 @@ internal struct GradientStopsPartBar: View {
334336
// MARK: Colour
335337
internal struct RangedBarChartColourCell<CD:RangedBarChartData>: View {
336338

337-
private let chartData: CD
339+
@ObservedObject private var chartData: CD
338340
private let dataPoint: CD.SetType.DataPoint
339341
private let colour: Color
340342
private let barSize: CGRect
@@ -360,6 +362,7 @@ internal struct RangedBarChartColourCell<CD:RangedBarChartData>: View {
360362
.scaleEffect(x: chartData.barStyle.barWidth, anchor: .center)
361363
.position(x: barSize.midX,
362364
y: chartData.getBarPositionX(dataPoint: dataPoint, height: barSize.height))
365+
.animation(.default, value: chartData.dataSets)
363366
.background(Color(.gray).opacity(0.000000001))
364367
.animateOnAppear(using: chartData.chartStyle.globalAnimation) {
365368
self.startAnimation = true
@@ -375,7 +378,7 @@ internal struct RangedBarChartColourCell<CD:RangedBarChartData>: View {
375378
// MARK: Gradient
376379
internal struct RangedBarChartColoursCell<CD:RangedBarChartData>: View {
377380

378-
private let chartData: CD
381+
@ObservedObject private var chartData: CD
379382
private let dataPoint: CD.SetType.DataPoint
380383
private let colours: [Color]
381384
private let startPoint: UnitPoint
@@ -409,6 +412,7 @@ internal struct RangedBarChartColoursCell<CD:RangedBarChartData>: View {
409412
.scaleEffect(x: chartData.barStyle.barWidth, anchor: .center)
410413
.position(x: barSize.midX,
411414
y: chartData.getBarPositionX(dataPoint: dataPoint, height: barSize.height))
415+
.animation(.default, value: chartData.dataSets)
412416
.background(Color(.gray).opacity(0.000000001))
413417
.animateOnAppear(using: chartData.chartStyle.globalAnimation) {
414418
self.startAnimation = true
@@ -424,7 +428,7 @@ internal struct RangedBarChartColoursCell<CD:RangedBarChartData>: View {
424428
// MARK: Gradient Stops
425429
internal struct RangedBarChartStopsCell<CD:RangedBarChartData>: View {
426430

427-
private let chartData: CD
431+
@ObservedObject private var chartData: CD
428432
private let dataPoint: CD.SetType.DataPoint
429433
private let stops: [Gradient.Stop]
430434
private let startPoint: UnitPoint
@@ -458,6 +462,7 @@ internal struct RangedBarChartStopsCell<CD:RangedBarChartData>: View {
458462
.scaleEffect(x: chartData.barStyle.barWidth, anchor: .center)
459463
.position(x: barSize.midX,
460464
y: chartData.getBarPositionX(dataPoint: dataPoint, height: barSize.height))
465+
.animation(.default, value: chartData.dataSets)
461466
.background(Color(.gray).opacity(0.000000001))
462467
.animateOnAppear(using: chartData.chartStyle.globalAnimation) {
463468
self.startAnimation = true
@@ -483,7 +488,7 @@ internal struct RangedBarChartStopsCell<CD:RangedBarChartData>: View {
483488
internal struct HorizontalColourBar<CD: CTBarChartDataProtocol & GetDataProtocol,
484489
DP: CTStandardDataPointProtocol & CTBarDataPointBaseProtocol>: View {
485490

486-
private let chartData: CD
491+
@ObservedObject private var chartData: CD
487492
private let colour: Color
488493
private let dataPoint: DP
489494

@@ -504,6 +509,7 @@ internal struct HorizontalColourBar<CD: CTBarChartDataProtocol & GetDataProtocol
504509
.fill(colour)
505510
.scaleEffect(x: startAnimation ? divideByZeroProtection(CGFloat.self, dataPoint.value, chartData.maxValue) : 0, anchor: .leading)
506511
.scaleEffect(y: chartData.barStyle.barWidth, anchor: .center)
512+
.animation(.default, value: chartData.dataSets)
507513
.background(Color(.gray).opacity(0.000000001))
508514
.animateOnAppear(using: chartData.chartStyle.globalAnimation) {
509515
self.startAnimation = true
@@ -526,7 +532,7 @@ internal struct HorizontalColourBar<CD: CTBarChartDataProtocol & GetDataProtocol
526532
internal struct HorizontalGradientColoursBar<CD: CTBarChartDataProtocol & GetDataProtocol,
527533
DP: CTStandardDataPointProtocol & CTBarDataPointBaseProtocol>: View {
528534

529-
private let chartData: CD
535+
@ObservedObject private var chartData: CD
530536
private let dataPoint: DP
531537
private let colours: [Color]
532538
private let startPoint: UnitPoint
@@ -555,6 +561,7 @@ internal struct HorizontalGradientColoursBar<CD: CTBarChartDataProtocol & GetDat
555561
endPoint: endPoint))
556562
.scaleEffect(x: startAnimation ? divideByZeroProtection(CGFloat.self, dataPoint.value, chartData.maxValue) : 0, anchor: .leading)
557563
.scaleEffect(y: chartData.barStyle.barWidth, anchor: .center)
564+
.animation(.default, value: chartData.dataSets)
558565
.background(Color(.gray).opacity(0.000000001))
559566
.animateOnAppear(using: chartData.chartStyle.globalAnimation) {
560567
self.startAnimation = true
@@ -577,7 +584,7 @@ internal struct HorizontalGradientColoursBar<CD: CTBarChartDataProtocol & GetDat
577584
internal struct HorizontalGradientStopsBar<CD: CTBarChartDataProtocol & GetDataProtocol,
578585
DP: CTStandardDataPointProtocol & CTBarDataPointBaseProtocol>: View {
579586

580-
private let chartData: CD
587+
@ObservedObject private var chartData: CD
581588
private let dataPoint: DP
582589
private let stops: [Gradient.Stop]
583590
private let startPoint: UnitPoint
@@ -606,6 +613,7 @@ internal struct HorizontalGradientStopsBar<CD: CTBarChartDataProtocol & GetDataP
606613
endPoint: endPoint))
607614
.scaleEffect(x: startAnimation ? divideByZeroProtection(CGFloat.self, dataPoint.value, chartData.maxValue) : 0, anchor: .leading)
608615
.scaleEffect(y: chartData.barStyle.barWidth, anchor: .center)
616+
.animation(.default, value: chartData.dataSets)
609617
.background(Color(.gray).opacity(0.000000001))
610618
.animateOnAppear(using: chartData.chartStyle.globalAnimation) {
611619
self.startAnimation = true

0 commit comments

Comments
 (0)