diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp index 8ca977e7428..d9a67a8400f 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp @@ -290,8 +290,8 @@ QHash DesignerActionManager::handleExternalAssetsDrop(cons for (const QString &category : categories) { AddResourceOperation operation = categoryOperation.value(category); QStringList files = categoryFiles.value(category); - bool success = operation(files, {}); - if (success) + AddFilesResult result = operation(files, {}); + if (result == AddFilesResult::Succeeded) addedCategoryFiles.insert(category, files); } diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.h b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.h index 60e2c7562f9..e86e441b14d 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.h +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.h @@ -28,6 +28,7 @@ #include #include "actioninterface.h" #include "modelnode.h" +#include "modelnodeoperations.h" #include #include @@ -45,7 +46,7 @@ namespace QmlDesigner { class DesignerActionManagerView; -using AddResourceOperation = std::function; +using AddResourceOperation = std::function; using ModelNodePreviewImageOperation = std::function; struct AddResourceHandler diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp index 10f1b4593d7..b4867404954 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp @@ -992,13 +992,15 @@ Utils::FilePath projectFilePath() return Utils::FilePath(); } -static bool addFilesToProject(const QStringList &fileNames, const QString &defaultDirectory) +static AddFilesResult addFilesToProject(const QStringList &fileNames, const QString &defaultDirectory) { QString directory = AddImagesDialog::getDirectory(fileNames, defaultDirectory); if (directory.isEmpty()) - return true; // cancelling the dialog is considered success + return AddFilesResult::Cancelled; + + DesignDocument *document = QmlDesignerPlugin::instance()->currentDesignDocument(); + QTC_ASSERT(document, return AddFilesResult::Failed); - bool allSuccessful = true; QList> copyList; QStringList removeList; for (const QString &fileName : fileNames) { @@ -1021,26 +1023,21 @@ static bool addFilesToProject(const QStringList &fileNames, const QString &defau // unnecessarily refreshing file models multiple times during the operation for (const auto &file : qAsConst(removeList)) QFile::remove(file); + for (const auto &filePair : qAsConst(copyList)) { const bool success = QFile::copy(filePair.first, filePair.second); + if (!success) + return AddFilesResult::Failed; - auto document = QmlDesignerPlugin::instance()->currentDesignDocument(); - - QTC_ASSERT(document, return false); - - if (success) { - ProjectExplorer::Node *node = ProjectExplorer::ProjectTree::nodeForFile(document->fileName()); - if (node) { - ProjectExplorer::FolderNode *containingFolder = node->parentFolderNode(); - if (containingFolder) - containingFolder->addFiles({Utils::FilePath::fromString(filePair.second)}); - } - } else { - allSuccessful = false; + ProjectExplorer::Node *node = ProjectExplorer::ProjectTree::nodeForFile(document->fileName()); + if (node) { + ProjectExplorer::FolderNode *containingFolder = node->parentFolderNode(); + if (containingFolder) + containingFolder->addFiles({Utils::FilePath::fromString(filePair.second)}); } } - return allSuccessful; + return AddFilesResult::Succeeded; } static QString getAssetDefaultDirectory(const QString &assetDir, const QString &defaultDirectory) @@ -1060,22 +1057,22 @@ static QString getAssetDefaultDirectory(const QString &assetDir, const QString & return adjustedDefaultDirectory; } -bool addFontToProject(const QStringList &fileNames, const QString &defaultDirectory) +AddFilesResult addFontToProject(const QStringList &fileNames, const QString &defaultDirectory) { return addFilesToProject(fileNames, getAssetDefaultDirectory("fonts", defaultDirectory)); } -bool addSoundToProject(const QStringList &fileNames, const QString &defaultDirectory) +AddFilesResult addSoundToProject(const QStringList &fileNames, const QString &defaultDirectory) { return addFilesToProject(fileNames, getAssetDefaultDirectory("sounds", defaultDirectory)); } -bool addShaderToProject(const QStringList &fileNames, const QString &defaultDirectory) +AddFilesResult addShaderToProject(const QStringList &fileNames, const QString &defaultDirectory) { return addFilesToProject(fileNames, getAssetDefaultDirectory("shaders", defaultDirectory)); } -bool addImageToProject(const QStringList &fileNames, const QString &defaultDirectory) +AddFilesResult addImageToProject(const QStringList &fileNames, const QString &defaultDirectory) { return addFilesToProject(fileNames, getAssetDefaultDirectory("images", defaultDirectory)); } diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h index 0e302a3c65a..feb7faa556f 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h @@ -28,6 +28,9 @@ #include "selectioncontext.h" namespace QmlDesigner { + +enum class AddFilesResult { Succeeded, Failed, Cancelled }; + namespace ModelNodeOperations { bool goIntoComponent(const ModelNode &modelNode); @@ -73,10 +76,10 @@ void addItemToStackedContainer(const SelectionContext &selectionContext); void increaseIndexOfStackedContainer(const SelectionContext &selectionContext); void decreaseIndexOfStackedContainer(const SelectionContext &selectionContext); void addTabBarToStackedContainer(const SelectionContext &selectionContext); -bool addImageToProject(const QStringList &fileNames, const QString &directory); -bool addFontToProject(const QStringList &fileNames, const QString &directory); -bool addSoundToProject(const QStringList &fileNames, const QString &directory); -bool addShaderToProject(const QStringList &fileNames, const QString &directory); +AddFilesResult addImageToProject(const QStringList &fileNames, const QString &directory); +AddFilesResult addFontToProject(const QStringList &fileNames, const QString &directory); +AddFilesResult addSoundToProject(const QStringList &fileNames, const QString &directory); +AddFilesResult addShaderToProject(const QStringList &fileNames, const QString &directory); void createFlowActionArea(const SelectionContext &selectionContext); void addTransition(const SelectionContext &selectionState); void addFlowEffect(const SelectionContext &selectionState, const TypeName &typeName); diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp index 04bc51284b9..135eaaf5aaf 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimportdialog.cpp @@ -788,7 +788,10 @@ void ItemLibraryAssetImportDialog::onClose() addInfo(tr("Canceling import.")); m_importer.cancelImport(); } else { - reject(); + if (ui->progressBar->value() == 100) // import done successfully + accept(); + else + reject(); close(); deleteLater(); } diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp index 06b84d83f8b..9c8b4e09f90 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibraryview.cpp @@ -245,13 +245,15 @@ void ItemLibraryView::updateImport3DSupport(const QVariantMap &supportMap) m_importableExtensions3DMap = extMap; - auto import3DModelOperation = [this](const QStringList &fileNames, const QString &defaultDir) -> bool { + AddResourceOperation import3DModelOperation = [this](const QStringList &fileNames, + const QString &defaultDir) -> AddFilesResult { auto importDlg = new ItemLibraryAssetImportDialog(fileNames, defaultDir, m_importableExtensions3DMap, m_importOptions3DMap, {}, {}, Core::ICore::mainWindow()); - importDlg->exec(); - return true; + int result = importDlg->exec(); + + return result == QDialog::Accepted ? AddFilesResult::Succeeded : AddFilesResult::Cancelled; }; auto add3DHandler = [&](const QString &group, const QString &ext) { diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp index bd20722206e..ef1e85287a7 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarywidget.cpp @@ -38,6 +38,7 @@ #include #include #include "itemlibraryassetsiconprovider.h" +#include "modelnodeoperations.h" #include #include #include @@ -621,8 +622,11 @@ void ItemLibraryWidget::addResources(const QStringList &files) QStringList fileNames = categoryFileNames.values(category); AddResourceOperation operation = categoryToOperation.value(category); QmlDesignerPlugin::emitUsageStatistics(Constants::EVENT_RESOURCE_IMPORTED + category); - if (!operation(fileNames, document->fileName().parentDir().toString())) - Core::AsynchronousMessageBox::warning(tr("Failed to Add Files"), tr("Could not add %1 to project.").arg(fileNames.join(' '))); + AddFilesResult result = operation(fileNames, document->fileName().parentDir().toString()); + if (result == AddFilesResult::Failed) { + Core::AsynchronousMessageBox::warning(tr("Failed to Add Files"), + tr("Could not add %1 to project.").arg(fileNames.join(' '))); + } } }