Sander van Grieken
2 years ago
2 changed files with 74 additions and 0 deletions
@ -0,0 +1,70 @@ |
|||
import QtQuick 2.6 |
|||
|
|||
Canvas { |
|||
id: piechart |
|||
|
|||
property var slices |
|||
|
|||
property int innerOffset: 10 |
|||
property bool showLegend: true |
|||
|
|||
onPaint: { |
|||
var startR = -Math.PI/2 |
|||
|
|||
var ctx = getContext('2d') |
|||
ctx.reset() |
|||
|
|||
ctx.strokeStyle = Qt.rgba(1, 1, 1, 1) |
|||
ctx.lineWidth = 2 |
|||
var pcx = width/2 |
|||
var pcy = height/2 |
|||
var radius = height/4 |
|||
|
|||
var endR = startR |
|||
for (const i in slices) { |
|||
var slice = slices[i] |
|||
if (slice.v == 0) |
|||
continue |
|||
startR = endR |
|||
endR = startR + 2*Math.PI*(slice.v) |
|||
|
|||
// displace origin |
|||
var phi = startR + (endR - startR)/2 |
|||
var dx = Math.cos(phi) * innerOffset |
|||
var dy = Math.sin(phi) * innerOffset |
|||
|
|||
ctx.lineWidth = 2 |
|||
ctx.fillStyle = slice.color |
|||
ctx.beginPath() |
|||
ctx.moveTo(pcx+dx, pcy+dy) |
|||
ctx.arc(pcx+dx, pcy+dy, radius, startR, endR, false) |
|||
ctx.lineTo(pcx+dx, pcy+dy) |
|||
ctx.fill() |
|||
// ctx.stroke() |
|||
|
|||
if (!showLegend) |
|||
continue |
|||
|
|||
// displace legend |
|||
var dx = Math.cos(phi) * (radius + innerOffset + constants.paddingMedium) |
|||
var dy = Math.sin(phi) * (radius + innerOffset + constants.paddingMedium) |
|||
ctx.lineWidth = 1 |
|||
ctx.beginPath() |
|||
if (dx > 0) { |
|||
var ddx = ctx.measureText(slice.text).width + 2 * constants.paddingMedium |
|||
var xtext = pcx+dx*1.2 + constants.paddingMedium |
|||
} else { |
|||
var ddx = -(ctx.measureText(slice.text).width + 2 * constants.paddingMedium) |
|||
var xtext = pcx+dx*1.2+ddx + constants.paddingMedium |
|||
} |
|||
ctx.moveTo(pcx+dx, pcy+dy) |
|||
ctx.lineTo(pcx+dx*1.2, pcy+dy*1.2) |
|||
ctx.lineTo(pcx+dx*1.2+ddx, pcy+dy*1.2) |
|||
ctx.moveTo(pcx+dx*1.2, pcy+dy*1.2) |
|||
|
|||
ctx.text(slice.text, xtext, pcy+dy*1.2 - constants.paddingXSmall) |
|||
ctx.stroke() |
|||
} |
|||
|
|||
} |
|||
} |
Loading…
Reference in new issue