QmlDesigner: Distiguish between cancel and fail when importing assets

When asset importing fails we show a warning, but not when the user
cancels the importing.

Change-Id: I950d3b43c0f7c78a5abfb31a1974d2a9cd193522
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
This commit is contained in:
Mahmoud Badri
2021-10-19 16:35:48 +03:00
parent 57b5cd69b9
commit 80feee2b63
7 changed files with 44 additions and 34 deletions

View File

@@ -290,8 +290,8 @@ QHash<QString, QStringList> DesignerActionManager::handleExternalAssetsDrop(cons
for (const QString &category : categories) { for (const QString &category : categories) {
AddResourceOperation operation = categoryOperation.value(category); AddResourceOperation operation = categoryOperation.value(category);
QStringList files = categoryFiles.value(category); QStringList files = categoryFiles.value(category);
bool success = operation(files, {}); AddFilesResult result = operation(files, {});
if (success) if (result == AddFilesResult::Succeeded)
addedCategoryFiles.insert(category, files); addedCategoryFiles.insert(category, files);
} }

View File

@@ -28,6 +28,7 @@
#include <qmldesignercorelib_global.h> #include <qmldesignercorelib_global.h>
#include "actioninterface.h" #include "actioninterface.h"
#include "modelnode.h" #include "modelnode.h"
#include "modelnodeoperations.h"
#include <coreplugin/actionmanager/command.h> #include <coreplugin/actionmanager/command.h>
#include <utils/styledbar.h> #include <utils/styledbar.h>
@@ -45,7 +46,7 @@ namespace QmlDesigner {
class DesignerActionManagerView; class DesignerActionManagerView;
using AddResourceOperation = std::function<bool (const QStringList &, const QString &)>; using AddResourceOperation = std::function<AddFilesResult (const QStringList &, const QString &)>;
using ModelNodePreviewImageOperation = std::function<QVariant (const ModelNode &)>; using ModelNodePreviewImageOperation = std::function<QVariant (const ModelNode &)>;
struct AddResourceHandler struct AddResourceHandler

View File

@@ -992,13 +992,15 @@ Utils::FilePath projectFilePath()
return Utils::FilePath(); 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); QString directory = AddImagesDialog::getDirectory(fileNames, defaultDirectory);
if (directory.isEmpty()) 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<QPair<QString, QString>> copyList; QList<QPair<QString, QString>> copyList;
QStringList removeList; QStringList removeList;
for (const QString &fileName : fileNames) { 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 // unnecessarily refreshing file models multiple times during the operation
for (const auto &file : qAsConst(removeList)) for (const auto &file : qAsConst(removeList))
QFile::remove(file); QFile::remove(file);
for (const auto &filePair : qAsConst(copyList)) { for (const auto &filePair : qAsConst(copyList)) {
const bool success = QFile::copy(filePair.first, filePair.second); const bool success = QFile::copy(filePair.first, filePair.second);
if (!success)
return AddFilesResult::Failed;
auto document = QmlDesignerPlugin::instance()->currentDesignDocument(); ProjectExplorer::Node *node = ProjectExplorer::ProjectTree::nodeForFile(document->fileName());
if (node) {
QTC_ASSERT(document, return false); ProjectExplorer::FolderNode *containingFolder = node->parentFolderNode();
if (containingFolder)
if (success) { containingFolder->addFiles({Utils::FilePath::fromString(filePair.second)});
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;
} }
} }
return allSuccessful; return AddFilesResult::Succeeded;
} }
static QString getAssetDefaultDirectory(const QString &assetDir, const QString &defaultDirectory) static QString getAssetDefaultDirectory(const QString &assetDir, const QString &defaultDirectory)
@@ -1060,22 +1057,22 @@ static QString getAssetDefaultDirectory(const QString &assetDir, const QString &
return adjustedDefaultDirectory; return adjustedDefaultDirectory;
} }
bool addFontToProject(const QStringList &fileNames, const QString &defaultDirectory) AddFilesResult addFontToProject(const QStringList &fileNames, const QString &defaultDirectory)
{ {
return addFilesToProject(fileNames, getAssetDefaultDirectory("fonts", 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)); 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)); 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)); return addFilesToProject(fileNames, getAssetDefaultDirectory("images", defaultDirectory));
} }

View File

@@ -28,6 +28,9 @@
#include "selectioncontext.h" #include "selectioncontext.h"
namespace QmlDesigner { namespace QmlDesigner {
enum class AddFilesResult { Succeeded, Failed, Cancelled };
namespace ModelNodeOperations { namespace ModelNodeOperations {
bool goIntoComponent(const ModelNode &modelNode); bool goIntoComponent(const ModelNode &modelNode);
@@ -73,10 +76,10 @@ void addItemToStackedContainer(const SelectionContext &selectionContext);
void increaseIndexOfStackedContainer(const SelectionContext &selectionContext); void increaseIndexOfStackedContainer(const SelectionContext &selectionContext);
void decreaseIndexOfStackedContainer(const SelectionContext &selectionContext); void decreaseIndexOfStackedContainer(const SelectionContext &selectionContext);
void addTabBarToStackedContainer(const SelectionContext &selectionContext); void addTabBarToStackedContainer(const SelectionContext &selectionContext);
bool addImageToProject(const QStringList &fileNames, const QString &directory); AddFilesResult addImageToProject(const QStringList &fileNames, const QString &directory);
bool addFontToProject(const QStringList &fileNames, const QString &directory); AddFilesResult addFontToProject(const QStringList &fileNames, const QString &directory);
bool addSoundToProject(const QStringList &fileNames, const QString &directory); AddFilesResult addSoundToProject(const QStringList &fileNames, const QString &directory);
bool addShaderToProject(const QStringList &fileNames, const QString &directory); AddFilesResult addShaderToProject(const QStringList &fileNames, const QString &directory);
void createFlowActionArea(const SelectionContext &selectionContext); void createFlowActionArea(const SelectionContext &selectionContext);
void addTransition(const SelectionContext &selectionState); void addTransition(const SelectionContext &selectionState);
void addFlowEffect(const SelectionContext &selectionState, const TypeName &typeName); void addFlowEffect(const SelectionContext &selectionState, const TypeName &typeName);

View File

@@ -788,7 +788,10 @@ void ItemLibraryAssetImportDialog::onClose()
addInfo(tr("Canceling import.")); addInfo(tr("Canceling import."));
m_importer.cancelImport(); m_importer.cancelImport();
} else { } else {
reject(); if (ui->progressBar->value() == 100) // import done successfully
accept();
else
reject();
close(); close();
deleteLater(); deleteLater();
} }

View File

@@ -245,13 +245,15 @@ void ItemLibraryView::updateImport3DSupport(const QVariantMap &supportMap)
m_importableExtensions3DMap = extMap; 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, auto importDlg = new ItemLibraryAssetImportDialog(fileNames, defaultDir,
m_importableExtensions3DMap, m_importableExtensions3DMap,
m_importOptions3DMap, {}, {}, m_importOptions3DMap, {}, {},
Core::ICore::mainWindow()); Core::ICore::mainWindow());
importDlg->exec(); int result = importDlg->exec();
return true;
return result == QDialog::Accepted ? AddFilesResult::Succeeded : AddFilesResult::Cancelled;
}; };
auto add3DHandler = [&](const QString &group, const QString &ext) { auto add3DHandler = [&](const QString &group, const QString &ext) {

View File

@@ -38,6 +38,7 @@
#include <itemlibrarymodel.h> #include <itemlibrarymodel.h>
#include <itemlibraryaddimportmodel.h> #include <itemlibraryaddimportmodel.h>
#include "itemlibraryassetsiconprovider.h" #include "itemlibraryassetsiconprovider.h"
#include "modelnodeoperations.h"
#include <metainfo.h> #include <metainfo.h>
#include <model.h> #include <model.h>
#include <rewritingexception.h> #include <rewritingexception.h>
@@ -621,8 +622,11 @@ void ItemLibraryWidget::addResources(const QStringList &files)
QStringList fileNames = categoryFileNames.values(category); QStringList fileNames = categoryFileNames.values(category);
AddResourceOperation operation = categoryToOperation.value(category); AddResourceOperation operation = categoryToOperation.value(category);
QmlDesignerPlugin::emitUsageStatistics(Constants::EVENT_RESOURCE_IMPORTED + category); QmlDesignerPlugin::emitUsageStatistics(Constants::EVENT_RESOURCE_IMPORTED + category);
if (!operation(fileNames, document->fileName().parentDir().toString())) AddFilesResult result = operation(fileNames, document->fileName().parentDir().toString());
Core::AsynchronousMessageBox::warning(tr("Failed to Add Files"), tr("Could not add %1 to project.").arg(fileNames.join(' '))); if (result == AddFilesResult::Failed) {
Core::AsynchronousMessageBox::warning(tr("Failed to Add Files"),
tr("Could not add %1 to project.").arg(fileNames.join(' ')));
}
} }
} }