Skip to content

Commit

Permalink
Add inverted corners for negative values
Browse files Browse the repository at this point in the history
  • Loading branch information
Oleg committed Mar 27, 2024
1 parent c14ed45 commit f527af1
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,29 @@ open class BarChartDataSet: BarLineScatterCandleBubbleChartDataSet, BarChartData
public var cornerRadius: CGFloat = 0.0

/// array of corners to be rounded
open var roundedCorners: UIRectCorner = []
open var roundedCorners: UIRectCorner = [] {
didSet {
var invertedCorners: UIRectCorner = []
if roundedCorners.contains(.topLeft) {
invertedCorners.insert(.bottomLeft)
}
if roundedCorners.contains(.topRight) {
invertedCorners.insert(.bottomRight)
}
if roundedCorners.contains(.bottomLeft) {
invertedCorners.insert(.topLeft)
}
if roundedCorners.contains(.bottomRight) {
invertedCorners.insert(.topRight)
}
if roundedCorners.contains(.allCorners) {
invertedCorners.insert(.allCorners)
}
roundedCornersInverted = invertedCorners
}
}

open var roundedCornersInverted: UIRectCorner = []

/// Calculates the total number of entries this DataSet represents, including
/// stacks. All values belonging to a stack are calculated separately.
Expand Down
3 changes: 3 additions & 0 deletions Source/Charts/Data/Interfaces/BarChartDataSetProtocol.swift
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,7 @@ public protocol BarChartDataSetProtocol: BarLineScatterCandleBubbleChartDataSetP

/// array of corners to be rounded
var roundedCorners: UIRectCorner { get set }

/// array of corners to be rounded
var roundedCornersInverted: UIRectCorner { get }
}
21 changes: 18 additions & 3 deletions Source/Charts/Renderers/BarChartRenderer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -352,7 +352,13 @@ open class BarChartRenderer: BarLineScatterCandleBubbleRenderer

context.setFillColor(dataSet.barShadowColor.cgColor)

let bezierPath = UIBezierPath(roundedRect: barRect, byRoundingCorners: dataSet.roundedCorners,
var roundedCorners = dataSet.roundedCorners
if let i = buffer.firstIndex(of: barRect),
let entry = dataSet.entryForIndex(i),
entry.y < 0 {
roundedCorners = dataSet.roundedCornersInverted
}
let bezierPath = UIBezierPath(roundedRect: barRect, byRoundingCorners: roundedCorners,
cornerRadii: .init(width: dataSet.cornerRadius, height: dataSet.cornerRadius))
context.addPath(bezierPath.cgPath)
context.drawPath(using: .fill)
Expand Down Expand Up @@ -383,7 +389,12 @@ open class BarChartRenderer: BarLineScatterCandleBubbleRenderer
context.setFillColor(dataSet.color(atIndex: j).cgColor)
}

let bezierPath = UIBezierPath(roundedRect: barRect, byRoundingCorners: dataSet.roundedCorners,
var roundedCorners = dataSet.roundedCorners
if let entry = dataSet.entryForIndex(j),
entry.y < 0 {
roundedCorners = dataSet.roundedCornersInverted
}
let bezierPath = UIBezierPath(roundedRect: barRect, byRoundingCorners: roundedCorners,
cornerRadii: .init(width: dataSet.cornerRadius, height: dataSet.cornerRadius))
context.addPath(bezierPath.cgPath)
context.drawPath(using: .fill)
Expand Down Expand Up @@ -751,7 +762,11 @@ open class BarChartRenderer: BarLineScatterCandleBubbleRenderer

setHighlightDrawPos(highlight: high, barRect: barRect)

let bezierPath = UIBezierPath(roundedRect: barRect, byRoundingCorners: set.roundedCorners,
var roundedCorners = set.roundedCorners
if e.y < 0 {
roundedCorners = set.roundedCornersInverted
}
let bezierPath = UIBezierPath(roundedRect: barRect, byRoundingCorners: roundedCorners,
cornerRadii: .init(width: set.cornerRadius, height: set.cornerRadius))
context.addPath(bezierPath.cgPath)
context.drawPath(using: .fill)
Expand Down
12 changes: 10 additions & 2 deletions Source/Charts/Renderers/HorizontalBarChartRenderer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,11 @@ open class HorizontalBarChartRenderer: BarChartRenderer

context.setFillColor(dataSet.barShadowColor.cgColor)

let bezierPath = UIBezierPath(roundedRect: _barShadowRectBuffer, byRoundingCorners: dataSet.roundedCorners,
var roundedCorners = dataSet.roundedCorners
if _barShadowRectBuffer.minX < 0 {
roundedCorners = dataSet.roundedCornersInverted
}
let bezierPath = UIBezierPath(roundedRect: _barShadowRectBuffer, byRoundingCorners: roundedCorners,
cornerRadii: .init(width: dataSet.cornerRadius, height: dataSet.cornerRadius))
context.addPath(bezierPath.cgPath)
context.drawPath(using: .fill)
Expand Down Expand Up @@ -269,7 +273,11 @@ open class HorizontalBarChartRenderer: BarChartRenderer
context.setFillColor(dataSet.color(atIndex: j).cgColor)
}

let bezierPath = UIBezierPath(roundedRect: barRect, byRoundingCorners: dataSet.roundedCorners,
var roundedCorners = dataSet.roundedCorners
if barRect.minX < 0 {
roundedCorners = dataSet.roundedCornersInverted
}
let bezierPath = UIBezierPath(roundedRect: barRect, byRoundingCorners: roundedCorners,
cornerRadii: .init(width: dataSet.cornerRadius, height: dataSet.cornerRadius))
context.addPath(bezierPath.cgPath)
context.drawPath(using: .fill)
Expand Down

0 comments on commit f527af1

Please sign in to comment.