From 8d08409f59a9dbc1d83600431301b7900dd0a9aa Mon Sep 17 00:00:00 2001 From: Samuel Ghinet Date: Wed, 14 Dec 2022 17:09:08 +0200 Subject: [PATCH] QmlDesigner fix: do not automatically open example project on download The user might click several example thumbnails, quickly one after another. This would normally issue multiple "open project" requests, and at the end the user doesn't know which of them actually opened. This might also potentially end up in a crash to someone. Fixed this by no longer opening the project automatically on open. Also, added a close button, on the progress bar for the downloading process, which the user can use to cancel an ongoing download. This would be helpful if the example project was opened by mistake, and the project is quite big. Task-number: QDS-7845 Change-Id: Ica3105aac77b8eb01c888f08050bd542599794f9 Reviewed-by: Qt CI Bot Reviewed-by: Miikka Heikkinen Reviewed-by: Thomas Hartmann --- src/plugins/studiowelcome/examplecheckout.cpp | 33 +++++++++++++------ src/plugins/studiowelcome/examplecheckout.h | 5 +++ 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/plugins/studiowelcome/examplecheckout.cpp b/src/plugins/studiowelcome/examplecheckout.cpp index da19fd7c5f4..7ed1ff674fe 100644 --- a/src/plugins/studiowelcome/examplecheckout.cpp +++ b/src/plugins/studiowelcome/examplecheckout.cpp @@ -76,13 +76,13 @@ void FileDownloader::start() auto request = QNetworkRequest(m_url); request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::UserVerifiedRedirectPolicy); - QNetworkReply *reply = Utils::NetworkAccessManager::instance()->get(request); + m_reply = Utils::NetworkAccessManager::instance()->get(request); - QNetworkReply::connect(reply, &QNetworkReply::readyRead, this, [this, reply]() { - m_tempFile.write(reply->readAll()); + QNetworkReply::connect(m_reply, &QNetworkReply::readyRead, this, [this]() { + m_tempFile.write(m_reply->readAll()); }); - QNetworkReply::connect(reply, + QNetworkReply::connect(m_reply, &QNetworkReply::downloadProgress, this, [this](qint64 current, qint64 max) { @@ -93,16 +93,21 @@ void FileDownloader::start() emit progressChanged(); }); - QNetworkReply::connect(reply, &QNetworkReply::redirected, [reply](const QUrl &) { - emit reply->redirectAllowed(); + QNetworkReply::connect(m_reply, &QNetworkReply::redirected, [this](const QUrl &) { + emit m_reply->redirectAllowed(); }); - QNetworkReply::connect(reply, &QNetworkReply::finished, this, [this, reply]() { - if (reply->error()) { + QNetworkReply::connect(m_reply, &QNetworkReply::finished, this, [this]() { + if (m_reply->error()) { if (m_tempFile.exists()) m_tempFile.remove(); - qWarning() << Q_FUNC_INFO << m_url << reply->errorString(); - emit downloadFailed(); + + if (m_reply->error() != QNetworkReply::OperationCanceledError) { + qWarning() << Q_FUNC_INFO << m_url << m_reply->errorString(); + emit downloadFailed(); + } else { + emit downloadCanceled(); + } } else { m_tempFile.flush(); m_tempFile.close(); @@ -110,9 +115,17 @@ void FileDownloader::start() emit tempFileChanged(); emit finishedChanged(); } + + m_reply = nullptr; }); } +void FileDownloader::cancel() +{ + if (m_reply) + m_reply->abort(); +} + void FileDownloader::setUrl(const QUrl &url) { m_url = url; diff --git a/src/plugins/studiowelcome/examplecheckout.h b/src/plugins/studiowelcome/examplecheckout.h index 7e7a0dff882..8c1446518c9 100644 --- a/src/plugins/studiowelcome/examplecheckout.h +++ b/src/plugins/studiowelcome/examplecheckout.h @@ -112,6 +112,7 @@ public: bool available() const; Q_INVOKABLE void start(); + Q_INVOKABLE void cancel(); signals: void finishedChanged(); @@ -123,6 +124,8 @@ signals: void lastModifiedChanged(); void availableChanged(); + void downloadCanceled(); + private: void probeUrl(); @@ -133,6 +136,8 @@ private: QFile m_tempFile; QDateTime m_lastModified; bool m_available = false; + + QNetworkReply *m_reply = nullptr; }; class DataModelDownloader : public QObject