Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qquickqmlgenerator_p.h
Go to the documentation of this file.
1// Copyright (C) 2024 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QQUICKQMLGENERATOR_P_H
5#define QQUICKQMLGENERATOR_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
21
22#include <QtCore/qtextstream.h>
23#include <QtCore/qbuffer.h>
24#include <QtCore/qmap.h>
25#include <QtCore/qset.h>
26#include <QtCore/qstack.h>
27
29
30class Q_QUICKVECTORIMAGEGENERATOR_EXPORT QQuickQmlGenerator : public QQuickGenerator
31{
32public:
33 QQuickQmlGenerator(const QQuickVectorImageSource &source,
34 QQuickVectorImageGenerator::GeneratorFlags flags,
35 const QString &outFileName);
36 ~QQuickQmlGenerator();
37
38 bool save();
39
40 void setShapeTypeName(const QString &name);
41 QString shapeTypeName() const;
42
43 void setCommentString(const QString commentString);
44 QString commentString() const;
45
46 void setRetainFilePaths(bool retainFilePaths)
47 {
48 m_retainFilePaths = retainFilePaths;
49 }
50
51 bool retainFilePaths() const
52 {
53 return m_retainFilePaths;
54 }
55
56 void setAssetFileDirectory(const QString &assetFileDirectory)
57 {
58 m_assetFileDirectory = assetFileDirectory;
59 }
60
61 QString assetFileDirectory() const
62 {
63 return m_assetFileDirectory;
64 }
65
66 void setAssetFilePrefix(const QString &assetFilePrefix)
67 {
68 m_assetFilePrefix = assetFilePrefix;
69 }
70
71 QString assetFilePrefix() const
72 {
73 return m_assetFilePrefix;
74 }
75
76 void setUrlPrefix(const QString &prefix)
77 {
78 m_urlPrefix = prefix;
79 }
80
81 QString urlPrefix() const
82 {
83 return m_urlPrefix;
84 }
85
86 void addExtraImport(const QString &import) override { m_extraImports.append(import); }
87
88 QStringList extraImports() const
89 {
90 return m_extraImports;
91 }
92
93 bool isRuntimeGenerator() const
94 {
95 return !m_urlPrefix.isEmpty();
96 }
97
98 QByteArray result() const
99 {
100 return m_result.data();
101 }
102
103protected:
104 QString generateNodeBase(const NodeInfo &info, const QString &idSuffix = QString{}) override;
105 void generateNodeEnd(const NodeInfo &info);
106 bool generateDefsNode(const StructureNodeInfo &info) override;
107 void generateDefsInstantiationNode(const StructureNodeInfo &info) override;
108 void generateImageNode(const ImageNodeInfo &info) override;
109 void generatePath(const PathNodeInfo &info, const QRectF &overrideBoundingRect) override;
110 void generateNode(const NodeInfo &info) override;
111 void generateTextNode(const TextNodeInfo &info) override;
112 void generateUseNode(const UseNodeInfo &info) override;
113 void generateFilterNode(const FilterNodeInfo &info) override;
114 bool generateStructureNode(const StructureNodeInfo &info) override;
115 bool generateRootNode(const StructureNodeInfo &info) override;
116 bool generateMaskNode(const MaskNodeInfo &info) override;
117 bool generateMarkerNode(const MarkerNodeInfo &info) override;
118 bool generatePatternNode(const PatternNodeInfo &info) override;
119 void outputShapePath(const PathNodeInfo &info, const QPainterPath *path, const QQuadPath *quadPath, QQuickVectorImageGenerator::PathSelector pathSelector, const QRectF &boundingRect) override;
120
121private:
122 enum class AnimationType {
123 Auto = 0,
124 ColorOpacity = 1
125 };
126
127 QString generateNodeId(const NodeInfo &info);
128 void generateGradient(const QGradient *grad,
129 const QString &propertyName,
130 const QRectF &coordinateConversion = QRectF(0.0, 0.0, 1.0, 1.0));
131 void generateTransform(const QTransform &xf);
132 void generatePathContainer(const StructureNodeInfo &info);
133 void generateAnimateTransform(const QString &targetName, const NodeInfo &info);
134 void generateAnimateMotionPath(const QString &targetName,
135 const QQuickAnimatedProperty &property);
136 void generateAnimationBindings();
137 void generateItemAnimations(const QString &idString, const NodeInfo &nodeInfo);
138 void generateEasing(const QQuickAnimatedProperty::PropertyAnimation &animation, int time,
139 int streamFlags = 0);
140 void generateAnimatedPropertySetter(const QString &targetName,
141 const QString &propertyName,
142 const QVariant &value,
143 const QQuickAnimatedProperty::PropertyAnimation &animation,
144 int time,
145 int frameTime,
146 AnimationType animationType = AnimationType::Auto);
147 void generatePropertyAnimation(const QQuickAnimatedProperty &property,
148 const QString &targetName,
149 const QString &propertyName,
150 AnimationType animationType = AnimationType::Auto);
151
152 void generateShaderUse(const NodeInfo &info);
153 void generateMarkers(const PathNodeInfo &info);
154 qsizetype generateFilterStep(const FilterNodeInfo &info, qsizetype stepIndex);
155
156 bool generateStructureNode_helper(const StructureNodeInfo &info);
157 void registerGraphicItem()
158 {
159 if (!m_opacityWrapperShapeCounts.isEmpty())
160 m_opacityWrapperShapeCounts.top()++;
161 }
162
163 bool usingTimelineAnimation() const
164 {
165 return m_flags.testFlag(QQuickVectorImageGenerator::TimelineAnimation);
166 }
167 void generateTimelineFields(const StructureNodeInfo &info);
168 void generateTimelinePropertySetter(const QString &targetName,
169 const QString &propertyName,
170 const QQuickAnimatedProperty::PropertyAnimation &animation,
171 std::function<QVariant(const QVariant &)> const& extractValue,
172 int valueIndex = 0);
173 void generateTransformTimeline(const QString &targetName, const NodeInfo &info);
174 void generatePropertyTimeline(const QQuickAnimatedProperty &property,
175 const QString &targetName,
176 const QString &propertyName,
177 AnimationType animationType = AnimationType::Auto);
178
179 QStringView indent();
180 enum StreamFlags { NoFlags = 0x0, SameLine = 0x1 };
181 QTextStream &stream(int flags = NoFlags);
182 const char *shapeName() const;
183
184protected:
185 QBuffer m_result;
186
187 void startDefsSuffixBlock();
188 void endDefsSuffixBlock();
189
190private:
191 int m_indentLevel = 0;
192 int m_textNodeCounter = 0;
193 QStack<int> m_oldIndentLevels;
194 QTextStream m_stream;
195 QString outputFileName;
196 int m_inShapeItemLevel = 0;
197 QByteArray m_shapeTypeName;
198 QString m_commentString;
199 bool m_retainFilePaths = false;
200 QString m_assetFileDirectory;
201 QString m_assetFilePrefix;
202 QString m_urlPrefix;
203 QString m_topLevelIdString;
204 QStringList m_extraImports;
205 QMap<std::array<qreal, 4>, QString> m_easings;
206 quint32 m_nodeCounter = 0;
207 QString m_defsSuffix;
208 QString m_indentString;
209 QSet<QString> m_contentRelativeMasks;
210 QStack<QString> m_opacityWrapperIds;
211 QStack<int> m_opacityWrapperShapeCounts;
212};
213
214QT_END_NAMESPACE
215
216#endif // QQUICKQMLGENERATOR_P_H
Combined button and popup list for selecting options.
static QString sanitizeString(const QString &input)