1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
|
// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
import QtQuick
import QtQuick.Shapes
import QtQuick.Controls
import QtQuick.Dialogs
import io.qt
Item {
id: topLevel
property var boundingRect: Qt.rect(0, 0, 100, 100)
Text {
id: fileNameLabel
x: boundingRect.x
y: boundingRect.bottom * controlPanel.scale + font.pixelSize*2
text: "Filename: " + pathLoader.source
}
ToolButton {
anchors.left: fileNameLabel.right
anchors.top: fileNameLabel.top
anchors.leftMargin: 10
text: "..."
onClicked: {
fileDialog.visible = true
}
}
property var children: []
SvgPathLoader {
id: pathLoader
function reload()
{
for (var j = 0; j < children.length; ++j) {
children[j].destroy()
}
children = []
let first = true
let pickShape = controlPanel.subShape
let pickOne = pickShape >= 0 && !controlPanel.subShapeGreaterThan
let pickGreater = pickShape >= 0 && controlPanel.subShapeGreaterThan
if (pickOne)
console.log("Creating SVG item", pickShape, "out of", pathLoader.paths.length)
else if (pickGreater)
console.debug("Creating " + (pathLoader.paths.length - pickShape) + " SVG items")
else
console.debug("Creating " + pathLoader.paths.length + " SVG items")
for (var i = 0; i < pathLoader.paths.length; ++i) {
if ((pickOne && pickShape !== i ) || (pickGreater && i < pickShape))
continue
var s = pathLoader.paths[i]
var fillColor = pathLoader.fillColors[i]
let strokeText = "";
let strokeColor = pathLoader.strokeColors[i]
let strokeWidth = pathLoader.strokeWidths[i]
let transform = pathLoader.transforms[i]
if (strokeColor) {
if (!strokeWidth)
strokeWidth = "1.0" // default value defined by SVG standard
strokeText = "strokeColor: \"" + strokeColor + "\"; strokeWidth: " + strokeWidth + ";"
}
let fillText = "";
if (fillColor)
fillText = "fillColor: \"" + fillColor + "\";\n";
var obj = Qt.createQmlObject("import QtQuick\nimport QtQuick.Shapes\n ControlledShape { \n"
+ fillText
+ "shapeTransform: Matrix4x4 { matrix: Qt.matrix4x4(" + transform + "); }\n"
+ strokeText + "\n"
+ "fillRule: ShapePath.WindingFill; delegate: [ PathSvg { path: \"" + s + "\"; } ] }\n",
topLevel, "SvgPathComponent_" + i)
children.push(obj)
if (first) {
topLevel.boundingRect = obj.boundingRect
first = false
} else {
var minX = Math.min(topLevel.boundingRect.x, obj.boundingRect.x)
var minY = Math.min(topLevel.boundingRect.y, obj.boundingRect.y)
var maxX = Math.max(topLevel.boundingRect.x + topLevel.boundingRect.width,
obj.boundingRect.x + obj.boundingRect.width)
var maxY = Math.max(topLevel.boundingRect.y + topLevel.boundingRect.height,
obj.boundingRect.y + obj.boundingRect.height)
topLevel.boundingRect = Qt.rect(minX, minY, maxX - minX, maxY - minY)
}
}
console.debug("Finished SVG")
}
onPathsChanged: reload()
Component.onCompleted: {
pathLoader.source = "qrc:/1535737773.svg"
}
}
Connections {
target: controlPanel
function onSubShapeChanged() { pathLoader.reload() }
}
FileDialog {
id: fileDialog
title: "Please choose a file"
onAccepted: {
pathLoader.source = fileDialog.selectedFile
fileDialog.visible = false
}
}
}
|