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) {
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);
}

View File

@@ -28,6 +28,7 @@
#include <qmldesignercorelib_global.h>
#include "actioninterface.h"
#include "modelnode.h"
#include "modelnodeoperations.h"
#include <coreplugin/actionmanager/command.h>
#include <utils/styledbar.h>
@@ -45,7 +46,7 @@ namespace QmlDesigner {
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 &)>;
struct AddResourceHandler

View File

@@ -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<QPair<QString, QString>> 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;
}
}
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));
}

View File

@@ -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);

View File

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

View File

@@ -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) {

View File

@@ -38,6 +38,7 @@
#include <itemlibrarymodel.h>
#include <itemlibraryaddimportmodel.h>
#include "itemlibraryassetsiconprovider.h"
#include "modelnodeoperations.h"
#include <metainfo.h>
#include <model.h>
#include <rewritingexception.h>
@@ -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(' ')));
}
}
}