diff --git a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.cpp b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.cpp index 9d09f52d8ff..09ec468905d 100644 --- a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.cpp +++ b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.cpp @@ -3,13 +3,16 @@ #include "assetslibrarymodel.h" -#include #include #include #include + #include +#include +#include #include +#include #include #include @@ -151,16 +154,20 @@ bool AssetsLibraryModel::renameFolder(const QString &folderPath, const QString & QString AssetsLibraryModel::addNewFolder(const QString &folderPath) { - QString iterPath = folderPath; - QDir dir{folderPath}; + Utils::FilePath dir = Utils::FilePath::fromString(folderPath); + Utils::FilePath parentDir = dir.parentDir(); - while (dir.exists()) { - iterPath = getUniqueName(iterPath); + QString uniqueFolderName = UniqueName::get(dir.fileName(), [&] (const QString &folderName) { + return !parentDir.pathAppended(folderName).exists(); + }); - dir.setPath(iterPath); + auto res = parentDir.pathAppended(uniqueFolderName).ensureWritableDir(); + if (!res.has_value()) { + qWarning() << __FUNCTION__ << res.error(); + return {}; } - return dir.mkpath(iterPath) ? iterPath : ""; + return uniqueFolderName; } bool AssetsLibraryModel::urlPathExistsInModel(const QUrl &url) const @@ -242,36 +249,6 @@ void AssetsLibraryModel::syncHasFiles() setHasFiles(checkHasFiles()); } -QString AssetsLibraryModel::getUniqueName(const QString &oldName) { - static QRegularExpression rgx("\\d+$"); // matches a number at the end of a string - - QString uniqueName = oldName; - // if the folder name ends with a number, increment it - QRegularExpressionMatch match = rgx.match(uniqueName); - if (match.hasMatch()) { // ends with a number - QString numStr = match.captured(0); - int num = match.captured(0).toInt(); - - // get number of padding zeros, ex: for "005" = 2 - int nPaddingZeros = 0; - for (; nPaddingZeros < numStr.size() && numStr[nPaddingZeros] == '0'; ++nPaddingZeros); - - ++num; - - // if the incremented number's digits increased, decrease the padding zeros - if (std::fmod(std::log10(num), 1.0) == 0) - --nPaddingZeros; - - uniqueName = oldName.mid(0, match.capturedStart()) - + QString('0').repeated(nPaddingZeros) - + QString::number(num); - } else { - uniqueName = oldName + '1'; - } - - return uniqueName; -} - void AssetsLibraryModel::setRootPath(const QString &newPath) { beginResetModel(); diff --git a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.h b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.h index 2516be787fc..f08578651af 100644 --- a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.h +++ b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.h @@ -58,8 +58,6 @@ public: bool hasFiles() const { return m_hasFiles; } - QString getUniqueName(const QString &oldName); - signals: void directoryLoaded(const QString &path); void rootPathChanged(); diff --git a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp index 5b6a2d76127..9c46ace22d0 100644 --- a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp @@ -7,7 +7,6 @@ #include "assetslibrarymodel.h" #include "assetslibraryview.h" -#include #include #include #include @@ -25,9 +24,11 @@ #include #include +#include #include #include #include +#include #include #include @@ -174,23 +175,14 @@ void AssetsLibraryWidget::deleteSelectedAssets() QString AssetsLibraryWidget::getUniqueEffectPath(const QString &parentFolder, const QString &effectName) { - auto genEffectPath = [&parentFolder](const QString &name) { - QString effectsDir = ModelNodeOperations::getEffectsDefaultDirectory(parentFolder); - return QLatin1String("%1/%2.qep").arg(effectsDir, name); - }; + QString effectsDir = ModelNodeOperations::getEffectsDefaultDirectory(parentFolder); + QString effectPathTemplate = effectsDir + QLatin1String("/%1.qep"); - QString uniqueName = effectName; - QString path = genEffectPath(uniqueName); - QFileInfo file{path}; + QString uniqueName = UniqueName::get(effectName, [&] (const QString &name) { + return !QFile::exists(effectPathTemplate.arg(name)); + }); - while (file.exists()) { - uniqueName = m_assetsModel->getUniqueName(uniqueName); - - path = genEffectPath(uniqueName); - file.setFile(path); - } - - return path; + return effectPathTemplate.arg(uniqueName); } bool AssetsLibraryWidget::createNewEffect(const QString &effectPath, bool openInEffectComposer)