forked from qt-creator/qt-creator
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:
@@ -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);
|
||||
}
|
||||
|
||||
|
@@ -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
|
||||
|
@@ -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;
|
||||
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));
|
||||
}
|
||||
|
@@ -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);
|
||||
|
@@ -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();
|
||||
}
|
||||
|
@@ -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) {
|
||||
|
@@ -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(' ')));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user