4#include <QtCore/qurl.h>
8#include <QtQuickVectorImageGenerator/private/qquickitemgenerator_p.h>
9#include <QtQuickVectorImageGenerator/private/qquickvectorimageglobal_p.h>
10#include <QtCore/qloggingcategory.h>
12#include <private/qquicktranslate_p.h>
13#include <private/qquickanimation_p.h>
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
46 Q_Q(QQuickVectorImage);
47 if (sourceFile == source)
52 emit q->sourceChanged();
57 Q_Q(QQuickVectorImage);
59 if (!q->isComponentComplete())
62 QQmlContext *ctx = qmlContext(q);
63 QUrl resolvedUrl = ctx->resolvedUrl(sourceFile);
64 QString localFile = QQmlFile::urlToLocalFileOrQrc(resolvedUrl);
66 if (localFile.isEmpty())
69 if (rootItem && !retainWhileLoading) {
70 rootItem->deleteLater();
84 QQmlIncubator::IncubationMode mode = asynchronous
85 ? QQmlIncubator::Asynchronous
86 : QQmlIncubator::Synchronous;
88 if (!context || context->engine() != qmlContext(q)->engine())
89 context.reset(
new QQmlContext(qmlContext(q)->engine()));
91 incubator =
new QQuickVectorImageIncubator(mode, context.get(), q);
92 QObject::connect(incubator, &QQuickVectorImageIncubator::statusUpdated, q, &QQuickVectorImage::statusChanged);
93 QObject::connect(incubator, &QQuickVectorImageIncubator::statusUpdated, q, &QQuickVectorImage::updateItem);
95 QQuickVectorImageGenerator::GeneratorFlags flags;
96 if (preferredRendererType == QQuickVectorImage::CurveRenderer)
97 flags.setFlag(QQuickVectorImageGenerator::CurveRenderer);
99 flags.setFlag(QQuickVectorImageGenerator::AssumeTrustedSource);
101 flags.setFlag(QQuickVectorImageGenerator::AsyncShapes);
103 flags.setFlag(QQuickVectorImageGenerator::AsynchronousLoading);
108void QQuickVectorImage::updateItem()
110 Q_D(QQuickVectorImage);
111 if (d->incubator ==
nullptr
112 || d->incubator->object() ==
nullptr
113 || !d->incubator->isReady()) {
117 if (d->rootItem !=
nullptr)
118 d->rootItem->deleteLater();
120 d->rootItem =
new QQuickItem(
this);
121 d->rootItem->setParentItem(
this);
123 QQuickItem *item = qobject_cast<QQuickItem *>(d->incubator->object());
124 if (item ==
nullptr) {
125 qCWarning(lcQuickVectorImage) <<
"QQuickItemGenerator::generateRootItem: Root item not a QQuickItem:"
126 << d->incubator->errors();
130 if (item->width() == 0 || item->height() == 0)
133 d->rootItem->setImplicitWidth(item->width());
134 d->rootItem->setImplicitHeight(item->height());
136 item->setParent(d->rootItem);
137 item->setParentItem(d->rootItem);
139 setImplicitWidth(d->rootItem->width());
140 setImplicitHeight(d->rootItem->height());
142 updateAnimationProperties();
143 updateRootItemScale();
146 static int freezeTime = qEnvironmentVariableIntValue(
"QT_QUICKVECTORIMAGE_FREEZE");
147 if (freezeTime != 0) {
150 animations()->setPaused(
true);
151 const QList<QQuickAbstractAnimation *> anims = d->rootItem->findChildren<QQuickAbstractAnimation *>();
152 for (QQuickAbstractAnimation *anim : anims) {
153 if (anim->group() ==
nullptr)
154 anim->setCurrentTime(freezeTime);
158 d->incubator->disconnect(
this);
159 d->incubator->deleteLater();
160 d->incubator =
nullptr;
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183QQuickVectorImage::QQuickVectorImage(QQuickItem *parent)
184 : QQuickItem(*(
new QQuickVectorImagePrivate), parent)
186 setFlag(QQuickItem::ItemHasContents,
true);
188 QObject::connect(
this, &QQuickItem::widthChanged,
this, &QQuickVectorImage::updateRootItemScale);
189 QObject::connect(
this, &QQuickItem::heightChanged,
this, &QQuickVectorImage::updateRootItemScale);
190 QObject::connect(
this, &QQuickVectorImage::fillModeChanged,
this, &QQuickVectorImage::updateRootItemScale);
193QQuickVectorImage::~QQuickVectorImage()
195 Q_D(QQuickVectorImage);
198 d->incubator =
nullptr;
202
203
204
205
206
207
208
209
210QUrl QQuickVectorImage::source()
const
212 Q_D(
const QQuickVectorImage);
213 return d->sourceFile;
216void QQuickVectorImage::setSource(
const QUrl &source)
218 Q_D(QQuickVectorImage);
219 d->setSource(source);
222void QQuickVectorImage::updateRootItemScale()
224 Q_D(QQuickVectorImage);
226 if (d->rootItem ==
nullptr
227 || qFuzzyIsNull(d->rootItem->width())
228 || qFuzzyIsNull(d->rootItem->height())) {
232 auto xformProp = d->rootItem->transform();
233 QQuickScale *scaleTransform =
nullptr;
234 if (xformProp.count(&xformProp) == 0) {
235 scaleTransform =
new QQuickScale;
236 scaleTransform->setParent(d->rootItem);
237 xformProp.append(&xformProp, scaleTransform);
239 scaleTransform = qobject_cast<QQuickScale *>(xformProp.at(&xformProp, 0));
242 if (scaleTransform !=
nullptr) {
243 qreal xScale = width() / d->rootItem->width();
244 qreal yScale = height() / d->rootItem->height();
246 switch (d->fillMode) {
247 case QQuickVectorImage::NoResize:
248 xScale = yScale = 1.0;
250 case QQuickVectorImage::PreserveAspectFit:
251 xScale = yScale = qMin(xScale, yScale);
253 case QQuickVectorImage::PreserveAspectCrop:
254 xScale = yScale = qMax(xScale, yScale);
256 case QQuickVectorImage::Stretch:
261 scaleTransform->setXScale(xScale);
262 scaleTransform->setYScale(yScale);
266void QQuickVectorImage::updateAnimationProperties()
268 Q_D(QQuickVectorImage);
269 if (Q_UNLIKELY(d->rootItem ==
nullptr || d->rootItem->childItems().isEmpty()))
272 QQuickItem *childItem = d->rootItem->childItems().first();
273 if (Q_LIKELY(d->animations !=
nullptr)) {
274 childItem->setProperty(
"loops", d->animations->loops());
275 childItem->setProperty(
"paused", d->animations->paused());
279QQuickVectorImageAnimations *QQuickVectorImage::animations()
281 Q_D(QQuickVectorImage);
282 if (d->animations ==
nullptr) {
283 d->animations =
new QQuickVectorImageAnimations;
284 QQml_setParent_noEvent(d->animations,
this);
285 QObject::connect(d->animations, &QQuickVectorImageAnimations::loopsChanged,
this, &QQuickVectorImage::updateAnimationProperties);
286 QObject::connect(d->animations, &QQuickVectorImageAnimations::pausedChanged,
this, &QQuickVectorImage::updateAnimationProperties);
289 return d->animations;
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
312QQuickVectorImage::FillMode QQuickVectorImage::fillMode()
const
314 Q_D(
const QQuickVectorImage);
318void QQuickVectorImage::setFillMode(FillMode newFillMode)
320 Q_D(QQuickVectorImage);
321 if (d->fillMode == newFillMode)
323 d->fillMode = newFillMode;
324 emit fillModeChanged();
328
329
330
331
332
333
334
335
336
337
338
339
340
342QQuickVectorImage::RendererType QQuickVectorImage::preferredRendererType()
const
344 Q_D(
const QQuickVectorImage);
345 return d->preferredRendererType;
348void QQuickVectorImage::setPreferredRendererType(RendererType newPreferredRendererType)
350 Q_D(QQuickVectorImage);
351 if (d->preferredRendererType == newPreferredRendererType)
353 d->preferredRendererType = newPreferredRendererType;
355 emit preferredRendererTypeChanged();
359
360
361
362
363
364
365
366
367
368
369
370
371
372
374bool QQuickVectorImage::asynchronousShapes()
const
376 Q_D(
const QQuickVectorImage);
377 return d->m_asyncShapes;
380void QQuickVectorImage::setAsynchronousShapes(
bool asynchronous)
382 Q_D(QQuickVectorImage);
383 if (d->m_asyncShapes == asynchronous)
385 d->m_asyncShapes = asynchronous;
386 emit asynchronousShapesChanged();
390
391
392
393
394
395
396
397
398
399
400
402bool QQuickVectorImage::asynchronous()
const
404 Q_D(
const QQuickVectorImage);
405 return d->asynchronous;
408void QQuickVectorImage::setAsynchronous(
bool asynchronous)
410 Q_D(QQuickVectorImage);
411 if (d->asynchronous == asynchronous)
413 d->asynchronous = asynchronous;
414 emit asynchronousChanged();
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433bool QQuickVectorImage::retainWhileLoading()
const
435 Q_D(
const QQuickVectorImage);
436 return d->retainWhileLoading;
439void QQuickVectorImage::setRetainWhileLoading(
bool retainWhileLoading)
441 Q_D(QQuickVectorImage);
442 if (d->retainWhileLoading == retainWhileLoading)
444 d->retainWhileLoading = retainWhileLoading;
445 emit retainWhileLoadingChanged();
449
450
451
452QQuickVectorImage::Status QQuickVectorImage::status()
const
454 Q_D(
const QQuickVectorImage);
455 if (d->incubator ==
nullptr) {
456 if (d->rootItem ==
nullptr)
459 return Status::Ready;
462 switch (d->incubator->status()) {
463 case QQmlIncubator::Null:
465 case QQmlIncubator::Loading:
466 return Status::Loading;
467 case QQmlIncubator::Error:
468 return Status::Error;
469 case QQmlIncubator::Ready:
470 return Status::Ready;
473 return Status::Error;
477
478
479
480
481
482
483
484
485
486
487
488
489
490
492bool QQuickVectorImage::assumeTrustedSource()
const
494 Q_D(
const QQuickVectorImage);
495 return d->assumeTrustedSource;
498void QQuickVectorImage::setAssumeTrustedSource(
bool assumeTrustedSource)
500 Q_D(QQuickVectorImage);
501 if (d->assumeTrustedSource == assumeTrustedSource)
503 d->assumeTrustedSource = assumeTrustedSource;
505 emit assumeTrustedSourceChanged();
508void QQuickVectorImage::componentComplete()
510 Q_D(QQuickVectorImage);
511 QQuickItem::componentComplete();
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533int QQuickVectorImageAnimations::loops()
const
538void QQuickVectorImageAnimations::setLoops(
int loops)
540 if (m_loops == loops)
546bool QQuickVectorImageAnimations::paused()
const
551void QQuickVectorImageAnimations::setPaused(
bool paused)
553 if (m_paused == paused)
556 emit pausedChanged();
559void QQuickVectorImageAnimations::restart()
561 QQuickVectorImage *parentVectorImage = qobject_cast<QQuickVectorImage *>(parent());
562 if (Q_UNLIKELY(parentVectorImage ==
nullptr)) {
563 qCWarning(lcQuickVectorImage) << Q_FUNC_INFO <<
"Parent is not a VectorImage";
567 QQuickVectorImagePrivate *d = QQuickVectorImagePrivate::get(parentVectorImage);
569 if (Q_UNLIKELY(d->rootItem ==
nullptr || d->rootItem->childItems().isEmpty()))
572 QQuickItem *childItem = d->rootItem->childItems().first();
573 QMetaObject::invokeMethod(childItem,
"restart");
578#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.