diff options
author | Vladimir Belyavsky <belyavskyv@gmail.com> | 2022-12-19 17:03:02 +0300 |
---|---|---|
committer | Vladimir Belyavsky <belyavskyv@gmail.com> | 2023-05-30 09:49:40 +0300 |
commit | 69eb6ec2888ccec6dc3b4ed9867673d1131bfcef (patch) | |
tree | 4d96576b61233bb376ee65f935a0b9763a9146ac | |
parent | b982c2146cd729e8dbfc41c33b3022b6ef702e94 (diff) |
QQuickImageBasePrivate: introduce setStatus() and setProgress()
and use it wherever applicable to make the code more clear
Change-Id: I0df96ca9ea58a7401bf60c9f9a43cad20ca1bdb0
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
-rw-r--r-- | src/quick/items/qquickanimatedimage.cpp | 38 | ||||
-rw-r--r-- | src/quick/items/qquickborderimage.cpp | 31 | ||||
-rw-r--r-- | src/quick/items/qquickimage.cpp | 6 | ||||
-rw-r--r-- | src/quick/items/qquickimagebase.cpp | 66 | ||||
-rw-r--r-- | src/quick/items/qquickimagebase_p_p.h | 3 |
5 files changed, 58 insertions, 86 deletions
diff --git a/src/quick/items/qquickanimatedimage.cpp b/src/quick/items/qquickanimatedimage.cpp index e4bc156a30..84ffd89db7 100644 --- a/src/quick/items/qquickanimatedimage.cpp +++ b/src/quick/items/qquickanimatedimage.cpp @@ -287,10 +287,7 @@ void QQuickAnimatedImage::load() Q_D(QQuickAnimatedImage); if (d->url.isEmpty()) { - if (d->progress != 0) { - d->progress = 0; - emit progressChanged(d->progress); - } + d->setProgress(0); d->setImage(QImage()); if (sourceSize() != d->oldSourceSize) { @@ -298,9 +295,7 @@ void QQuickAnimatedImage::load() emit sourceSizeChanged(); } - d->status = Null; - emit statusChanged(d->status); - + d->setStatus(Null); if (isPlaying() != d->oldPlaying) emit playingChanged(); } else { @@ -313,19 +308,15 @@ void QQuickAnimatedImage::load() resolve2xLocalFile(resolvedUrl, targetDevicePixelRatio, &loadUrl, &d->devicePixelRatio); QString lf = QQmlFile::urlToLocalFileOrQrc(loadUrl); + d->status = Null; // reset status, no emit + if (!lf.isEmpty()) { d->setMovie(new QMovie(lf)); movieRequestFinished(); } else { #if QT_CONFIG(qml_network) - if (d->status != Loading) { - d->status = Loading; - emit statusChanged(d->status); - } - if (d->progress != 0) { - d->progress = 0; - emit progressChanged(d->progress); - } + d->setStatus(Loading); + d->setProgress(0); QNetworkRequest req(d->url); req.setAttribute(QNetworkRequest::HttpPipeliningAllowedAttribute, true); @@ -373,13 +364,8 @@ void QQuickAnimatedImage::movieRequestFinished() emit sourceSizeChanged(); } - if (d->progress != 0) { - d->progress = 0; - emit progressChanged(d->progress); - } - - d->status = Error; - emit statusChanged(d->status); + d->setProgress(0); + d->setStatus(Error); if (isPlaying() != d->oldPlaying) emit playingChanged(); @@ -392,10 +378,7 @@ void QQuickAnimatedImage::movieRequestFinished() d->movie->setCacheMode(QMovie::CacheAll); d->movie->setSpeed(qRound(d->speed * 100.0)); - if (d->progress != 1.0) { - d->progress = 1.0; - emit progressChanged(d->progress); - } + d->setProgress(1); bool pausedAtStart = d->paused; if (d->movie && d->playing) @@ -416,8 +399,7 @@ void QQuickAnimatedImage::movieRequestFinished() } } - d->status = Ready; - emit statusChanged(d->status); + d->setStatus(Ready); if (isPlaying() != d->oldPlaying) emit playingChanged(); diff --git a/src/quick/items/qquickborderimage.cpp b/src/quick/items/qquickborderimage.cpp index 04228168f7..628676a64b 100644 --- a/src/quick/items/qquickborderimage.cpp +++ b/src/quick/items/qquickborderimage.cpp @@ -280,16 +280,13 @@ void QQuickBorderImage::load() setGridScaledImage(QQuickGridScaledImage(&file)); } else { #if QT_CONFIG(qml_network) - if (d->progress != 0.0) { - d->progress = 0.0; - emit progressChanged(d->progress); - } - d->status = Loading; + d->setProgress(0); + d->setStatus(Loading); + QNetworkRequest req(d->url); d->sciReply = qmlEngine(this)->networkAccessManager()->get(req); qmlobject_connect(d->sciReply, QNetworkReply, SIGNAL(finished()), this, QQuickBorderImage, SLOT(sciRequestFinished())); - emit statusChanged(d->status); #endif } } else { @@ -382,8 +379,7 @@ void QQuickBorderImage::setGridScaledImage(const QQuickGridScaledImage& sci) { Q_D(QQuickBorderImage); if (!sci.isValid()) { - d->status = Error; - emit statusChanged(d->status); + d->setStatus(Error); } else { QQuickScaleGrid *sg = border(); sg->setTop(sci.gridTop()); @@ -404,22 +400,16 @@ void QQuickBorderImage::requestFinished() QSize impsize = d->pix.implicitSize(); if (d->pix.isError()) { - d->status = Error; qmlWarning(this) << d->pix.error(); - if (d->progress != 0) { - d->progress = 0; - emit progressChanged(d->progress); - } + d->setStatus(Error); + d->setProgress(0); } else { - d->status = Ready; - if (d->progress != 1.0) { - d->progress = 1.0; - emit progressChanged(d->progress); - } + d->setStatus(Ready); + d->setProgress(1); } setImplicitSize(impsize.width() / d->devicePixelRatio, impsize.height() / d->devicePixelRatio); - emit statusChanged(d->status); + if (sourceSize() != d->oldSourceSize) { d->oldSourceSize = sourceSize(); emit sourceSizeChanged(); @@ -451,10 +441,9 @@ void QQuickBorderImage::sciRequestFinished() d->redirectCount=0; if (d->sciReply->error() != QNetworkReply::NoError) { - d->status = Error; + d->setStatus(Error); d->sciReply->deleteLater(); d->sciReply = nullptr; - emit statusChanged(d->status); } else { QQuickGridScaledImage sci(d->sciReply); d->sciReply->deleteLater(); diff --git a/src/quick/items/qquickimage.cpp b/src/quick/items/qquickimage.cpp index 9523b838f4..99852d0b11 100644 --- a/src/quick/items/qquickimage.cpp +++ b/src/quick/items/qquickimage.cpp @@ -219,10 +219,7 @@ void QQuickImagePrivate::setImage(const QImage &image) { Q_Q(QQuickImage); pix.setImage(image); - q->pixmapChange(); - status = pix.isNull() ? QQuickImageBase::Null : QQuickImageBase::Ready; - q->update(); } @@ -230,10 +227,7 @@ void QQuickImagePrivate::setPixmap(const QQuickPixmap &pixmap) { Q_Q(QQuickImage); pix.setPixmap(pixmap); - q->pixmapChange(); - status = pix.isNull() ? QQuickImageBase::Null : QQuickImageBase::Ready; - q->update(); } diff --git a/src/quick/items/qquickimagebase.cpp b/src/quick/items/qquickimagebase.cpp index 78dfecc42a..7d35252129 100644 --- a/src/quick/items/qquickimagebase.cpp +++ b/src/quick/items/qquickimagebase.cpp @@ -41,6 +41,28 @@ bool QQuickImageBasePrivate::updateDevicePixelRatio(qreal targetDevicePixelRatio return setDevicePixelRatio; } +void QQuickImageBasePrivate::setStatus(QQuickImageBase::Status value) +{ + Q_Q(QQuickImageBase); + + if (status == value) + return; + + status = value; + emit q->statusChanged(status); +} + +void QQuickImageBasePrivate::setProgress(qreal value) +{ + Q_Q(QQuickImageBase); + + if (qFuzzyCompare(progress, value)) + return; + + progress = value; + emit q->progressChanged(progress); +} + QQuickImageBase::QQuickImageBase(QQuickItem *parent) : QQuickImplicitSizeItem(*(new QQuickImageBasePrivate), parent) { @@ -63,14 +85,12 @@ QQuickImageBase::Status QQuickImageBase::status() const return d->status; } - qreal QQuickImageBase::progress() const { Q_D(const QQuickImageBase); return d->progress; } - bool QQuickImageBase::asynchronous() const { Q_D(const QQuickImageBase); @@ -253,15 +273,11 @@ void QQuickImageBase::loadEmptyUrl() { Q_D(QQuickImageBase); d->pix.clear(this); - if (d->progress != 0.0) { - d->progress = 0.0; - emit progressChanged(d->progress); - } - d->status = Null; + d->setProgress(0); + d->setStatus(Null); setImplicitSize(0, 0); // also called in QQuickImageBase::pixmapChange, but not QQuickImage/QQuickBorderImage overrides pixmapChange(); // This calls update() in QQuickBorderImage and QQuickImage, not in QQuickImageBase... - emit statusChanged(d->status); if (sourceSize() != d->oldSourceSize) { d->oldSourceSize = sourceSize(); emit sourceSizeChanged(); @@ -304,6 +320,8 @@ void QQuickImageBase::loadPixmap(const QUrl &url, LoadPixmapOptions loadOptions) } } + d->status = Null; // reset status, no emit + d->pix.load(qmlEngine(this), loadUrl, d->sourceClipRect.toRect(), @@ -314,14 +332,8 @@ void QQuickImageBase::loadPixmap(const QUrl &url, LoadPixmapOptions loadOptions) d->devicePixelRatio); if (d->pix.isLoading()) { - if (d->progress != 0.0) { - d->progress = 0.0; - emit progressChanged(d->progress); - } - if (d->status != Loading) { - d->status = Loading; - emit statusChanged(d->status); - } + d->setProgress(0); + d->setStatus(Loading); static int thisRequestProgress = -1; static int thisRequestFinished = -1; @@ -359,20 +371,14 @@ void QQuickImageBase::requestFinished() if (d->pix.isError()) { qmlWarning(this) << d->pix.error(); d->pix.clear(this); - d->status = Error; - if (d->progress != 0.0) { - d->progress = 0.0; - emit progressChanged(d->progress); - } + d->setStatus(Error); + d->setProgress(0); } else { - d->status = Ready; - if (d->progress != 1.0) { - d->progress = 1.0; - emit progressChanged(d->progress); - } + d->setStatus(Ready); + d->setProgress(1); } pixmapChange(); - emit statusChanged(d->status); + if (sourceSize() != d->oldSourceSize) { d->oldSourceSize = sourceSize(); emit sourceSizeChanged(); @@ -396,10 +402,8 @@ void QQuickImageBase::requestFinished() void QQuickImageBase::requestProgress(qint64 received, qint64 total) { Q_D(QQuickImageBase); - if (d->status == Loading && total > 0) { - d->progress = qreal(received)/total; - emit progressChanged(d->progress); - } + if (d->status == Loading && total > 0) + d->setProgress(qreal(received) / total); } void QQuickImageBase::itemChange(ItemChange change, const ItemChangeData &value) diff --git a/src/quick/items/qquickimagebase_p_p.h b/src/quick/items/qquickimagebase_p_p.h index 04113da181..7f8cae501b 100644 --- a/src/quick/items/qquickimagebase_p_p.h +++ b/src/quick/items/qquickimagebase_p_p.h @@ -44,6 +44,9 @@ public: virtual bool updateDevicePixelRatio(qreal targetDevicePixelRatio); + void setStatus(QQuickImageBase::Status value); + void setProgress(qreal value); + QQuickPixmap pix; QQuickImageBase::Status status; QUrl url; |