diff --git a/src/ExportManager.h b/src/ExportManager.h --- a/src/ExportManager.h +++ b/src/ExportManager.h @@ -20,6 +20,7 @@ #ifndef EXPORTMANAGER_H #define EXPORTMANAGER_H +#include #include #include #include @@ -81,7 +82,8 @@ QString makeAutosaveFilename(); using FileNameAlreadyUsedCheck = bool (ExportManager::*)(const QUrl&) const; - QString autoIncrementFilename(const QString &baseName, const QString &extension, + QString autoIncrementFilename(const QDir &baseDir, const QString &fileName, + const QString &extension, FileNameAlreadyUsedCheck isFileNameUsed); QString makeSaveMimetype(const QUrl &url); bool writeImage(QIODevice *device, const QByteArray &format); diff --git a/src/ExportManager.cpp b/src/ExportManager.cpp --- a/src/ExportManager.cpp +++ b/src/ExportManager.cpp @@ -19,7 +19,6 @@ #include "ExportManager.h" -#include #include #include #include @@ -130,8 +129,7 @@ { const QString baseDir = saveLocation(); const QDir baseDirPath(baseDir); - const QString filename = makeAutosaveFilename(); - const QString fullpath = autoIncrementFilename(baseDirPath.filePath(filename), + const QString fullpath = autoIncrementFilename(baseDirPath, makeAutosaveFilename(), SpectacleConfig::instance()->saveImageFormat(), &ExportManager::isFileExists); @@ -160,24 +158,30 @@ .replace(QLatin1String("%S"), timestamp.toString(QStringLiteral("ss"))); } -QString ExportManager::autoIncrementFilename(const QString &baseName, const QString &extension, +QString ExportManager::autoIncrementFilename(const QDir &baseDir, const QString &fileName, + const QString &extension, FileNameAlreadyUsedCheck isFileNameUsed) { - if (!((this->*isFileNameUsed)(QUrl::fromUserInput(baseName + QLatin1Char('.') + extension)))) { - return baseName + QLatin1Char('.') + extension; + QString resultFileName = fileName.isEmpty() ? QStringLiteral("1") : fileName; + QString resultFilePath = baseDir.filePath(resultFileName) + QLatin1Char('.') + extension; + + if (!((this->*isFileNameUsed)(QUrl::fromUserInput(resultFilePath)))) { + return resultFilePath; } - QString fileNameFmt(baseName + QStringLiteral("-%1.") + extension); + QString fileNameFmt = fileName.isEmpty() ? QStringLiteral("%1") : fileName + QStringLiteral("-%1"); + QString filePathFmt = baseDir.filePath(fileNameFmt) + QLatin1Char('.') + extension; + for (quint64 i = 1; i < std::numeric_limits::max(); i++) { - if (!((this->*isFileNameUsed)(QUrl::fromUserInput(fileNameFmt.arg(i))))) { - return fileNameFmt.arg(i); + if (!((this->*isFileNameUsed)(QUrl::fromUserInput(filePathFmt.arg(i))))) { + return filePathFmt.arg(i); } } // unlikely this will ever happen, but just in case we've run // out of numbers - return fileNameFmt.arg(QStringLiteral("OVERFLOW-") + QString::number(qrand() % 10000)); + return filePathFmt.arg(QStringLiteral("OVERFLOW-") + QString::number(qrand() % 10000)); } QString ExportManager::makeSaveMimetype(const QUrl &url) @@ -254,8 +258,7 @@ // supports the use-case of creating multiple screenshots in a row // and exporting them to the same destination e.g. via clipboard, // where the temp file name is used as filename suggestion - const QString baseFileName = mTempDir->path() + QDir::separator() + makeAutosaveFilename(); - const QString fileName = autoIncrementFilename(baseFileName, mimetype, + const QString fileName = autoIncrementFilename(mTempDir->path(), makeAutosaveFilename(), mimetype, &ExportManager::isTempFileAlreadyUsed); QFile tmpFile(fileName); if (tmpFile.open(QFile::WriteOnly)) {