From 3cad8084c73e1a3cbde96a5e0ab8766bdf2bbef5 Mon Sep 17 00:00:00 2001 From: borgmanJeremy <46930769+borgmanJeremy@users.noreply.github.com> Date: Sat, 31 Jul 2021 15:03:49 -0500 Subject: [PATCH] Allow saving to any supported image format (#1790) --- src/utils/screenshotsaver.cpp | 69 ++++++++++++----------------------- src/utils/screenshotsaver.h | 9 +---- 2 files changed, 24 insertions(+), 54 deletions(-) diff --git a/src/utils/screenshotsaver.cpp b/src/utils/screenshotsaver.cpp index d4c8a373..d9bd1144 100644 --- a/src/utils/screenshotsaver.cpp +++ b/src/utils/screenshotsaver.cpp @@ -14,6 +14,8 @@ #include #include #include +#include +#include #if defined(Q_OS_MACOS) #include "src/widgets/capture/capturewidget.h" #endif @@ -110,47 +112,31 @@ bool ScreenshotSaver::saveToFilesystem(const QPixmap& capture, QString ScreenshotSaver::ShowSaveFileDialog(QWidget* parent, const QString& title, - const QString& directory, - const QString& filter) + const QString& directory) { -#if defined(Q_WS_WIN) || defined(Q_WS_MAC) - return QFileDialog::getSaveFileName(parent, title, directory, filter); -#else - QFileDialog dialog(parent, title, directory, filter); + QFileDialog dialog(parent, title, directory); if (parent) { dialog.setWindowModality(Qt::WindowModal); } dialog.setAcceptMode(QFileDialog::AcceptSave); - dialog.selectNameFilter(ConfigHandler().getSaveAsFileExtension()); + + // Build string list of supported image formats + QStringList mimeTypeList; + foreach (auto mimeType, QImageWriter::supportedMimeTypes()) + mimeTypeList.append(mimeType); + dialog.setMimeTypeFilters(mimeTypeList); + + QString suffix = ConfigHandler().getSaveAsFileExtension(); + QString defaultMimeType = + QMimeDatabase().mimeTypeForFile("image" + suffix).name(); + dialog.selectMimeTypeFilter(defaultMimeType); + if (dialog.exec() == QDialog::Accepted) { - - ConfigHandler().setSaveAsFileExtension(dialog.selectedNameFilter()); - QString file_name = dialog.selectedFiles().first(); - QFileInfo info(file_name); - - if ((dialog.selectedNameFilter() == defaultFilter)) { - if (info.suffix().isEmpty()) { // change to png if no suffix given, - // otherwise leave it as it is - file_name = info.filePath() + QLatin1String(".") + "png"; - ; - } - } else if (!dialog.selectedNameFilter() - .isEmpty()) { // if selected suffix from menu is not an - // empty entry - QString selectedExtension = - dialog.selectedNameFilter().section('.', -1); - selectedExtension.remove(QChar(')')); - file_name = - info.path() + QLatin1String("/") + info.completeBaseName() + - QLatin1String(".") + - selectedExtension; // recreate full filename with chosen suffix - } - return file_name; + return dialog.selectedFiles().first(); } else { return QString(); } -#endif // Q_WS_MAC || Q_WS_WIN } bool ScreenshotSaver::saveToFilesystemGUI(const QPixmap& capture) @@ -170,24 +156,15 @@ bool ScreenshotSaver::saveToFilesystemGUI(const QPixmap& capture) } #endif if (!config.savePathFixed()) { - savePath = ShowSaveFileDialog( - nullptr, - QObject::tr("Save screenshot"), - FileNameHandler().absoluteSavePath(), - QString(pngFilter + separator + bmpFilter + separator + jpgFilter + - separator + defaultFilter)); + // auto imageFormats = QImageWriter::supportedImageFormats(); + savePath = + ShowSaveFileDialog(nullptr, + QObject::tr("Save screenshot"), + FileNameHandler().absoluteSavePath() + + ConfigHandler().getSaveAsFileExtension()); } if (savePath == "") { - QString msg = QObject::tr("Saving canceled"); - QMessageBox saveInfoBox( - QMessageBox::Information, QObject::tr("Save canceled"), msg); - saveInfoBox.setWindowIcon(QIcon(":img/app/flameshot.svg")); - saveInfoBox.exec(); return ok; - } else if (!savePath.endsWith(QLatin1String(".png"), Qt::CaseInsensitive) && - !savePath.endsWith(QLatin1String(".bmp"), Qt::CaseInsensitive) && - !savePath.endsWith(QLatin1String(".jpg"), Qt::CaseInsensitive)) { - savePath += QLatin1String(".png"); } ok = capture.save(savePath); diff --git a/src/utils/screenshotsaver.h b/src/utils/screenshotsaver.h index ff6b4cc7..a5fc0907 100644 --- a/src/utils/screenshotsaver.h +++ b/src/utils/screenshotsaver.h @@ -25,12 +25,5 @@ private: unsigned m_id; QString ShowSaveFileDialog(QWidget* parent, const QString& title, - const QString& directory, - const QString& filter); - - const QString pngFilter = "Portable Network Graphic file (PNG) (*.png)"; - const QString bmpFilter = "BMP file (*.bmp)"; - const QString jpgFilter = "JPEG file (*.jpg)"; - const QString defaultFilter = "By extension [default: *.png] (*.png)"; - const QString separator = ";;"; + const QString& directory); };