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>
13#include <private/qquickanimation_p.h>
15#include <private/qfactoryloader_p.h>
19Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, vectorImagePluginLoader,
20 (QQuickVectorImageFormatsPluginFactory_iid,
21 QLatin1String(
"/vectorimageformats"),
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
52void QQuickVectorImagePrivate::setSource(
const QUrl &source)
54 Q_Q(QQuickVectorImage);
55 if (sourceFile == source)
60 emit q->sourceChanged();
65 Q_Q(QQuickVectorImage);
67 if (!q->isComponentComplete())
70 QUrl resolvedUrl = qmlContext(q)->resolvedUrl(sourceFile);
71 QString localFile = QQmlFile::urlToLocalFileOrQrc(resolvedUrl);
73 if (localFile.isEmpty())
77 rootItem->deleteLater();
79 rootItem =
new QQuickItem(q);
80 rootItem->setParentItem(q);
82 QQuickVectorImageGenerator::GeneratorFlags flags;
83 if (preferredRendererType == QQuickVectorImage::CurveRenderer)
84 flags.setFlag(QQuickVectorImageGenerator::CurveRenderer);
86 flags.setFlag(QQuickVectorImageGenerator::AssumeTrustedSource);
88 flags.setFlag(QQuickVectorImageGenerator::AsyncShapes);
90 if (!m_qmlContext || m_qmlContext->engine() != qmlContext(q)->engine())
91 m_qmlContext.reset(
new QQmlContext(qmlContext(q)->engine()));
93 QQuickItemGenerator generator(localFile, flags, rootItem, m_qmlContext.get());
96 bool generatedWithPlugin =
false;
98 QFactoryLoader *loader = vectorImagePluginLoader();
100 const qsizetype count = loader->keyMap().size();
101 for (qsizetype i = 0; i <= count && !generatedWithPlugin; ++i) {
102 QQuickVectorImagePlugin *plugin = qobject_cast<QQuickVectorImagePlugin *>(loader->instance(i));
103 if (plugin !=
nullptr)
104 generatedWithPlugin = plugin->generate(localFile, &generator);
108 if (!generatedWithPlugin)
109 generator.generate();
111 q->setImplicitWidth(rootItem->width());
112 q->setImplicitHeight(rootItem->height());
114 static int freezeTime = qEnvironmentVariableIntValue(
"QT_QUICKVECTORIMAGE_FREEZE");
115 if (freezeTime != 0) {
118 q->animations()->setPaused(
true);
119 const QList<QQuickAbstractAnimation *> anims = rootItem->findChildren<QQuickAbstractAnimation *>();
120 for (QQuickAbstractAnimation *anim : anims) {
121 if (anim->group() ==
nullptr)
122 anim->setCurrentTime(freezeTime);
126 q->updateAnimationProperties();
127 q->updateRootItemScale();
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151QQuickVectorImage::QQuickVectorImage(QQuickItem *parent)
152 : QQuickItem(*(
new QQuickVectorImagePrivate), parent)
154 setFlag(QQuickItem::ItemHasContents,
true);
156 QObject::connect(
this, &QQuickItem::widthChanged,
this, &QQuickVectorImage::updateRootItemScale);
157 QObject::connect(
this, &QQuickItem::heightChanged,
this, &QQuickVectorImage::updateRootItemScale);
158 QObject::connect(
this, &QQuickVectorImage::fillModeChanged,
this, &QQuickVectorImage::updateRootItemScale);
162
163
164
165
166
167
168
169
170QUrl QQuickVectorImage::source()
const
172 Q_D(
const QQuickVectorImage);
173 return d->sourceFile;
176void QQuickVectorImage::setSource(
const QUrl &source)
178 Q_D(QQuickVectorImage);
179 d->setSource(source);
182void QQuickVectorImage::updateRootItemScale()
184 Q_D(QQuickVectorImage);
186 if (d->rootItem ==
nullptr
187 || qFuzzyIsNull(d->rootItem->width())
188 || qFuzzyIsNull(d->rootItem->height())) {
192 auto xformProp = d->rootItem->transform();
193 QQuickScale *scaleTransform =
nullptr;
194 if (xformProp.count(&xformProp) == 0) {
195 scaleTransform =
new QQuickScale;
196 scaleTransform->setParent(d->rootItem);
197 xformProp.append(&xformProp, scaleTransform);
199 scaleTransform = qobject_cast<QQuickScale *>(xformProp.at(&xformProp, 0));
202 if (scaleTransform !=
nullptr) {
203 qreal xScale = width() / d->rootItem->width();
204 qreal yScale = height() / d->rootItem->height();
206 switch (d->fillMode) {
207 case QQuickVectorImage::NoResize:
208 xScale = yScale = 1.0;
210 case QQuickVectorImage::PreserveAspectFit:
211 xScale = yScale = qMin(xScale, yScale);
213 case QQuickVectorImage::PreserveAspectCrop:
214 xScale = yScale = qMax(xScale, yScale);
216 case QQuickVectorImage::Stretch:
221 scaleTransform->setXScale(xScale);
222 scaleTransform->setYScale(yScale);
226void QQuickVectorImage::updateAnimationProperties()
228 Q_D(QQuickVectorImage);
229 if (Q_UNLIKELY(d->rootItem ==
nullptr || d->rootItem->childItems().isEmpty()))
232 QQuickItem *childItem = d->rootItem->childItems().first();
233 if (Q_LIKELY(d->animations !=
nullptr)) {
234 childItem->setProperty(
"loops", d->animations->loops());
235 childItem->setProperty(
"paused", d->animations->paused());
239QQuickVectorImageAnimations *QQuickVectorImage::animations()
241 Q_D(QQuickVectorImage);
242 if (d->animations ==
nullptr) {
243 d->animations =
new QQuickVectorImageAnimations;
244 QQml_setParent_noEvent(d->animations,
this);
245 QObject::connect(d->animations, &QQuickVectorImageAnimations::loopsChanged,
this, &QQuickVectorImage::updateAnimationProperties);
246 QObject::connect(d->animations, &QQuickVectorImageAnimations::pausedChanged,
this, &QQuickVectorImage::updateAnimationProperties);
249 return d->animations;
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
272QQuickVectorImage::FillMode QQuickVectorImage::fillMode()
const
274 Q_D(
const QQuickVectorImage);
278void QQuickVectorImage::setFillMode(FillMode newFillMode)
280 Q_D(QQuickVectorImage);
281 if (d->fillMode == newFillMode)
283 d->fillMode = newFillMode;
284 emit fillModeChanged();
288
289
290
291
292
293
294
295
296
297
298
299
300
302QQuickVectorImage::RendererType QQuickVectorImage::preferredRendererType()
const
304 Q_D(
const QQuickVectorImage);
305 return d->preferredRendererType;
308void QQuickVectorImage::setPreferredRendererType(RendererType newPreferredRendererType)
310 Q_D(QQuickVectorImage);
311 if (d->preferredRendererType == newPreferredRendererType)
313 d->preferredRendererType = newPreferredRendererType;
315 emit preferredRendererTypeChanged();
319
320
321
322
323
324
325
326
327
328
329
330
332bool QQuickVectorImage::asynchronousShapes()
const
334 Q_D(
const QQuickVectorImage);
335 return d->m_asyncShapes;
338void QQuickVectorImage::setAsynchronousShapes(
bool asynchronous)
340 Q_D(QQuickVectorImage);
341 if (d->m_asyncShapes == asynchronous)
343 d->m_asyncShapes = asynchronous;
344 emit asynchronousShapesChanged();
348
349
350
351
352
353
354
355
356
357
358
359
360
361
363bool QQuickVectorImage::assumeTrustedSource()
const
365 Q_D(
const QQuickVectorImage);
366 return d->assumeTrustedSource;
369void QQuickVectorImage::setAssumeTrustedSource(
bool assumeTrustedSource)
371 Q_D(QQuickVectorImage);
372 if (d->assumeTrustedSource == assumeTrustedSource)
374 d->assumeTrustedSource = assumeTrustedSource;
376 emit assumeTrustedSourceChanged();
379void QQuickVectorImage::componentComplete()
381 Q_D(QQuickVectorImage);
382 QQuickItem::componentComplete();
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404int QQuickVectorImageAnimations::loops()
const
409void QQuickVectorImageAnimations::setLoops(
int loops)
411 if (m_loops == loops)
417bool QQuickVectorImageAnimations::paused()
const
422void QQuickVectorImageAnimations::setPaused(
bool paused)
424 if (m_paused == paused)
427 emit pausedChanged();
430void QQuickVectorImageAnimations::restart()
432 QQuickVectorImage *parentVectorImage = qobject_cast<QQuickVectorImage *>(parent());
433 if (Q_UNLIKELY(parentVectorImage ==
nullptr)) {
434 qCWarning(lcQuickVectorImage) << Q_FUNC_INFO <<
"Parent is not a VectorImage";
438 QQuickVectorImagePrivate *d = QQuickVectorImagePrivate::get(parentVectorImage);
440 if (Q_UNLIKELY(d->rootItem ==
nullptr || d->rootItem->childItems().isEmpty()))
443 QQuickItem *childItem = d->rootItem->childItems().first();
444 QMetaObject::invokeMethod(childItem,
"restart");
449#include <moc_qquickvectorimage_p.cpp>
Combined button and popup list for selecting options.