@@ -29,6 +29,7 @@ CroppedImageSizer::CroppedImageSizer()
2929 m_sourceSize(QSize(-1, -1))
3030{
3131 connect(this, &CroppedImageSizer::inputParamsChanged, this, &CroppedImageSizer::calculateSourceSize);
32+ connect(this, &CroppedImageSizer::sourceChanged, this, &CroppedImageSizer::updateImageSize);
3233}
3334
3435CroppedImageSizer::~CroppedImageSizer()
@@ -47,7 +48,7 @@ void CroppedImageSizer::setSource(const QUrl &source)
4748{
4849 if (source != m_source) {
4950 m_source = source;
50− Q_EMIT inputParamsChanged();
51+ Q_EMIT sourceChanged();
5152 }
5253}
5354
@@ -82,43 +83,59 @@ QSize CroppedImageSizer::sourceSize() const
8283 return m_sourceSize;
8384}
8485
85−void CroppedImageSizer::calculateSourceSize()
86+void CroppedImageSizer::setSourceSize(const QSize &sourceSize)
8687{
87− if (m_source.isValid() && m_width > 0 && m_height > 0 && qmlEngine(this) && qmlEngine(this)->networkAccessManager()) {
88− if (m_reply) {
89− m_reply->disconnect();
90− m_reply->abort();
91− m_reply->deleteLater();
92− }
88+ if (sourceSize != m_sourceSize) {
89+ m_sourceSize = sourceSize;
90+ Q_EMIT sourceSizeChanged();
91+ }
92+}
93+
94+void CroppedImageSizer::updateImageSize()
95+{
96+ if (m_reply) {
97+ m_reply->disconnect();
98+ m_reply->abort();
99+ m_reply->deleteLater();
100+ m_reply = nullptr;
101+ }
102+
103+ if (m_source.isValid() && qmlEngine(this) && qmlEngine(this)->networkAccessManager()) {
93104 QNetworkRequest request(m_source);
94105 m_reply = qmlEngine(this)->networkAccessManager()->get(request);
95106 connect(m_reply, &QNetworkReply::finished, this, &CroppedImageSizer::requestFinished);
96− } else if (m_sourceSize != QSize(-1, -1)) {
97− m_sourceSize = QSize(-1, -1);
98− sourceSizeChanged();
107+ } else {
108+ setSourceSize(QSize(-1, -1));
99109 }
100110}
101111
102112void CroppedImageSizer::requestFinished()
103113{
104114 QImageReader m_reader(m_reply);
105− const QSize imageSize = m_reader.size();
106− if (imageSize.isValid()) {
107− if (m_height > 0 && imageSize.height() > 0) {
115+ m_imageSize = m_reader.size();
116+
117+ m_reply->deleteLater();
118+ m_reply = nullptr;
119+
120+ calculateSourceSize();
121+}
122+
123+void CroppedImageSizer::calculateSourceSize()
124+{
125+ if (m_source.isValid() && m_width > 0 && m_height > 0 && !m_reply) {
126+ if (!m_imageSize.isEmpty()) {
108127 const qreal ar = m_width / m_height;
109− const qreal ssar = imageSize.width() / (qreal)imageSize.height();
128+ const qreal ssar = m_imageSize.width() / (qreal)m_imageSize.height();
110129 if (ar > ssar) {
111− m_sourceSize = QSize(m_width, 0);
130+ setSourceSize(QSize(m_width, 0));
112131 } else {
113− m_sourceSize = QSize(0, m_height);
132+ setSourceSize(QSize(0, m_height));
114133 }
134+ } else {
135+ qWarning() << "Invalid size for " << m_source << m_imageSize << m_reply;
136+ setSourceSize(QSize(0, 0));
115137 }
116138 } else {
117− qWarning() << "Could not find size of" << m_source;
118− m_sourceSize = QSize(0, 0);
139+ setSourceSize(QSize(-1, -1));
119140 }
120− sourceSizeChanged();
121−
122− m_reply->deleteLater();
123− m_reply = nullptr;
124141}