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 <qt_ci_bot@qt-project.org>
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Samuel Ghinet
2022-12-14 17:09:08 +02:00
parent 7e5ecfe8bc
commit 8d08409f59
2 changed files with 28 additions and 10 deletions

View File

@@ -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();
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;

View File

@@ -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