4#include <QtCore/qurl.h>
7#include <QtQuickVectorImageGenerator/private/qquickitemgenerator_p.h>
8#include <QtQuickVectorImageGenerator/private/qquickvectorimageglobal_p.h>
9#include <QtQuickVectorImageGenerator/private/qquickvectorimageplugin_p.h>
10#include <QtCore/qloggingcategory.h>
12#include <private/qquicktranslate_p.h>
14#include <private/qfactoryloader_p.h>
18Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, vectorImagePluginLoader,
19 (QQuickVectorImageFormatsPluginFactory_iid,
20 QLatin1String(
"/vectorimageformats"),
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
50void QQuickVectorImagePrivate::setSource(
const QUrl &source)
52 Q_Q(QQuickVectorImage);
53 if (sourceFile == source)
58 emit q->sourceChanged();
63 Q_Q(QQuickVectorImage);
65 if (!q->isComponentComplete())
68 QUrl resolvedUrl = qmlContext(q)->resolvedUrl(sourceFile);
69 QString localFile = QQmlFile::urlToLocalFileOrQrc(resolvedUrl);
71 if (localFile.isEmpty())
75 rootItem->deleteLater();
77 rootItem =
new QQuickItem(q);
78 rootItem->setParentItem(q);
80 QQuickVectorImageGenerator::GeneratorFlags flags;
81 if (preferredRendererType == QQuickVectorImage::CurveRenderer)
82 flags.setFlag(QQuickVectorImageGenerator::CurveRenderer);
83 if (assumeTrustedSource)
84 flags.setFlag(QQuickVectorImageGenerator::AssumeTrustedSource);
86 QQuickItemGenerator generator(localFile, flags, rootItem, qmlContext(q));
89 bool generatedWithPlugin =
false;
91 QFactoryLoader *loader = vectorImagePluginLoader();
93 const qsizetype count = loader->keyMap().size();
94 for (qsizetype i = 0; i <= count && !generatedWithPlugin; ++i) {
95 QQuickVectorImagePlugin *plugin = qobject_cast<QQuickVectorImagePlugin *>(loader->instance(i));
96 if (plugin !=
nullptr)
97 generatedWithPlugin = plugin->generate(localFile, &generator);
101 if (!generatedWithPlugin)
102 generator.generate();
104 q->setImplicitWidth(rootItem->width());
105 q->setImplicitHeight(rootItem->height());
107 q->updateAnimationProperties();
108 q->updateRootItemScale();
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132QQuickVectorImage::QQuickVectorImage(QQuickItem *parent)
133 : QQuickItem(*(
new QQuickVectorImagePrivate), parent)
135 setFlag(QQuickItem::ItemHasContents,
true);
137 QObject::connect(
this, &QQuickItem::widthChanged,
this, &QQuickVectorImage::updateRootItemScale);
138 QObject::connect(
this, &QQuickItem::heightChanged,
this, &QQuickVectorImage::updateRootItemScale);
139 QObject::connect(
this, &QQuickVectorImage::fillModeChanged,
this, &QQuickVectorImage::updateRootItemScale);
143
144
145
146
147
148
149
150
151QUrl QQuickVectorImage::source()
const
153 Q_D(
const QQuickVectorImage);
154 return d->sourceFile;
157void QQuickVectorImage::setSource(
const QUrl &source)
159 Q_D(QQuickVectorImage);
160 d->setSource(source);
163void QQuickVectorImage::updateRootItemScale()
165 Q_D(QQuickVectorImage);
167 if (d->rootItem ==
nullptr
168 || qFuzzyIsNull(d->rootItem->width())
169 || qFuzzyIsNull(d->rootItem->height())) {
173 auto xformProp = d->rootItem->transform();
174 QQuickScale *scaleTransform =
nullptr;
175 if (xformProp.count(&xformProp) == 0) {
176 scaleTransform =
new QQuickScale;
177 scaleTransform->setParent(d->rootItem);
178 xformProp.append(&xformProp, scaleTransform);
180 scaleTransform = qobject_cast<QQuickScale *>(xformProp.at(&xformProp, 0));
183 if (scaleTransform !=
nullptr) {
184 qreal xScale = width() / d->rootItem->width();
185 qreal yScale = height() / d->rootItem->height();
187 switch (d->fillMode) {
188 case QQuickVectorImage::NoResize:
189 xScale = yScale = 1.0;
191 case QQuickVectorImage::PreserveAspectFit:
192 xScale = yScale = qMin(xScale, yScale);
194 case QQuickVectorImage::PreserveAspectCrop:
195 xScale = yScale = qMax(xScale, yScale);
197 case QQuickVectorImage::Stretch:
202 scaleTransform->setXScale(xScale);
203 scaleTransform->setYScale(yScale);
207void QQuickVectorImage::updateAnimationProperties()
209 Q_D(QQuickVectorImage);
210 if (Q_UNLIKELY(d->rootItem ==
nullptr || d->rootItem->childItems().isEmpty()))
213 QQuickItem *childItem = d->rootItem->childItems().first();
214 if (Q_LIKELY(d->animations !=
nullptr)) {
215 childItem->setProperty(
"loops", d->animations->loops());
216 childItem->setProperty(
"paused", d->animations->paused());
220QQuickVectorImageAnimations *QQuickVectorImage::animations()
222 Q_D(QQuickVectorImage);
223 if (d->animations ==
nullptr) {
224 d->animations =
new QQuickVectorImageAnimations;
225 QQml_setParent_noEvent(d->animations,
this);
226 QObject::connect(d->animations, &QQuickVectorImageAnimations::loopsChanged,
this, &QQuickVectorImage::updateAnimationProperties);
227 QObject::connect(d->animations, &QQuickVectorImageAnimations::pausedChanged,
this, &QQuickVectorImage::updateAnimationProperties);
230 return d->animations;
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
253QQuickVectorImage::FillMode QQuickVectorImage::fillMode()
const
255 Q_D(
const QQuickVectorImage);
259void QQuickVectorImage::setFillMode(FillMode newFillMode)
261 Q_D(QQuickVectorImage);
262 if (d->fillMode == newFillMode)
264 d->fillMode = newFillMode;
265 emit fillModeChanged();
269
270
271
272
273
274
275
276
277
278
279
280
281
283QQuickVectorImage::RendererType QQuickVectorImage::preferredRendererType()
const
285 Q_D(
const QQuickVectorImage);
286 return d->preferredRendererType;
289void QQuickVectorImage::setPreferredRendererType(RendererType newPreferredRendererType)
291 Q_D(QQuickVectorImage);
292 if (d->preferredRendererType == newPreferredRendererType)
294 d->preferredRendererType = newPreferredRendererType;
296 emit preferredRendererTypeChanged();
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
316bool QQuickVectorImage::assumeTrustedSource()
const
318 Q_D(
const QQuickVectorImage);
319 return d->assumeTrustedSource;
322void QQuickVectorImage::setAssumeTrustedSource(
bool assumeTrustedSource)
324 Q_D(QQuickVectorImage);
325 if (d->assumeTrustedSource == assumeTrustedSource)
327 d->assumeTrustedSource = assumeTrustedSource;
329 emit assumeTrustedSourceChanged();
332void QQuickVectorImage::componentComplete()
334 Q_D(QQuickVectorImage);
335 QQuickItem::componentComplete();
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357int QQuickVectorImageAnimations::loops()
const
362void QQuickVectorImageAnimations::setLoops(
int loops)
364 if (m_loops == loops)
370bool QQuickVectorImageAnimations::paused()
const
375void QQuickVectorImageAnimations::setPaused(
bool paused)
377 if (m_paused == paused)
380 emit pausedChanged();
383void QQuickVectorImageAnimations::restart()
385 QQuickVectorImage *parentVectorImage = qobject_cast<QQuickVectorImage *>(parent());
386 if (Q_UNLIKELY(parentVectorImage ==
nullptr)) {
387 qCWarning(lcQuickVectorImage) << Q_FUNC_INFO <<
"Parent is not a VectorImage";
391 QQuickVectorImagePrivate *d = QQuickVectorImagePrivate::get(parentVectorImage);
393 if (Q_UNLIKELY(d->rootItem ==
nullptr || d->rootItem->childItems().isEmpty()))
396 QQuickItem *childItem = d->rootItem->childItems().first();
397 QMetaObject::invokeMethod(childItem,
"restart");
402#include <moc_qquickvectorimage_p.cpp>