Compare commits

...

4 Commits

Author SHA1 Message Date
Andras Samu 40f9210205 Refactor Chart base 2020-07-25 18:56:08 +02:00
Andras Samu 57ac969092 Added ChartLabel interaction 2020-06-28 20:25:21 +02:00
Andras Samu dff16e8d2d Creating a data structure which propagets changes in data to the charts (#114)
* Creating a data structure which propagets changes in data to the charts

* Fixed appearing animation
2020-06-21 18:53:48 +02:00
Andras Samu f0eea58bd8 Add CardView and CardLabel (#111) 2020-05-30 18:07:49 +02:00
28 changed files with 296 additions and 351 deletions
@@ -7,7 +7,7 @@
<key>SwiftUICharts.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>1</integer>
<integer>2</integer>
</dict>
</dict>
</dict>
@@ -0,0 +1,24 @@
import SwiftUI
public struct CardView<Content: View>: View, ChartBase {
public var chartData = ChartData()
let content: () -> Content
@EnvironmentObject var style: ChartStyle
public init(@ViewBuilder content: @escaping () -> Content) {
self.content = content
}
public var body: some View {
ZStack{
RoundedRectangle(cornerRadius: 20)
.fill(Color.white)
.shadow(color: Color.gray, radius: 8)
VStack {
self.content()
}
.clipShape(RoundedRectangle(cornerRadius: 20))
}
}
}
@@ -1,19 +0,0 @@
import SwiftUI
struct AnyChartType: ChartType {
private let chartMaker: (ChartType.Configuration, ChartType.Style) -> AnyView
init<S: ChartType>(_ type: S) {
self.chartMaker = type.makeTypeErasedBody
}
func makeChart(configuration: ChartType.Configuration, style: ChartType.Style) -> AnyView {
self.chartMaker(configuration, style)
}
}
fileprivate extension ChartType {
func makeTypeErasedBody(configuration: ChartType.Configuration, style: ChartType.Style) -> AnyView {
AnyView(makeChart(configuration: configuration, style: style))
}
}
@@ -0,0 +1,5 @@
import SwiftUI
public protocol ChartBase {
var chartData: ChartData { get }
}
@@ -0,0 +1,13 @@
import SwiftUI
public class ChartData: ObservableObject {
@Published public var data: [Double] = []
public init(_ data: [Double]) {
self.data = data
}
public init() {
self.data = []
}
}
@@ -1,11 +0,0 @@
import SwiftUI
@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *)
public protocol ChartType {
associatedtype Body: View
func makeChart(configuration: Self.Configuration, style: Self.Style) -> Self.Body
typealias Configuration = ChartTypeConfiguration
typealias Style = ChartStyle
}
@@ -1,5 +0,0 @@
import SwiftUI
public struct ChartTypeConfiguration {
public let data: [Double]
}
@@ -0,0 +1,6 @@
import SwiftUI
public class ChartValue: ObservableObject {
@Published var currentValue: Double = 0
@Published var interactionInProgress: Bool = false
}
@@ -1,22 +0,0 @@
// ChartView.swift
// Created by Samu András on 2020. 05. 22..
import SwiftUI
public struct ChartView: View {
@Environment(\.chartType) private var chartType
@Environment(\.chartStyle) private var chartStyle
@Environment(\.title) private var title
private var configuration: ChartTypeConfiguration
public var body: some View {
self.chartType.makeChart(configuration: configuration, style: chartStyle)
}
}
extension ChartView {
public init(data: [Double]) {
self.configuration = ChartTypeConfiguration(data: data)
}
}
@@ -1,10 +1,3 @@
//
// File.swift
//
//
// Created by Nicolas Savoini on 2020-05-25.
//
import Foundation
extension Array where Element == ColorGradient {
@@ -1,10 +1,3 @@
//
// CGRect+Extension.swift
// SwiftUICharts
//
// Created by Nicolas Savoini on 2020-05-24.
//
import Foundation
import SwiftUI
@@ -0,0 +1,10 @@
import SwiftUI
extension View where Self: ChartBase {
public func data(_ data: [Double]) -> some View {
chartData.data = data
return self
.environmentObject(chartData)
.environmentObject(ChartValue())
}
}
@@ -1,11 +1,7 @@
import SwiftUI
extension View {
public func type<S>(_ type: S) -> some View where S: ChartType {
self.environment(\.chartType, AnyChartType(type))
}
public func style(_ style: ChartStyle) -> some View {
self.environment(\.chartStyle, style)
public func chartStyle(_ style: ChartStyle) -> some View {
self.environmentObject(style)
}
}
@@ -0,0 +1,20 @@
import SwiftUI
public struct ChartGrid<Content: View>: View, ChartBase {
public var chartData = ChartData()
let content: () -> Content
@EnvironmentObject var data: ChartData
@EnvironmentObject var style: ChartStyle
public init(@ViewBuilder content: @escaping () -> Content) {
self.content = content
}
public var body: some View {
ZStack{
self.content()
}
}
}
@@ -1,19 +0,0 @@
import SwiftUI
struct AnyChartLabel: ChartLabel {
private let labelMaker: (ChartLabel.Configuration) -> AnyView
init<S: ChartLabel>(_ label: S) {
self.labelMaker = label.makeTypeErasedBody
}
func makeLabel(configuration: ChartLabel.Configuration) -> AnyView {
self.labelMaker(configuration)
}
}
fileprivate extension ChartLabel {
func makeTypeErasedBody(configuration: ChartLabel.Configuration) -> AnyView {
AnyView(makeLabel(configuration: configuration))
}
}
@@ -1,11 +1,88 @@
import SwiftUI
@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *)
public protocol ChartLabel {
associatedtype Body: View
func makeLabel(configuration: Self.Configuration) -> Self.Body
typealias Configuration = ChartLabelConfiguration
public enum ChartLabelType {
case title
case subTitle
case largeTitle
case custom(size: CGFloat, padding: EdgeInsets, color: Color)
case legend
}
public struct ChartLabel: View {
@EnvironmentObject var chartValue: ChartValue
@State var textToDisplay:String = ""
private var title: String
private var labelSize: CGFloat {
switch labelType {
case .title:
return 32.0
case .legend:
return 14.0
case .subTitle:
return 24.0
case .largeTitle:
return 38.0
case .custom(let size, _, _):
return size
}
}
private var labelPadding: EdgeInsets {
switch labelType {
case .title:
return EdgeInsets(top: 16.0, leading: 8.0, bottom: 0.0, trailing: 8.0)
case .legend:
return EdgeInsets(top: 4.0, leading: 8.0, bottom: 0.0, trailing: 8.0)
case .subTitle:
return EdgeInsets(top: 8.0, leading: 8.0, bottom: 0.0, trailing: 8.0)
case .largeTitle:
return EdgeInsets(top: 24.0, leading: 8.0, bottom: 0.0, trailing: 8.0)
case .custom(_, let padding, _):
return padding
}
}
private let labelType: ChartLabelType
private var labelColor: Color {
switch labelType {
case .title:
return .black
case .legend:
return .gray
case .subTitle:
return .black
case .largeTitle:
return .black
case .custom(_, _, let color):
return color
}
}
public init (_ title: String,
type: ChartLabelType = .title) {
self.title = title
labelType = type
}
public var body: some View {
HStack {
Text(textToDisplay)
.font(.system(size: labelSize))
.bold()
.foregroundColor(self.labelColor)
.padding(self.labelPadding)
.onAppear {
self.textToDisplay = self.title
}
.onReceive(self.chartValue.objectWillChange) { _ in
self.textToDisplay = self.chartValue.interactionInProgress ? String(format: "%.01f", self.chartValue.currentValue) : self.title
}
if !self.chartValue.interactionInProgress {
Spacer()
}
}
}
}
@@ -1,7 +0,0 @@
import SwiftUI
public struct ChartLabelConfiguration {
public let font: Font
public let size: CGFloat
public let color: Color
}
@@ -1,6 +1,6 @@
import SwiftUI
public struct ChartStyle {
public class ChartStyle: ObservableObject {
public let backgroundColor: ColorGradient
public let foregroundColor: [ColorGradient]
@@ -1,30 +1,14 @@
import SwiftUI
public struct BarChart: ChartType {
public func makeChart(configuration: Self.Configuration, style: Self.Style) -> some View {
BarChartRow(data: configuration.data, style: style)
public struct BarChart: View, ChartBase {
public var chartData = ChartData()
@EnvironmentObject var data: ChartData
@EnvironmentObject var style: ChartStyle
public var body: some View {
BarChartRow(chartData: data, style: style)
}
public init() {}
}
struct BarChart_Previews: PreviewProvider {
static var previews: some View {
Group {
BarChart().makeChart(
configuration: .init(data: [0]),
style: .init(backgroundColor: .white, foregroundColor: ColorGradient.redBlack))
Group {
BarChart().makeChart(
configuration: .init(data: [1, 2, 3, 5, 1]),
style: .init(backgroundColor: .white, foregroundColor: ColorGradient.redBlack))
}.environment(\.colorScheme, .light)
Group {
BarChart().makeChart(
configuration: .init(data: [1, 2, 3]),
style: .init(backgroundColor: .white, foregroundColor: ColorGradient.redBlack))
}.environment(\.colorScheme, .dark)
}
}
}
@@ -1,49 +1,67 @@
import SwiftUI
public struct BarChartCell: View {
@State var value: Double
@State var index: Int = 0
@State var width: Float
@State var numberOfDataPoints: Int
var value: Double
var index: Int = 0
var width: Float
var numberOfDataPoints: Int
var gradientColor: ColorGradient
var touchLocation: CGFloat
var cellWidth: Double {
return Double(width)/(Double(numberOfDataPoints) * 1.5)
}
@State var scaleValue: Double = 0
@Binding var touchLocation: CGFloat
@State var firstDisplay: Bool = true
public init( value: Double,
index: Int = 0,
width: Float,
numberOfDataPoints: Int,
gradientColor: ColorGradient,
touchLocation: CGFloat) {
self.value = value
self.index = index
self.width = width
self.numberOfDataPoints = numberOfDataPoints
self.gradientColor = gradientColor
self.touchLocation = touchLocation
}
public var body: some View {
ZStack {
RoundedRectangle(cornerRadius: 4)
.fill(gradientColor.linearGradient(from: .bottom, to: .top))
}
.frame(width: CGFloat(self.cellWidth))
.scaleEffect(CGSize(width: 1, height: self.scaleValue), anchor: .bottom)
.onAppear {
self.scaleValue = self.value
}
.animation(Animation.spring().delay(self.touchLocation < 0 ? Double(self.index) * 0.04 : 0))
}
.frame(width: CGFloat(self.cellWidth))
.scaleEffect(CGSize(width: 1, height: self.firstDisplay ? 0.0 : self.value), anchor: .bottom)
.onAppear {
self.firstDisplay = false
}
.onDisappear {
self.firstDisplay = true
}
.transition(.slide)
.animation(Animation.spring().delay(self.touchLocation < 0 || !firstDisplay ? Double(self.index) * 0.04 : 0))
}
}
struct BarChartCell_Previews: PreviewProvider {
static var previews: some View {
Group {
BarChartCell(value: 0, width: 50, numberOfDataPoints: 1, gradientColor: ColorGradient.greenRed, touchLocation: .constant(CGFloat()))
Group {
BarChartCell(value: 1, width: 50, numberOfDataPoints: 1, gradientColor: ColorGradient.greenRed, touchLocation: .constant(CGFloat()))
BarChartCell(value: 1, width: 50, numberOfDataPoints: 1, gradientColor: ColorGradient.whiteBlack, touchLocation: .constant(CGFloat()))
BarChartCell(value: 1, width: 50, numberOfDataPoints: 1, gradientColor: ColorGradient(.purple), touchLocation: .constant(CGFloat()))
BarChartCell(value: 0, width: 50, numberOfDataPoints: 1, gradientColor: ColorGradient.greenRed, touchLocation: CGFloat())
BarChartCell(value: 1, width: 50, numberOfDataPoints: 1, gradientColor: ColorGradient.greenRed, touchLocation: CGFloat())
BarChartCell(value: 1, width: 50, numberOfDataPoints: 1, gradientColor: ColorGradient.whiteBlack, touchLocation: CGFloat())
BarChartCell(value: 1, width: 50, numberOfDataPoints: 1, gradientColor: ColorGradient(.purple), touchLocation: CGFloat())
}
Group {
BarChartCell(value: 1, width: 50, numberOfDataPoints: 1, gradientColor: ColorGradient.greenRed, touchLocation: .constant(CGFloat()))
BarChartCell(value: 1, width: 50, numberOfDataPoints: 1, gradientColor: ColorGradient.whiteBlack, touchLocation: .constant(CGFloat()))
BarChartCell(value: 1, width: 50, numberOfDataPoints: 1, gradientColor: ColorGradient(.purple), touchLocation: .constant(CGFloat()))
BarChartCell(value: 1, width: 50, numberOfDataPoints: 1, gradientColor: ColorGradient.greenRed, touchLocation: CGFloat())
BarChartCell(value: 1, width: 50, numberOfDataPoints: 1, gradientColor: ColorGradient.whiteBlack, touchLocation: CGFloat())
BarChartCell(value: 1, width: 50, numberOfDataPoints: 1, gradientColor: ColorGradient(.purple), touchLocation: CGFloat())
}.environment(\.colorScheme, .dark)
}
}
}
@@ -1,7 +1,8 @@
import SwiftUI
public struct BarChartRow: View {
@State var data: [Double] = []
@EnvironmentObject var chartValue: ChartValue
@ObservedObject var chartData: ChartData
@State var touchLocation: CGFloat = -1.0
enum Constant {
@@ -11,7 +12,7 @@ public struct BarChartRow: View {
var style: ChartStyle
var maxValue: Double {
guard let max = data.max() else {
guard let max = chartData.data.max() else {
return 1
}
return max != 0 ? max : 1
@@ -20,25 +21,31 @@ public struct BarChartRow: View {
public var body: some View {
GeometryReader { geometry in
HStack(alignment: .bottom,
spacing: (geometry.frame(in: .local).width - Constant.spacing) / CGFloat(self.data.count * 3)) {
ForEach(0..<self.data.count, id: \.self) { index in
BarChartCell(value: self.normalizedValue(index: index),
index: index,
width: Float(geometry.frame(in: .local).width - Constant.spacing),
numberOfDataPoints: self.data.count,
gradientColor: self.style.foregroundColor.rotate(for: index),
touchLocation: self.$touchLocation)
.scaleEffect(self.getScaleSize(touchLocation: self.touchLocation, index: index), anchor: .bottom)
.animation(.spring())
}
spacing: (geometry.frame(in: .local).width - Constant.spacing) / CGFloat(self.chartData.data.count * 3)) {
ForEach(0..<self.chartData.data.count, id: \.self) { index in
BarChartCell(value: self.normalizedValue(index: index),
index: index,
width: Float(geometry.frame(in: .local).width - Constant.spacing),
numberOfDataPoints: self.chartData.data.count,
gradientColor: self.style.foregroundColor.rotate(for: index),
touchLocation: self.touchLocation)
.scaleEffect(self.getScaleSize(touchLocation: self.touchLocation, index: index), anchor: .bottom)
.animation(Animation.easeIn(duration: 0.2))
}
// .drawingGroup()
}
.padding([.top, .leading, .trailing], 10)
.gesture(DragGesture()
.onChanged({ value in
self.touchLocation = value.location.x/geometry.frame(in: .local).width
let width = geometry.frame(in: .local).width
self.touchLocation = value.location.x/width
if let currentValue = self.getCurrentValue(width: width) {
self.chartValue.currentValue = currentValue
self.chartValue.interactionInProgress = true
}
})
.onEnded({ value in
self.chartValue.interactionInProgress = false
self.touchLocation = -1
})
)
@@ -46,37 +53,20 @@ public struct BarChartRow: View {
}
func normalizedValue(index: Int) -> Double {
return Double(data[index])/Double(maxValue)
return Double(chartData.data[index])/Double(maxValue)
}
func getScaleSize(touchLocation: CGFloat, index: Int) -> CGSize {
if touchLocation > CGFloat(index)/CGFloat(self.data.count) &&
touchLocation < CGFloat(index+1)/CGFloat(self.data.count) {
if touchLocation > CGFloat(index)/CGFloat(chartData.data.count) &&
touchLocation < CGFloat(index+1)/CGFloat(chartData.data.count) {
return CGSize(width: 1.4, height: 1.1)
}
return CGSize(width: 1, height: 1)
}
}
struct BarChartRow_Previews: PreviewProvider {
static var previews: some View {
Group {
BarChartRow(data: [0], style: styleGreenRed)
Group {
BarChartRow(data: [1, 2, 3], style: styleGreenRed)
BarChartRow(data: [1, 2, 3], style: styleGreenRedWhiteBlack)
}
Group {
BarChartRow(data: [1, 2, 3], style: styleGreenRed)
BarChartRow(data: [1, 2, 3], style: styleGreenRedWhiteBlack)
}.environment(\.colorScheme, .dark)
func getCurrentValue(width: CGFloat) -> Double? {
guard self.chartData.data.count > 0 else { return nil}
let index = max(0,min(self.chartData.data.count-1,Int(floor((self.touchLocation*width)/(width/CGFloat(self.chartData.data.count))))))
return self.chartData.data[index]
}
}
}
private let styleGreenRed = ChartStyle(backgroundColor: .white, foregroundColor: .greenRed)
private let styleGreenRedWhiteBlack = ChartStyle(
backgroundColor: ColorGradient.init(.white),
foregroundColor: [ColorGradient.redBlack, ColorGradient.whiteBlack])
@@ -1,7 +0,0 @@
import SwiftUI
public struct TitleLabel: ChartLabel {
public func makeLabel(configuration: Self.Configuration) -> some View {
return Text("AAA")
}
}
@@ -1,8 +1,10 @@
import SwiftUI
public struct Line: View {
@EnvironmentObject var chartValue: ChartValue
@State var frame: CGRect = .zero
@State var data: [Double]
@ObservedObject var chartData: ChartData
var style: ChartStyle
@State var showIndicator: Bool = false
@@ -11,11 +13,11 @@ public struct Line: View {
@State var showBackground: Bool = true
var curvedLines: Bool = true
var step: CGPoint {
return CGPoint.getStep(frame: frame, data: data)
return CGPoint.getStep(frame: frame, data: chartData.data)
}
var path: Path {
let points = data
let points = chartData.data
if curvedLines {
return Path.quadCurvedPathWithPoints(points: points,
@@ -27,7 +29,7 @@ public struct Line: View {
}
var closedPath: Path {
let points = data
let points = chartData.data
if curvedLines {
return Path.quadClosedCurvedPathWithPoints(points: points,
@@ -59,10 +61,13 @@ public struct Line: View {
.onChanged({ value in
self.touchLocation = value.location
self.showIndicator = true
self.getClosestDataPoint(point: self.getClosestPointOnPath(touchLocation: value.location))
self.chartValue.interactionInProgress = true
})
.onEnded({ value in
self.touchLocation = .zero
self.showIndicator = false
self.chartValue.interactionInProgress = false
})
)
}
@@ -77,11 +82,24 @@ extension Line {
return closest
}
private func getClosestDataPoint(point: CGPoint) {
let index = Int(round((point.x)/step.x))
if (index >= 0 && index < self.chartData.data.count){
self.chartValue.currentValue = self.chartData.data[index]
}
}
private func getBackgroundPathView() -> some View {
self.closedPath
.fill(style.backgroundColor.linearGradient(from: .bottom, to: .top))
.fill(LinearGradient(gradient: Gradient(colors: [
style.foregroundColor.first?.startColor ?? .white,
style.foregroundColor.first?.endColor ?? .white,
.white]),
startPoint: .bottom,
endPoint: .top))
.rotationEffect(.degrees(180), anchor: .center)
.rotation3DEffect(.degrees(180), axis: (x: 0, y: 1, z: 0))
.opacity(0.2)
.transition(.opacity)
.animation(.easeIn(duration: 1.6))
}
@@ -109,8 +127,8 @@ extension Line {
struct Line_Previews: PreviewProvider {
static var previews: some View {
Group {
Line(data: [1, 2, 3, 1, 2, 5, 7], style: blackLineStyle)
Line(data: [1, 2, 3, 1, 2, 5, 7], style: redLineStyle)
Line(chartData: ChartData([8, 23, 32, 7, 23, 43]), style: blackLineStyle)
Line(chartData: ChartData([8, 23, 32, 7, 23, 43]), style: redLineStyle)
}
}
}
@@ -1,32 +1,14 @@
import SwiftUI
public struct LineChart: ChartType {
public func makeChart(configuration: Self.Configuration, style: Self.Style) -> some View {
Line(data: configuration.data, style: style)
}
public struct LineChart: View, ChartBase {
public var chartData = ChartData()
@EnvironmentObject var data: ChartData
@EnvironmentObject var style: ChartStyle
public var body: some View {
Line(chartData: data, style: style)
}
public init() {}
}
struct LineChart_Previews: PreviewProvider {
static var previews: some View {
Group {
LineChart().makeChart(
configuration: .init(data: [0]),
style: .init(backgroundColor: .white, foregroundColor: ColorGradient(.black)))
Group {
LineChart().makeChart(
configuration: .init(data: [1, 2, 3, 5, 1]),
style: .init(backgroundColor: .white, foregroundColor: ColorGradient(.black)))
}.environment(\.colorScheme, .light)
Group {
LineChart().makeChart(
configuration: .init(data: [1, 2, 3]),
style: .init(backgroundColor: .white, foregroundColor: ColorGradient.redBlack))
}.environment(\.colorScheme, .dark)
}
}
}
@@ -1,63 +1,14 @@
//
// PieChart.swift
// SwiftUICharts
//
// Created by Nicolas Savoini on 2020-05-24.
//
import SwiftUI
public struct PieChart: ChartType {
public func makeChart(configuration: Self.Configuration, style: Self.Style) -> some View {
PieChartRow(data: configuration.data, style: style)
public struct PieChart: View, ChartBase {
public var chartData = ChartData()
@EnvironmentObject var data: ChartData
@EnvironmentObject var style: ChartStyle
public var body: some View {
PieChartRow(chartData: data, style: style)
}
public init() {}
}
struct PieChart_Previews: PreviewProvider {
static var previews: some View {
Group {
PieChart().makeChart(
configuration: .init(data: [0]),
style: styleOneColor)
Group {
PieChart().makeChart(
configuration: .init(data: [56, 78, 53, 65, 54]),
style: styleOneColor)
PieChart().makeChart(
configuration: .init(data: [56, 78, 53, 65, 54]),
style: styleTwoColor)
PieChart().makeChart(
configuration: .init(data: [1, 1, 1, 1, 1, 1]),
style: trivialPursuit)
}.environment(\.colorScheme, .light)
Group {
PieChart().makeChart(
configuration: .init(data: [56, 78, 53, 65, 54]),
style: styleOneColor)
PieChart().makeChart(
configuration: .init(data: [56, 78, 53, 65, 54]),
style: styleTwoColor)
PieChart().makeChart(
configuration: .init(data: [1, 1, 1, 1, 1, 1]),
style: trivialPursuit)
}.environment(\.colorScheme, .dark)
}.previewLayout(.fixed(width: 250, height: 400))
}
}
private let styleOneColor = ChartStyle(backgroundColor: .white, foregroundColor: ColorGradient.init(.pink))
private let styleTwoColor = ChartStyle(backgroundColor: ColorGradient(.black), foregroundColor: [ColorGradient(.yellow), ColorGradient(.red)])
private let trivialPursuit = ChartStyle(
backgroundColor: .yellow,
foregroundColor: [ColorGradient(.yellow),
ColorGradient(.pink),
ColorGradient(.green),
ColorGradient(.primary),
ColorGradient(.blue),
ColorGradient(.orange)])
@@ -8,16 +8,16 @@
import SwiftUI
public struct PieChartRow: View {
var data: [Double]
@ObservedObject var chartData: ChartData
var style: ChartStyle
var slices: [PieSlice] {
var tempSlices: [PieSlice] = []
var lastEndDeg: Double = 0
let maxValue: Double = data.reduce(0, +)
let maxValue: Double = chartData.data.reduce(0, +)
for slice in data {
for slice in chartData.data {
let normalized: Double = Double(slice) / (maxValue == 0 ? 1 : maxValue)
let startDeg = lastEndDeg
let endDeg = lastEndDeg + (normalized * 360)
@@ -53,17 +53,17 @@ struct PieChartRow_Previews: PreviewProvider {
Group {
//Empty Array - Default Colors.OrangeStart
PieChartRow(
data: [8, 23, 32, 7, 23, 43],
chartData: ChartData([8, 23, 32, 7, 23, 43]),
style: defaultMultiColorChartStyle)
.frame(width: 100, height: 100)
PieChartRow(
data: [8, 23, 32, 7, 23, 43],
chartData: ChartData([8, 23, 32, 7, 23, 43]),
style: multiColorChartStyle)
.frame(width: 100, height: 100)
PieChartRow(
data: [0],
chartData: ChartData([8, 23, 32, 7, 23, 43]),
style: multiColorChartStyle)
.frame(width: 100, height: 100)
@@ -1,30 +0,0 @@
import SwiftUI
extension EnvironmentValues {
var chartType: AnyChartType {
get {
return self[ChartTypeKey.self]
}
set {
self[ChartTypeKey.self] = newValue
}
}
var chartStyle: ChartStyle {
get {
return self[ChartStyleKey.self]
}
set {
self[ChartStyleKey.self] = newValue
}
}
var title: AnyChartLabel {
get {
return self[ChartLabelKey.self]
}
set {
self[ChartLabelKey.self] = newValue
}
}
}
@@ -1,15 +0,0 @@
import SwiftUI
struct ChartTypeKey: EnvironmentKey {
static let defaultValue: AnyChartType = AnyChartType(BarChart())
}
struct ChartStyleKey: EnvironmentKey {
static let defaultValue: ChartStyle = ChartStyle(backgroundColor: .white,
foregroundColor: ColorGradient(ChartColors.orangeDark,
ChartColors.orangeBright))
}
struct ChartLabelKey: EnvironmentKey {
static let defaultValue: AnyChartLabel = AnyChartLabel(TitleLabel())
}