aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVladimir Belyavsky <belyavskyv@gmail.com>2022-12-19 17:03:02 +0300
committerVladimir Belyavsky <belyavskyv@gmail.com>2023-05-30 09:49:40 +0300
commit69eb6ec2888ccec6dc3b4ed9867673d1131bfcef (patch)
tree4d96576b61233bb376ee65f935a0b9763a9146ac
parentb982c2146cd729e8dbfc41c33b3022b6ef702e94 (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.cpp38
-rw-r--r--src/quick/items/qquickborderimage.cpp31
-rw-r--r--src/quick/items/qquickimage.cpp6
-rw-r--r--src/quick/items/qquickimagebase.cpp66
-rw-r--r--src/quick/items/qquickimagebase_p_p.h3
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;