From dca06351fd261740924145050a02c60ccbaa0209 Mon Sep 17 00:00:00 2001 From: Tomi Korpipaa Date: Mon, 3 Oct 2022 14:06:29 +0300 Subject: Import QQEM effects via drag or add button Be able to add effects using file system drag&drop or using the add resource button (cherry picked from commit 02f7c9c3eb290bbd362349dab684606ad93b6e60) Task-number: QTBUG-100626 Change-Id: I33c3ebe29797325a2ed1819bd867e97ae3f8b61c Reviewed-by: Tim Jenssen --- .../itemLibraryQmlSources/AssetsView.qml | 13 +++- .../templates/wizards/files/effect/file.qep | 0 .../templates/wizards/files/effect/wizard.json | 40 +++++++++++ .../assetslibrary/assetslibrarymodel.cpp | 12 +++- .../components/assetslibrary/assetslibrarymodel.h | 1 + .../assetslibrary/assetslibrarywidget.cpp | 63 ++++++++++++++++- .../components/assetslibrary/assetslibrarywidget.h | 8 ++- .../componentcore/componentcore_constants.h | 4 +- .../componentcore/modelnodeoperations.cpp | 13 ++++ .../components/componentcore/modelnodeoperations.h | 6 +- .../formeditor/abstractformeditortool.cpp | 3 +- .../qmldesigner/components/formeditor/dragtool.cpp | 79 +++++++++++++++------- .../qmldesigner/designercore/include/qmlitemnode.h | 4 +- .../qmldesigner/designercore/model/qmlitemnode.cpp | 27 ++++++++ .../designercore/model/texttomodelmerger.cpp | 6 +- src/plugins/qmldesigner/qmldesignerconstants.h | 1 + src/plugins/qmldesigner/qmldesignerplugin.cpp | 5 ++ src/plugins/qmldesigner/qmldesignerplugin.h | 4 +- 18 files changed, 249 insertions(+), 40 deletions(-) create mode 100644 share/qtcreator/templates/wizards/files/effect/file.qep create mode 100644 share/qtcreator/templates/wizards/files/effect/wizard.json diff --git a/share/qtcreator/qmldesigner/itemLibraryQmlSources/AssetsView.qml b/share/qtcreator/qmldesigner/itemLibraryQmlSources/AssetsView.qml index e1c017814d..77a784d92d 100644 --- a/share/qtcreator/qmldesigner/itemLibraryQmlSources/AssetsView.qml +++ b/share/qtcreator/qmldesigner/itemLibraryQmlSources/AssetsView.qml @@ -162,6 +162,7 @@ ScrollView { // TODO: experiment using ListView instead of ScrollView + Column readonly property string suffix: fileName.substr(-4) readonly property bool isFont: suffix === ".ttf" || suffix === ".otf" + readonly property bool isEffect: suffix === ".qep" property bool currFileSelected: false MouseArea { @@ -180,7 +181,7 @@ ScrollView { // TODO: experiment using ListView instead of ScrollView + Column allowTooltip = true } onPositionChanged: tooltipBackend.reposition() - onPressed: (mouse)=> { + onPressed: (mouse) => { forceActiveFocus() allowTooltip = false tooltipBackend.hideTooltip() @@ -212,7 +213,7 @@ ScrollView { // TODO: experiment using ListView instead of ScrollView + Column } } - onReleased: (mouse)=> { + onReleased: (mouse) => { allowTooltip = true if (mouse.button === Qt.LeftButton) { if (!(mouse.modifiers & Qt.ControlModifier)) @@ -222,6 +223,14 @@ ScrollView { // TODO: experiment using ListView instead of ScrollView + Column } } + onDoubleClicked: (mouse) => { + forceActiveFocus() + allowTooltip = false + tooltipBackend.hideTooltip() + if (mouse.button === Qt.LeftButton && isEffect) + rootView.openEffectMaker(filePath) + } + ToolTip { visible: !isFont && mouseArea.containsMouse && !contextMenu.visible text: filePath diff --git a/share/qtcreator/templates/wizards/files/effect/file.qep b/share/qtcreator/templates/wizards/files/effect/file.qep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/share/qtcreator/templates/wizards/files/effect/wizard.json b/share/qtcreator/templates/wizards/files/effect/wizard.json new file mode 100644 index 0000000000..d966f097ed --- /dev/null +++ b/share/qtcreator/templates/wizards/files/effect/wizard.json @@ -0,0 +1,40 @@ +{ + "version": 1, + "supportedProjectTypes": [ ], + "id": "J.QEP", + "category": "U.QEP", + "trDescription": "Creates an Effect Maker file.", + "trDisplayName": "Effect File (Effect Maker)", + "trDisplayCategory": "Effects", + "iconText": "qep", + "platformIndependent": true, + "enabled": true, + + "options": { "key": "DefaultSuffix", "value": "qep" }, + + "pages" : + [ + { + "trDisplayName": "Location", + "trShortTitle": "Location", + "typeId": "File" + }, + { + "trDisplayName": "Project Management", + "trShortTitle": "Summary", + "typeId": "Summary" + } + ], + "generators" : + [ + { + "typeId": "File", + "data": + { + "source": "file.qep", + "target": "%{JS: Util.fileName(value('TargetPath'), value('DefaultSuffix'))}", + "openInEditor": false + } + } + ] +} diff --git a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.cpp b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.cpp index c538b45272..3b013cc2d1 100644 --- a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.cpp +++ b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.cpp @@ -230,7 +230,7 @@ QObject *AssetsLibraryModel::rootDir() const bool AssetsLibraryModel::isEmpty() const { return m_isEmpty; -}; +} void AssetsLibraryModel::setIsEmpty(bool empty) { @@ -238,7 +238,7 @@ void AssetsLibraryModel::setIsEmpty(bool empty) m_isEmpty = empty; emit isEmptyChanged(); } -}; +} QVariant AssetsLibraryModel::data(const QModelIndex &index, int role) const { @@ -398,6 +398,13 @@ const QStringList &AssetsLibraryModel::supportedTexture3DSuffixes() return retList; } +const QStringList &AssetsLibraryModel::supportedEffectMakerSuffixes() +{ + // These are file types only supported by Effect Maker + static QStringList retList {"*.qep"}; + return retList; +} + const QSet &AssetsLibraryModel::supportedSuffixes() { static QSet allSuffixes; @@ -412,6 +419,7 @@ const QSet &AssetsLibraryModel::supportedSuffixes() insertSuffixes(supportedAudioSuffixes()); insertSuffixes(supportedVideoSuffixes()); insertSuffixes(supportedTexture3DSuffixes()); + insertSuffixes(supportedEffectMakerSuffixes()); } return allSuffixes; } diff --git a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.h b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.h index e964766f95..4e846f93af 100644 --- a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.h +++ b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.h @@ -66,6 +66,7 @@ public: static const QStringList &supportedAudioSuffixes(); static const QStringList &supportedVideoSuffixes(); static const QStringList &supportedTexture3DSuffixes(); + static const QStringList &supportedEffectMakerSuffixes(); static const QSet &supportedSuffixes(); const QSet &previewableSuffixes() const; diff --git a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp index 93057e6733..5d45617522 100644 --- a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp @@ -43,11 +43,18 @@ #include #include #include +#include "utils/environment.h" +#include "utils/filepath.h" +#include "utils/qtcprocess.h" #include #include #include +#include +#include +#include + #include #include #include @@ -64,6 +71,9 @@ #include #include +#include +#include + namespace QmlDesigner { static QString propertyEditorResourcesPath() @@ -141,11 +151,17 @@ AssetsLibraryWidget::AssetsLibraryWidget(AsynchronousImageCache &asynchronousFon // If project directory contents change, or one of the asset files is modified, we must // reconstruct the model to update the icons - connect(m_fileSystemWatcher, &Utils::FileSystemWatcher::directoryChanged, [this](const QString & changedDirPath) { + connect(m_fileSystemWatcher, &Utils::FileSystemWatcher::directoryChanged, + [this](const QString &changedDirPath) { Q_UNUSED(changedDirPath) m_assetCompressionTimer.start(); }); + connect(m_fileSystemWatcher, &Utils::FileSystemWatcher::fileChanged, + [](const QString &changeFilePath) { + QmlDesignerPlugin::instance()->emitAssetChanged(changeFilePath); + }); + auto layout = new QVBoxLayout(this); layout->setContentsMargins({}); layout->setSpacing(0); @@ -245,6 +261,48 @@ QSet AssetsLibraryWidget::supportedAssetSuffixes(bool complex) return suffixes; } +void AssetsLibraryWidget::openEffectMaker(const QString &filePath) +{ + const ProjectExplorer::Target *target = ProjectExplorer::ProjectTree::currentTarget(); + if (!target) { + qWarning() << __FUNCTION__ << "No project open"; + return; + } + + Utils::FilePath projectPath = target->project()->projectDirectory(); + QString effectName = QFileInfo(filePath).baseName(); + QString effectResDir = "asset_imports/Effects/" + effectName; + Utils::FilePath effectResPath = projectPath.resolvePath(effectResDir); + if (!effectResPath.exists()) + QDir(projectPath.toString()).mkpath(effectResDir); + + const QtSupport::QtVersion *baseQtVersion = QtSupport::QtKitAspect::qtVersion(target->kit()); + if (baseQtVersion) { + auto effectMakerPath = baseQtVersion->binPath().pathAppended("QQEffectMaker").withExecutableSuffix(); + if (!effectMakerPath.exists()) { + qWarning() << __FUNCTION__ << "Cannot find EffectMaker app"; + return; + } + + Utils::FilePath effectPath = Utils::FilePath::fromString(filePath); + QString effectContents = QString::fromUtf8(effectPath.fileContents()); + QStringList arguments; + arguments << filePath; + if (effectContents.isEmpty()) + arguments << "--create"; + arguments << "--exportpath" << effectResPath.toString(); + + Utils::Environment env = Utils::Environment::systemEnvironment(); + if (env.osType() == Utils::OsTypeMac) + env.appendOrSet("QSG_RHI_BACKEND", "metal"); + + m_qqemProcess.reset(new Utils::QtcProcess); + m_qqemProcess->setEnvironment(env); + m_qqemProcess->setCommand({ effectMakerPath, arguments }); + m_qqemProcess->start(); + } +} + void AssetsLibraryWidget::setModel(Model *model) { m_model = model; @@ -316,6 +374,9 @@ QPair AssetsLibraryWidget::getAssetTypeAndData(const QStrin } else if (AssetsLibraryModel::supportedTexture3DSuffixes().contains(suffix)) { // Data: Image format (suffix) return {Constants::MIME_TYPE_ASSET_TEXTURE3D, suffix.toUtf8()}; + } else if (AssetsLibraryModel::supportedEffectMakerSuffixes().contains(suffix)) { + // Data: Effect Maker format (suffix) + return {Constants::MIME_TYPE_ASSET_EFFECT, suffix.toUtf8()}; } } return {}; diff --git a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.h b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.h index 29ba7d0349..dcec0f9414 100644 --- a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.h +++ b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.h @@ -42,7 +42,10 @@ QT_BEGIN_NAMESPACE class QShortcut; QT_END_NAMESPACE -namespace Utils { class FileSystemWatcher; } +namespace Utils { + class FileSystemWatcher; + class QtcProcess; +} namespace QmlDesigner { @@ -83,6 +86,7 @@ public: const QList &complexFilePaths, const QString &targetDirPath = {}); Q_INVOKABLE QSet supportedAssetSuffixes(bool complex); + Q_INVOKABLE void openEffectMaker(const QString &filePath); signals: void itemActivated(const QString &itemName); @@ -114,6 +118,8 @@ private: bool m_updateRetry = false; QString m_filterText; QPoint m_dragStartPoint; + + std::unique_ptr m_qqemProcess; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h b/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h index 884a4f4413..92594f6ab4 100644 --- a/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h +++ b/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h @@ -233,8 +233,8 @@ const char addShadersDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResource const char add3DAssetsDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources", "3D Assets"); const char addQt3DSPresentationsDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources", "Qt 3D Studio Presentations"); - -const char addCustomEffectDialogDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources", "Add Custom Effect"); +const char addCustomEffectDialogDisplayString[] = QT_TRANSLATE_NOOP("QmlDesignerAddResources", + "Effect Maker Files"); } //ComponentCoreConstants diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp index 5724d5d100..0e442918da 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp @@ -1614,8 +1614,21 @@ void updateImported3DAsset(const SelectionContext &selectionContext) if (selectionContext.view()) { selectionContext.view()->emitCustomNotification( "UpdateImported3DAsset", {selectionContext.currentSingleSelectedNode()}); + } +} +Utils::FilePath getEffectsDirectory() +{ + QString defaultDir = "asset_imports/Effects"; + Utils::FilePath projectPath = QmlDesignerPlugin::instance()->documentManager().currentProjectDirPath(); + Utils::FilePath effectsPath = projectPath.pathAppended(defaultDir); + + if (!effectsPath.exists()) { + QDir dir(projectPath.toString()); + dir.mkpath(defaultDir); } + + return effectsPath; } } // namespace ModelNodeOperations diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h index 953062573c..0b1b298a6f 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h @@ -27,6 +27,8 @@ #include "selectioncontext.h" +#include + namespace QmlDesigner { enum class AddFilesResult { Succeeded, Failed, Cancelled }; @@ -77,7 +79,7 @@ void addItemToStackedContainer(const SelectionContext &selectionContext); void increaseIndexOfStackedContainer(const SelectionContext &selectionContext); void decreaseIndexOfStackedContainer(const SelectionContext &selectionContext); void addTabBarToStackedContainer(const SelectionContext &selectionContext); -AddFilesResult addFilesToProject(const QStringList &fileNames, const QString &defaultDirectory); +QMLDESIGNERCORE_EXPORT AddFilesResult addFilesToProject(const QStringList &fileNames, const QString &defaultDirectory); AddFilesResult addImageToProject(const QStringList &fileNames, const QString &directory); AddFilesResult addFontToProject(const QStringList &fileNames, const QString &directory); AddFilesResult addSoundToProject(const QStringList &fileNames, const QString &directory); @@ -98,6 +100,8 @@ void addMouseAreaFill(const SelectionContext &selectionContext); void openSignalDialog(const SelectionContext &selectionContext); void updateImported3DAsset(const SelectionContext &selectionContext); +QMLDESIGNERCORE_EXPORT Utils::FilePath getEffectsDirectory(); + // ModelNodePreviewImageOperations QVariant previewImageDataForGenericNode(const ModelNode &modelNode); QVariant previewImageDataForImageNode(const ModelNode &modelNode); diff --git a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp index 9f24e7d0e9..cab4a05131 100644 --- a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp @@ -242,7 +242,8 @@ void AbstractFormEditorTool::dragEnterEvent(const QList &itemLis for (const QString &assetPath : assetPaths) { QString assetType = AssetsLibraryWidget::getAssetTypeAndData(assetPath).first; if (assetType == Constants::MIME_TYPE_ASSET_IMAGE - || assetType == Constants::MIME_TYPE_ASSET_FONT) { + || assetType == Constants::MIME_TYPE_ASSET_FONT + || assetType == Constants::MIME_TYPE_ASSET_EFFECT) { hasValidAssets = true; break; } diff --git a/src/plugins/qmldesigner/components/formeditor/dragtool.cpp b/src/plugins/qmldesigner/components/formeditor/dragtool.cpp index 819bf58b34..290e9f2193 100644 --- a/src/plugins/qmldesigner/components/formeditor/dragtool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/dragtool.cpp @@ -240,38 +240,64 @@ static bool hasItemLibraryInfo(const QMimeData *mimeData) return mimeData->hasFormat(Constants::MIME_TYPE_ITEM_LIBRARY_INFO); } -void DragTool::dropEvent(const QList &/*itemList*/, QGraphicsSceneDragDropEvent *event) +void DragTool::dropEvent(const QList &itemList, QGraphicsSceneDragDropEvent *event) { if (canBeDropped(event->mimeData())) { event->accept(); end(generateUseSnapping(event->modifiers())); + QString effectPath; + const QStringList assetPaths = QString::fromUtf8(event->mimeData() + ->data(Constants::MIME_TYPE_ASSETS)).split(','); + for (auto &path : assetPaths) { + auto assetType = AssetsLibraryWidget::getAssetTypeAndData(path).first; + if (assetType == Constants::MIME_TYPE_ASSET_EFFECT) { + effectPath = path; + break; + } + } + bool resetPuppet = false; - for (auto &node : m_dragNodes) { - if (node.isValid()) { - if ((node.instanceParentItem().isValid() - && node.instanceParent().modelNode().metaInfo().isLayoutable()) - || node.isFlowItem()) { - node.removeProperty("x"); - node.removeProperty("y"); - resetPuppet = true; + + if (!effectPath.isEmpty()) { + FormEditorItem *targetContainerFormEditorItem = targetContainerOrRootItem(itemList); + if (targetContainerFormEditorItem) { + QmlItemNode parentQmlItemNode = targetContainerFormEditorItem->qmlItemNode(); + QString effectName = QFileInfo(effectPath).baseName(); + QmlItemNode effectNode = QmlItemNode::createQmlItemNodeForEffect(view(), parentQmlItemNode, effectName); + + view()->setSelectedModelNodes({effectNode}); + view()->resetPuppet(); + + commitTransaction(); + } + } else { + for (QmlItemNode &node : m_dragNodes) { + if (node.isValid()) { + if ((node.instanceParentItem().isValid() + && node.instanceParent().modelNode().metaInfo().isLayoutable()) + || node.isFlowItem()) { + node.removeProperty("x"); + node.removeProperty("y"); + resetPuppet = true; + } } } - } - if (resetPuppet) - view()->resetPuppet(); // Otherwise the layout might not reposition the items + if (resetPuppet) + view()->resetPuppet(); // Otherwise the layout might not reposition the items - commitTransaction(); + commitTransaction(); - if (!m_dragNodes.isEmpty()) { - QList nodeList; - for (auto &node : std::as_const(m_dragNodes)) { - if (node.isValid()) - nodeList.append(node); + if (!m_dragNodes.isEmpty()) { + QList nodeList; + for (auto &node : std::as_const(m_dragNodes)) { + if (node.isValid()) + nodeList.append(node); + } + view()->setSelectedModelNodes(nodeList); } - view()->setSelectedModelNodes(nodeList); + m_dragNodes.clear(); } - m_dragNodes.clear(); view()->changeToSelectionTool(); } @@ -347,10 +373,17 @@ void DragTool::createDragNodes(const QMimeData *mimeData, const QPointF &scenePo void DragTool::dragMoveEvent(const QList &itemList, QGraphicsSceneDragDropEvent *event) { - if (!m_blockMove && !m_isAborted && canBeDropped(event->mimeData())) { + FormEditorItem *targetContainerItem = targetContainerOrRootItem(itemList); + const QStringList assetPaths = QString::fromUtf8(event->mimeData() + ->data(Constants::MIME_TYPE_ASSETS)).split(','); + QString assetType = AssetsLibraryWidget::getAssetTypeAndData(assetPaths[0]).first; + + if (!m_blockMove + && !m_isAborted + && canBeDropped(event->mimeData()) + && assetType != Constants::MIME_TYPE_ASSET_EFFECT) { event->accept(); if (!m_dragNodes.isEmpty()) { - FormEditorItem *targetContainerItem = targetContainerOrRootItem(itemList); if (targetContainerItem) { move(event->scenePos(), itemList); } else { @@ -364,7 +397,7 @@ void DragTool::dragMoveEvent(const QList &itemList, QGraphicsSc } else { createDragNodes(event->mimeData(), event->scenePos(), itemList); } - } else { + } else if (assetType != Constants::MIME_TYPE_ASSET_EFFECT) { event->ignore(); } } diff --git a/src/plugins/qmldesigner/designercore/include/qmlitemnode.h b/src/plugins/qmldesigner/designercore/include/qmlitemnode.h index 3a3498e6c9..5406f81918 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlitemnode.h +++ b/src/plugins/qmldesigner/designercore/include/qmlitemnode.h @@ -81,7 +81,9 @@ public: const QPointF &position, NodeAbstractProperty parentproperty, bool executeInTransaction = true); - + static QmlItemNode createQmlItemNodeForEffect(AbstractView *view, + const QmlItemNode &parentNode, + const QString &effectName); QList children() const; QList resources() const; QList allDirectSubNodes() const; diff --git a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp index 6580c4005b..09a94719f4 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp @@ -181,6 +181,33 @@ QmlItemNode QmlItemNode::createQmlItemNodeFromFont(AbstractView *view, return newQmlItemNode; } +QmlItemNode QmlItemNode::createQmlItemNodeForEffect(AbstractView *view, + const QmlItemNode &parentNode, + const QString &effectName) +{ + QmlItemNode newQmlItemNode; + + QmlDesigner::Import import = Import::createLibraryImport("Effects." + effectName, "1.0"); + try { + if (!view->model()->hasImport(import, true, true)) + view->model()->changeImports({import}, {}); + } catch (const Exception &e) { + QTC_ASSERT(false, return QmlItemNode()); + } + + TypeName type(effectName.toUtf8()); + newQmlItemNode = QmlItemNode(view->createModelNode(type, 1, 0)); + NodeAbstractProperty parentProperty = parentNode.defaultNodeAbstractProperty(); + parentProperty.reparentHere(newQmlItemNode); + + newQmlItemNode.modelNode().bindingProperty("source").setExpression("parent"); + newQmlItemNode.modelNode().bindingProperty("anchors.fill").setExpression("parent"); + + QTC_ASSERT(newQmlItemNode.isValid(), return QmlItemNode()); + + return newQmlItemNode; +} + bool QmlItemNode::isValid() const { return isValidQmlItemNode(modelNode()); diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 8e9b684430..e4d9c624e9 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -530,10 +530,6 @@ public: qDebug() << astTypeNode->name.toString() << typeName; qDebug() << metaInfo.isValid() << metaInfo.typeName(); qDebug() << metaInfo.directSuperClass().typeName(); - - if (!metaInfo.isFileComponent() && m_model == m_model->metaInfoProxyModel() - && metaInfo.isValid()) - throw RewritingException(__LINE__, __FUNCTION__, __FILE__, "test", "test"); } typeName = QString::fromUtf8(metaInfo.typeName()); @@ -1961,7 +1957,7 @@ void ModelValidator::typeDiffers(bool /*isRootNode*/, Q_UNUSED(minorVersion) Q_UNUSED(majorVersion) - QTC_ASSERT(modelNode.type() == typeName, return ); + QTC_ASSERT(modelNode.type() == typeName, return); if (modelNode.majorVersion() != majorVersion) { qDebug() << Q_FUNC_INFO << modelNode; diff --git a/src/plugins/qmldesigner/qmldesignerconstants.h b/src/plugins/qmldesigner/qmldesignerconstants.h index 45dbda6b96..40c751ed98 100644 --- a/src/plugins/qmldesigner/qmldesignerconstants.h +++ b/src/plugins/qmldesigner/qmldesignerconstants.h @@ -105,6 +105,7 @@ const char MIME_TYPE_ASSET_SOUND[] = "application/vnd.qtdesignstudio.asset const char MIME_TYPE_ASSET_VIDEO[] = "application/vnd.qtdesignstudio.asset.video"; const char MIME_TYPE_ASSET_TEXTURE3D[] = "application/vnd.qtdesignstudio.asset.texture3d"; const char MIME_TYPE_MODELNODE_LIST[] = "application/vnd.qtdesignstudio.modelnode.list"; +const char MIME_TYPE_ASSET_EFFECT[] = "application/vnd.qtdesignstudio.asset.effect"; // Menus const char M_VIEW_WORKSPACES[] = "QmlDesigner.Menu.View.Workspaces"; diff --git a/src/plugins/qmldesigner/qmldesignerplugin.cpp b/src/plugins/qmldesigner/qmldesignerplugin.cpp index 6226e54e80..d8c71fcd05 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.cpp +++ b/src/plugins/qmldesigner/qmldesignerplugin.cpp @@ -641,6 +641,11 @@ void QmlDesignerPlugin::emitCurrentTextEditorChanged(Core::IEditor *editor) d->blockEditorChange = false; } +void QmlDesignerPlugin::emitAssetChanged(const QString &assetPath) +{ + emit assetChanged(assetPath); +} + double QmlDesignerPlugin::formEditorDevicePixelRatio() { if (QmlDesignerPlugin::settings().value(DesignerSettingsKey::IGNORE_DEVICE_PIXEL_RATIO).toBool()) diff --git a/src/plugins/qmldesigner/qmldesignerplugin.h b/src/plugins/qmldesigner/qmldesignerplugin.h index 976b9d57c0..aa5fe25001 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.h +++ b/src/plugins/qmldesigner/qmldesignerplugin.h @@ -85,6 +85,8 @@ public: void switchToTextModeDeferred(); void emitCurrentTextEditorChanged(Core::IEditor *editor); + void emitAssetChanged(const QString &assetPath); + static double formEditorDevicePixelRatio(); static void emitUsageStatistics(const QString &identifier); @@ -101,7 +103,7 @@ public: signals: void usageStatisticsNotifier(const QString &identifier); void usageStatisticsUsageTimer(const QString &identifier, int elapsed); - + void assetChanged(const QString &assetPath); private: // functions void integrateIntoQtCreator(QWidget *modeWidget); -- cgit v1.2.3