qtdeclarative/tests/manual/painterpathquickshape/ControlledShape.qml

135 lines
4.7 KiB
QML

// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
import QtQuick
import QtQuick.Shapes
import io.qt
Item {
id: topLevel
property alias fillColor: shapePath.fillColor
property alias strokeStyle: shapePath.strokeStyle
property alias capStyle: shapePath.capStyle
property alias strokeColor: shapePath.strokeColor
property alias strokeWidth: shapePath.strokeWidth
property alias fillRule: shapePath.fillRule
property alias startX: shapePath.startX
property alias startY: shapePath.startY
property rect boundingRect: shape.boundingRect
width: boundingRect.width
height: boundingRect.height
property vector2d startPoint: "0,0"
property list<QtObject> delegate
LinearGradient {
id: linearGradient
x1: shape.boundingRect.left
y1: shape.boundingRect.top
x2: shape.boundingRect.right
y2: shape.boundingRect.bottom
GradientStop { position: 0; color: fillColor }
GradientStop { position: 1; color: Qt.rgba(1 - fillColor.r, 1 - fillColor.g, 1 - fillColor.b, 1) }
}
RadialGradient {
id: radialGradient
centerX: 0.5 * (shape.boundingRect.right + shape.boundingRect.left)
centerY: 0.5 * (shape.boundingRect.top + shape.boundingRect.bottom)
focalX: centerX
focalY: centerY
centerRadius: 0.5 * (shape.boundingRect.right - shape.boundingRect.left)
focalRadius: 0.1
GradientStop { position: 0.0; color: fillColor }
GradientStop { position: 1.0; color: Qt.rgba(1 - fillColor.r, 1 - fillColor.g, 1 - fillColor.b, 1) }
}
ConicalGradient {
id: conicalGradient
centerX: 0.5 * (shape.boundingRect.right + shape.boundingRect.left)
centerY: 0.5 * (shape.boundingRect.top + shape.boundingRect.bottom)
GradientStop { position: 0.0; color: fillColor }
GradientStop { position: 0.5; color: Qt.rgba(1 - fillColor.r, 1 - fillColor.g, 1 - fillColor.b, 1) }
GradientStop { position: 1.0; color: fillColor }
}
property var gradients: [ null, linearGradient, radialGradient, conicalGradient ]
Shape {
id: shape
x: 0
y: 0
preferredRendererType: controlPanel.preferCurve ? Shape.CurveRenderer : Shape.UnknownRenderer
onRendererTypeChanged: {
controlPanel.rendererName = rendererType == Shape.SoftwareRenderer ? "Software" :
rendererType == Shape.GeometryRenderer ? "Geometry" :
rendererType == Shape.CurveRenderer ? "Curve" : "Unknown";
}
transform: [
Scale {
xScale: controlPanel.scale
yScale: controlPanel.scale
origin.x: shape.implicitWidth / 2
origin.y: shape.implicitHeight / 2
}
]
ShapePath {
id: shapePath
fillRule: ShapePath.WindingFill
fillGradient: gradients[controlPanel.gradientType]
strokeColor: controlPanel.outlineColor
fillColor: controlPanel.fillColor
strokeWidth: controlPanel.outlineWidth
strokeStyle: controlPanel.outlineStyle
joinStyle: controlPanel.joinStyle
capStyle: controlPanel.capStyle
}
Repeater {
model: topLevel.delegate
onModelChanged: {
shapePath.pathElements = []
for (var i = 0; i < model.length; ++i)
shapePath.pathElements.push(model[i])
}
}
}
Connections {
target: controlPanel
function onPathChanged() {
debugPaintPath.update()
}
}
DebugPaintItem {
id: debugPaintPath
shape: shapePath
visible: controlPanel.painterComparison > 0
color: controlPanel.painterComparisonColor
opacity: controlPanel.painterComparisonAlpha
z: controlPanel.painterComparison > 1 ? -1 : 0
pathScale: controlPanel.scale
fillRule: topLevel.fillRule
strokeStyle: topLevel.strokeStyle
strokeColor: controlPanel.outlineEnabled ? Qt.rgba(1 - color.r, 1 - color.g, 1 - color.b, 1) : "transparent"
capStyle: topLevel.capStyle
joinStyle: controlPanel.joinStyle
strokeWidth: topLevel.strokeWidth
width: visible ? (shape.boundingRect.width + shape.boundingRect.x) * controlPanel.scale : 1
height: visible ? (shape.boundingRect.height + shape.boundingRect.y) * controlPanel.scale : 1
}
DebugVisualizationController {
showCurves: controlPanel.debugCurves
showWireframe: controlPanel.debugWireframe
onSettingsChanged: { shapePath.changed() }
}
}