From 2abc76e3117abb2fdde607a2ca2869728e71a5aa Mon Sep 17 00:00:00 2001 From: Luca Beltrame Date: Sun, 23 Aug 2015 12:04:52 +0200 Subject: [PATCH] Make the file save dialog async Too often I got hangs because of the nested event loop started by exec(): therefore everything is moved to a QPointer-guarded QFileDialog pointer which is then used asynchronously. --- src/mainwindow.cpp | 51 ++++++++++++++++++++-------------------------- 1 file changed, 22 insertions(+), 29 deletions(-) diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 3f93f3b..7fcee46 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -478,24 +479,27 @@ void DanbooruMainWindow::slotHandleDownload(const QUrl &url, const QVariant tags QStringList tagList = tags.toStringList(); + KIO::MimetypeJob *mimeJob = KIO::mimetype(url, KIO::HideProgressInfo); QString remoteFile = url.fileName(); - QFileDialog saveDialog(this); - saveDialog.setAcceptMode(QFileDialog::AcceptSave); - saveDialog.setFileMode(QFileDialog::AnyFile); - saveDialog.setDirectory(QStandardPaths::writableLocation(QStandardPaths::PicturesLocation)); - saveDialog.setOption(QFileDialog::DontConfirmOverwrite, false); + QPointer saveDialog = new QFileDialog(this, i18n("Save image")); + + saveDialog->setAcceptMode(QFileDialog::AcceptSave); + saveDialog->setFileMode(QFileDialog::AnyFile); + saveDialog->setDirectory(QStandardPaths::writableLocation(QStandardPaths::PicturesLocation)); + saveDialog->setOption(QFileDialog::DontConfirmOverwrite, false); QStringList filters; if (mimeJob->exec()) { filters << mimeJob->mimetype(); - saveDialog.setMimeTypeFilters(filters); + saveDialog->setMimeTypeFilters(filters); } else { + filters.reserve(2); filters << "Images (*.png *.gif *.jpg)" << "All files (*.*)"; - saveDialog.setNameFilters(filters); + saveDialog->setNameFilters(filters); } // Prevent invalid characters (":" can be a tag in Danbooru) @@ -503,10 +507,14 @@ void DanbooruMainWindow::slotHandleDownload(const QUrl &url, const QVariant tags remoteFile.replace(":", "_"); } - saveDialog.selectFile(remoteFile); + saveDialog->selectFile(remoteFile); + saveDialog->open(); - if (saveDialog.exec()) { - QUrl localFile = saveDialog.selectedUrls().first(); + connect(saveDialog, &QFileDialog::finished, [this, tagList, saveDialog, url](int result) { + + if (result) { + + QUrl localFile = saveDialog->selectedUrls().at(0); if (!localFile.isEmpty()) { KIO::FileCopyJob *job = KIO::file_copy(url, localFile, -1, KIO::DefaultFlags); @@ -519,31 +527,16 @@ void DanbooruMainWindow::slotHandleDownload(const QUrl &url, const QVariant tags } #ifdef WITH_KFILEMETADATA - qCDebug(DANBOORU_CLIENT) << "Local file" << localFile.toLocalFile(); +// qCDebug(DANBOORU_CLIENT) << "Local file" << localFile.toLocalFile(); KFileMetaData::UserMetaData meta(localFile.toLocalFile()); meta.setTags(tagList); #endif - }); } - } - -/* - - - QUrl localFile = QFileDialog::getSaveFileUrl( - this, - i18n("Save file"), - QDir::homePath() + QLatin1Char('/') + remoteFile, - filters - - );*/ - - // TODO: Remember last user directory - settings? - - - + } + saveDialog->deleteLater(); + }); }