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) {
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -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();
|
|
||||||
|
|
||||||
QTC_ASSERT(document, return false);
|
|
||||||
|
|
||||||
if (success) {
|
|
||||||
ProjectExplorer::Node *node = ProjectExplorer::ProjectTree::nodeForFile(document->fileName());
|
ProjectExplorer::Node *node = ProjectExplorer::ProjectTree::nodeForFile(document->fileName());
|
||||||
if (node) {
|
if (node) {
|
||||||
ProjectExplorer::FolderNode *containingFolder = node->parentFolderNode();
|
ProjectExplorer::FolderNode *containingFolder = node->parentFolderNode();
|
||||||
if (containingFolder)
|
if (containingFolder)
|
||||||
containingFolder->addFiles({Utils::FilePath::fromString(filePair.second)});
|
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));
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
|
@@ -788,6 +788,9 @@ void ItemLibraryAssetImportDialog::onClose()
|
|||||||
addInfo(tr("Canceling import."));
|
addInfo(tr("Canceling import."));
|
||||||
m_importer.cancelImport();
|
m_importer.cancelImport();
|
||||||
} else {
|
} else {
|
||||||
|
if (ui->progressBar->value() == 100) // import done successfully
|
||||||
|
accept();
|
||||||
|
else
|
||||||
reject();
|
reject();
|
||||||
close();
|
close();
|
||||||
deleteLater();
|
deleteLater();
|
||||||
|
@@ -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) {
|
||||||
|
@@ -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(' ')));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user