// Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only import QtQuick import QtQuick.Shapes import io.qt Item { id: topLevel property alias capStyle: shapePath.capStyle property alias dashOffset: shapePath.dashOffset property alias dashPattern: shapePath.dashPattern property alias fillColor: shapePath.fillColor property alias fillRule: shapePath.fillRule property alias strokeColor: shapePath.strokeColor property alias strokeStyle: shapePath.strokeStyle property alias strokeWidth: shapePath.strokeWidth property alias shapeTransform: shape.transform 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 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 ] Item { transform: [ Scale { xScale: controlPanel.scale yScale: controlPanel.scale } ] 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"; } ShapePath { id: shapePath fillRule: controlPanel.fillRule fillGradient: gradients[controlPanel.gradientType] strokeColor: controlPanel.outlineColor fillColor: controlPanel.fillColor strokeWidth: controlPanel.outlineWidth strokeStyle: controlPanel.outlineStyle joinStyle: controlPanel.joinStyle capStyle: controlPanel.capStyle fillTransform: Qt.matrix4x4(controlPanel.fillScaleX,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1) } 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() } } }