Files

68 lines
1.9 KiB
QML
Raw Permalink Normal View History

2026-09-23 15:19:12 +07:00
import QtQuick
import qs.Commons
Canvas {
id: root
property var values: []
property color lineColor: Color.accent
property color fillColor: Util.alpha(lineColor, 0.12)
property real ceiling: 0
antialiasing: true
onValuesChanged: requestPaint()
onLineColorChanged: requestPaint()
onFillColorChanged: requestPaint()
onCeilingChanged: requestPaint()
onWidthChanged: requestPaint()
onHeightChanged: requestPaint()
onPaint: {
var context = getContext("2d")
context.clearRect(0, 0, width, height)
var points = Array.isArray(values) ? values : []
if (points.length === 0 || width <= 0 || height <= 0) return
var maximum = Number(ceiling)
if (!isFinite(maximum) || maximum <= 0) {
maximum = 1
for (var i = 0; i < points.length; i++) {
var candidate = Number(points[i])
if (isFinite(candidate)) maximum = Math.max(maximum, candidate)
}
maximum *= 1.12
}
var step = points.length > 1 ? width / (points.length - 1) : width
var yFor = function(value) {
var normalized = Math.max(0, Math.min(1, Number(value || 0) / maximum))
return height - normalized * Math.max(1, height - Style.spacing.hairline)
}
context.beginPath()
context.moveTo(0, height)
for (var j = 0; j < points.length; j++) {
var x = points.length > 1 ? j * step : width
context.lineTo(x, yFor(points[j]))
}
context.lineTo(width, height)
context.closePath()
context.fillStyle = fillColor
context.fill()
context.beginPath()
for (var k = 0; k < points.length; k++) {
var lineX = points.length > 1 ? k * step : width
var lineY = yFor(points[k])
if (k === 0) context.moveTo(lineX, lineY)
else context.lineTo(lineX, lineY)
}
context.strokeStyle = lineColor
context.lineWidth = Math.max(1, Style.spaceReal(1.25))
context.lineJoin = "round"
context.lineCap = "round"
context.stroke()
}
}