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.
This commit is contained in:
Luca Beltrame 2015-08-23 12:04:52 +02:00
parent bff3d33fc3
commit 2abc76e311

View file

@ -30,6 +30,7 @@
#include <QDockWidget> #include <QDockWidget>
#include <QQuickItem> #include <QQuickItem>
#include <QFileDialog> #include <QFileDialog>
#include <QPointer>
#include <QSortFilterProxyModel> #include <QSortFilterProxyModel>
#include <QStatusBar> #include <QStatusBar>
@ -478,24 +479,27 @@ void DanbooruMainWindow::slotHandleDownload(const QUrl &url, const QVariant tags
QStringList tagList = tags.toStringList(); QStringList tagList = tags.toStringList();
KIO::MimetypeJob *mimeJob = KIO::mimetype(url, KIO::HideProgressInfo); KIO::MimetypeJob *mimeJob = KIO::mimetype(url, KIO::HideProgressInfo);
QString remoteFile = url.fileName(); QString remoteFile = url.fileName();
QFileDialog saveDialog(this); QPointer<QFileDialog> saveDialog = new QFileDialog(this, i18n("Save image"));
saveDialog.setAcceptMode(QFileDialog::AcceptSave);
saveDialog.setFileMode(QFileDialog::AnyFile); saveDialog->setAcceptMode(QFileDialog::AcceptSave);
saveDialog.setDirectory(QStandardPaths::writableLocation(QStandardPaths::PicturesLocation)); saveDialog->setFileMode(QFileDialog::AnyFile);
saveDialog.setOption(QFileDialog::DontConfirmOverwrite, false); saveDialog->setDirectory(QStandardPaths::writableLocation(QStandardPaths::PicturesLocation));
saveDialog->setOption(QFileDialog::DontConfirmOverwrite, false);
QStringList filters; QStringList filters;
if (mimeJob->exec()) { if (mimeJob->exec()) {
filters << mimeJob->mimetype(); filters << mimeJob->mimetype();
saveDialog.setMimeTypeFilters(filters); saveDialog->setMimeTypeFilters(filters);
} else { } else {
filters.reserve(2);
filters << "Images (*.png *.gif *.jpg)" << "All files (*.*)"; filters << "Images (*.png *.gif *.jpg)" << "All files (*.*)";
saveDialog.setNameFilters(filters); saveDialog->setNameFilters(filters);
} }
// Prevent invalid characters (":" can be a tag in Danbooru) // Prevent invalid characters (":" can be a tag in Danbooru)
@ -503,10 +507,14 @@ void DanbooruMainWindow::slotHandleDownload(const QUrl &url, const QVariant tags
remoteFile.replace(":", "_"); remoteFile.replace(":", "_");
} }
saveDialog.selectFile(remoteFile); saveDialog->selectFile(remoteFile);
saveDialog->open();
if (saveDialog.exec()) { connect(saveDialog, &QFileDialog::finished, [this, tagList, saveDialog, url](int result) {
QUrl localFile = saveDialog.selectedUrls().first();
if (result) {
QUrl localFile = saveDialog->selectedUrls().at(0);
if (!localFile.isEmpty()) { if (!localFile.isEmpty()) {
KIO::FileCopyJob *job = KIO::file_copy(url, localFile, -1, KIO::DefaultFlags); 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 #ifdef WITH_KFILEMETADATA
qCDebug(DANBOORU_CLIENT) << "Local file" << localFile.toLocalFile(); // qCDebug(DANBOORU_CLIENT) << "Local file" << localFile.toLocalFile();
KFileMetaData::UserMetaData meta(localFile.toLocalFile()); KFileMetaData::UserMetaData meta(localFile.toLocalFile());
meta.setTags(tagList); meta.setTags(tagList);
#endif #endif
}); });
} }
} }
saveDialog->deleteLater();
/* });
QUrl localFile = QFileDialog::getSaveFileUrl(
this,
i18n("Save file"),
QDir::homePath() + QLatin1Char('/') + remoteFile,
filters
);*/
// TODO: Remember last user directory - settings?
} }