4#include <QtCore/qurl.h>
5#include <QtCore/QScopeGuard>
9#include <QtQuickVectorImageGenerator/private/qquickitemgenerator_p.h>
10#include <QtQuickVectorImageGenerator/private/qquickvectorimageglobal_p.h>
11#include <QtCore/qloggingcategory.h>
13#include <private/qquicktranslate_p.h>
14#include <private/qquickanimation_p.h>
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
47 Q_Q(QQuickVectorImage);
48 if (sourceFile == source)
53 emit q->sourceChanged();
58 Q_Q(QQuickVectorImage);
60 if (!q->isComponentComplete())
63 QQmlContext *ctx = qmlContext(q);
64 QUrl resolvedUrl = ctx->resolvedUrl(sourceFile);
65 QString localFile = QQmlFile::urlToLocalFileOrQrc(resolvedUrl);
67 if (localFile.isEmpty())
70 if (rootItem && !retainWhileLoading) {
71 rootItem->deleteLater();
73 emit q->generatedItemChanged();
86 QQmlIncubator::IncubationMode mode = asynchronous
87 ? QQmlIncubator::Asynchronous
88 : QQmlIncubator::Synchronous;
90 if (!context || context->engine() != qmlContext(q)->engine())
91 context.reset(
new QQmlContext(qmlContext(q)->engine()));
93 incubator =
new QQuickVectorImageIncubator(mode, context.get(), q);
94 QObject::connect(incubator, &QQuickVectorImageIncubator::statusUpdated, q, &QQuickVectorImage::statusChanged);
95 QObject::connect(incubator, &QQuickVectorImageIncubator::statusUpdated, q, &QQuickVectorImage::updateItem);
97 QQuickVectorImageGenerator::GeneratorFlags flags;
98 if (preferredRendererType == QQuickVectorImage::CurveRenderer)
99 flags.setFlag(QQuickVectorImageGenerator::CurveRenderer);
101 flags.setFlag(QQuickVectorImageGenerator::AssumeTrustedSource);
103 flags.setFlag(QQuickVectorImageGenerator::AsyncShapes);
105 flags.setFlag(QQuickVectorImageGenerator::AsynchronousLoading);
110void QQuickVectorImage::updateItem()
112 Q_D(QQuickVectorImage);
113 if (d->incubator ==
nullptr
114 || d->incubator->object() ==
nullptr
115 || !d->incubator->isReady()) {
119 if (d->rootItem !=
nullptr)
120 d->rootItem->deleteLater();
122 d->rootItem =
new QQuickItem(
this);
123 d->rootItem->setParentItem(
this);
124 auto emitter = qScopeGuard([&] { emit generatedItemChanged(); });
126 QQuickItem *item = qobject_cast<QQuickItem *>(d->incubator->object());
127 if (item ==
nullptr) {
128 qCWarning(lcQuickVectorImage) <<
"QQuickItemGenerator::generateRootItem: Root item not a QQuickItem:"
129 << d->incubator->errors();
133 if (item->width() == 0 || item->height() == 0)
136 d->rootItem->setImplicitWidth(item->width());
137 d->rootItem->setImplicitHeight(item->height());
139 item->setParent(d->rootItem);
140 item->setParentItem(d->rootItem);
142 setImplicitWidth(d->rootItem->width());
143 setImplicitHeight(d->rootItem->height());
145 updateAnimationProperties();
146 updateRootItemScale();
149 static int freezeTime = qEnvironmentVariableIntValue(
"QT_QUICKVECTORIMAGE_FREEZE");
150 if (freezeTime != 0) {
153 animations()->setPaused(
true);
154 const QList<QQuickAbstractAnimation *> anims = d->rootItem->findChildren<QQuickAbstractAnimation *>();
155 for (QQuickAbstractAnimation *anim : anims) {
156 if (anim->group() ==
nullptr)
157 anim->setCurrentTime(freezeTime);
161 d->incubator->disconnect(
this);
162 d->incubator->deleteLater();
163 d->incubator =
nullptr;
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186QQuickVectorImage::QQuickVectorImage(QQuickItem *parent)
187 : QQuickItem(*(
new QQuickVectorImagePrivate), parent)
189 setFlag(QQuickItem::ItemHasContents,
true);
191 QObject::connect(
this, &QQuickItem::widthChanged,
this, &QQuickVectorImage::updateRootItemScale);
192 QObject::connect(
this, &QQuickItem::heightChanged,
this, &QQuickVectorImage::updateRootItemScale);
193 QObject::connect(
this, &QQuickVectorImage::fillModeChanged,
this, &QQuickVectorImage::updateRootItemScale);
196QQuickVectorImage::~QQuickVectorImage()
198 Q_D(QQuickVectorImage);
201 d->incubator =
nullptr;
205
206
207
208
209
210
211
212
213QUrl QQuickVectorImage::source()
const
215 Q_D(
const QQuickVectorImage);
216 return d->sourceFile;
219void QQuickVectorImage::setSource(
const QUrl &source)
221 Q_D(QQuickVectorImage);
222 d->setSource(source);
225void QQuickVectorImage::updateRootItemScale()
227 Q_D(QQuickVectorImage);
229 if (d->rootItem ==
nullptr
230 || qFuzzyIsNull(d->rootItem->width())
231 || qFuzzyIsNull(d->rootItem->height())) {
235 auto xformProp = d->rootItem->transform();
236 QQuickScale *scaleTransform =
nullptr;
237 if (xformProp.count(&xformProp) == 0) {
238 scaleTransform =
new QQuickScale;
239 scaleTransform->setParent(d->rootItem);
240 xformProp.append(&xformProp, scaleTransform);
242 scaleTransform = qobject_cast<QQuickScale *>(xformProp.at(&xformProp, 0));
245 if (scaleTransform !=
nullptr) {
246 qreal xScale = width() / d->rootItem->width();
247 qreal yScale = height() / d->rootItem->height();
249 switch (d->fillMode) {
250 case QQuickVectorImage::NoResize:
251 xScale = yScale = 1.0;
253 case QQuickVectorImage::PreserveAspectFit:
254 xScale = yScale = qMin(xScale, yScale);
256 case QQuickVectorImage::PreserveAspectCrop:
257 xScale = yScale = qMax(xScale, yScale);
259 case QQuickVectorImage::Stretch:
264 scaleTransform->setXScale(xScale);
265 scaleTransform->setYScale(yScale);
269void QQuickVectorImage::updateAnimationProperties()
271 Q_D(QQuickVectorImage);
272 if (Q_UNLIKELY(d->rootItem ==
nullptr || d->rootItem->childItems().isEmpty()))
275 QQuickItem *childItem = d->rootItem->childItems().first();
276 if (Q_LIKELY(d->animations !=
nullptr)) {
277 childItem->setProperty(
"loops", d->animations->loops());
278 childItem->setProperty(
"paused", d->animations->paused());
282QQuickVectorImageAnimations *QQuickVectorImage::animations()
284 Q_D(QQuickVectorImage);
285 if (d->animations ==
nullptr) {
286 d->animations =
new QQuickVectorImageAnimations;
287 QQml_setParent_noEvent(d->animations,
this);
288 QObject::connect(d->animations, &QQuickVectorImageAnimations::loopsChanged,
this, &QQuickVectorImage::updateAnimationProperties);
289 QObject::connect(d->animations, &QQuickVectorImageAnimations::pausedChanged,
this, &QQuickVectorImage::updateAnimationProperties);
292 return d->animations;
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
315QQuickVectorImage::FillMode QQuickVectorImage::fillMode()
const
317 Q_D(
const QQuickVectorImage);
321void QQuickVectorImage::setFillMode(FillMode newFillMode)
323 Q_D(QQuickVectorImage);
324 if (d->fillMode == newFillMode)
326 d->fillMode = newFillMode;
327 emit fillModeChanged();
331
332
333
334
335
336
337
338
339
340
341
342
343
345QQuickVectorImage::RendererType QQuickVectorImage::preferredRendererType()
const
347 Q_D(
const QQuickVectorImage);
348 return d->preferredRendererType;
351void QQuickVectorImage::setPreferredRendererType(RendererType newPreferredRendererType)
353 Q_D(QQuickVectorImage);
354 if (d->preferredRendererType == newPreferredRendererType)
356 d->preferredRendererType = newPreferredRendererType;
358 emit preferredRendererTypeChanged();
362
363
364
365
366
367
368
369
370
371
372
373
374
375
377bool QQuickVectorImage::asynchronousShapes()
const
379 Q_D(
const QQuickVectorImage);
380 return d->m_asyncShapes;
383void QQuickVectorImage::setAsynchronousShapes(
bool asynchronous)
385 Q_D(QQuickVectorImage);
386 if (d->m_asyncShapes == asynchronous)
388 d->m_asyncShapes = asynchronous;
389 emit asynchronousShapesChanged();
393
394
395
396
397
398
399
400
401
402
403
405bool QQuickVectorImage::asynchronous()
const
407 Q_D(
const QQuickVectorImage);
408 return d->asynchronous;
411void QQuickVectorImage::setAsynchronous(
bool asynchronous)
413 Q_D(QQuickVectorImage);
414 if (d->asynchronous == asynchronous)
416 d->asynchronous = asynchronous;
417 emit asynchronousChanged();
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436bool QQuickVectorImage::retainWhileLoading()
const
438 Q_D(
const QQuickVectorImage);
439 return d->retainWhileLoading;
442void QQuickVectorImage::setRetainWhileLoading(
bool retainWhileLoading)
444 Q_D(QQuickVectorImage);
445 if (d->retainWhileLoading == retainWhileLoading)
447 d->retainWhileLoading = retainWhileLoading;
448 emit retainWhileLoadingChanged();
452
453
454
455QQuickVectorImage::Status QQuickVectorImage::status()
const
457 Q_D(
const QQuickVectorImage);
458 if (d->incubator ==
nullptr) {
459 if (d->rootItem ==
nullptr)
462 return Status::Ready;
465 switch (d->incubator->status()) {
466 case QQmlIncubator::Null:
468 case QQmlIncubator::Loading:
469 return Status::Loading;
470 case QQmlIncubator::Error:
471 return Status::Error;
472 case QQmlIncubator::Ready:
473 return Status::Ready;
476 return Status::Error;
480
481
482
483
484
485
486
487
488
489
490
491
492
493
495bool QQuickVectorImage::assumeTrustedSource()
const
497 Q_D(
const QQuickVectorImage);
498 return d->assumeTrustedSource;
501void QQuickVectorImage::setAssumeTrustedSource(
bool assumeTrustedSource)
503 Q_D(QQuickVectorImage);
504 if (d->assumeTrustedSource == assumeTrustedSource)
506 d->assumeTrustedSource = assumeTrustedSource;
508 emit assumeTrustedSourceChanged();
512
513
514
515
516
517
518
520QQuickItem *QQuickVectorImage::generatedItem()
const
522 Q_D(
const QQuickVectorImage);
523 return d->rootItem ? d->rootItem->childItems().value(0) :
nullptr;
526void QQuickVectorImage::componentComplete()
528 Q_D(QQuickVectorImage);
529 QQuickItem::componentComplete();
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551int QQuickVectorImageAnimations::loops()
const
556void QQuickVectorImageAnimations::setLoops(
int loops)
558 if (m_loops == loops)
564bool QQuickVectorImageAnimations::paused()
const
569void QQuickVectorImageAnimations::setPaused(
bool paused)
571 if (m_paused == paused)
574 emit pausedChanged();
577void QQuickVectorImageAnimations::restart()
579 QQuickVectorImage *parentVectorImage = qobject_cast<QQuickVectorImage *>(parent());
580 if (Q_UNLIKELY(parentVectorImage ==
nullptr)) {
581 qCWarning(lcQuickVectorImage) << Q_FUNC_INFO <<
"Parent is not a VectorImage";
585 QQuickVectorImagePrivate *d = QQuickVectorImagePrivate::get(parentVectorImage);
587 if (Q_UNLIKELY(d->rootItem ==
nullptr || d->rootItem->childItems().isEmpty()))
590 QQuickItem *childItem = d->rootItem->childItems().first();
591 QMetaObject::invokeMethod(childItem,
"restart");
596#include <moc_qquickvectorimage_p.cpp>
void setSource(const QUrl &source)
\qmlmodule QtQuick.VectorImage \title Qt Quick Vector Image QML Types
QQuickVectorImageIncubator * incubator
Combined button and popup list for selecting options.