@@ -30,6 +30,7 @@ CroppedImageSizer::CroppedImageSizer()
3030 m_worker(nullptr)
3131{
3232 connect(this, &CroppedImageSizer::inputParamsChanged, this, &CroppedImageSizer::calculateSourceSize);
33+ connect(this, &CroppedImageSizer::sourceChanged, this, &CroppedImageSizer::updateImageSize);
3334}
3435
3536CroppedImageSizer::~CroppedImageSizer()
@@ -48,7 +49,7 @@ void CroppedImageSizer::setSource(const QUrl &source)
4849{
4950 if (source != m_source) {
5051 m_source = source;
51− Q_EMIT inputParamsChanged();
52+ Q_EMIT sourceChanged();
5253 }
5354}
5455
@@ -91,18 +92,47 @@ void CroppedImageSizer::setSourceSize(const QSize &size)
9192 }
9293}
9394
94−void CroppedImageSizer::calculateSourceSize()
95+void CroppedImageSizer::setImageSize(const QSize &imageSize)
9596{
96− if (m_source.isValid() && m_width > 0 && m_height > 0 && qmlEngine(this) && qmlEngine(this)->networkAccessManager()) {
97− if (m_worker) {
98− m_worker->abort();
99− }
97+ if (imageSize != m_imageSize) {
98+ m_imageSize = imageSize;
99+ m_worker = nullptr;
100+ calculateSourceSize();
101+ }
102+}
103+
104+void CroppedImageSizer::updateImageSize()
105+{
106+ if (m_worker) {
107+ m_worker->abort();
108+ m_worker = nullptr;
109+ }
100110
111+ if (m_source.isValid() && qmlEngine(this) && qmlEngine(this)->networkAccessManager()) {
101112 QNetworkRequest request(m_source);
102113 QNetworkReply *reply = qmlEngine(this)->networkAccessManager()->get(request);
103114 m_worker = new CroppedImageSizerAsyncWorker(this, reply);
104− } else if (m_sourceSize != QSize(-1, -1)) {
105− m_sourceSize = QSize(-1, -1);
106− sourceSizeChanged();
115+ } else {
116+ setSourceSize(QSize(-1, -1));
117+ }
118+}
119+
120+void CroppedImageSizer::calculateSourceSize()
121+{
122+ if (m_source.isValid() && m_width > 0 && m_height > 0 && !m_worker) {
123+ if (!m_imageSize.isEmpty()) {
124+ const qreal ar = m_width / m_height;
125+ const qreal ssar = m_imageSize.width() / (qreal)m_imageSize.height();
126+ if (ar > ssar) {
127+ setSourceSize(QSize(m_width, 0));
128+ } else {
129+ setSourceSize(QSize(0, m_height));
130+ }
131+ } else {
132+ qWarning() << "Invalid size for " << m_source << m_imageSize;
133+ setSourceSize(QSize(0, 0));
134+ }
135+ } else {
136+ setSourceSize(QSize(-1, -1));
107137 }
108138}