diff options
Diffstat (limited to 'src/plugins/qmldesigner/components')
7 files changed, 89 insertions, 48 deletions
diff --git a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.cpp b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.cpp index 3b013cc2d1..c52eaa42a2 100644 --- a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.cpp +++ b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.cpp @@ -86,6 +86,13 @@ bool AssetsLibraryModel::loadExpandedState(const QString &assetPath) return m_expandedStateHash.value(assetPath, true); } +bool AssetsLibraryModel::isEffectQmlExist(const QString &effectName) +{ + Utils::FilePath effectsResDir = ModelNodeOperations::getEffectsDirectory(); + Utils::FilePath qmlPath = effectsResDir.resolvePath(effectName + "/" + effectName + ".qml"); + return qmlPath.exists(); +} + AssetsLibraryModel::DirExpandState AssetsLibraryModel::getAllExpandedState() const { const auto keys = m_expandedStateHash.keys(); diff --git a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.h b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.h index 4e846f93af..794b7fb127 100644 --- a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.h +++ b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarymodel.h @@ -74,6 +74,8 @@ public: static void saveExpandedState(bool expanded, const QString &assetPath); static bool loadExpandedState(const QString &assetPath); + static bool isEffectQmlExist(const QString &effectName); + enum class DirExpandState { SomeExpanded, AllExpanded, diff --git a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp index 5d45617522..2d967eeb4c 100644 --- a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp +++ b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.cpp @@ -45,7 +45,6 @@ #include <utils/utilsicons.h> #include "utils/environment.h" #include "utils/filepath.h" -#include "utils/qtcprocess.h" #include <coreplugin/coreconstants.h> #include <coreplugin/icore.h> @@ -71,9 +70,6 @@ #include <QQmlContext> #include <QQuickItem> -#include <qtsupport/baseqtversion.h> -#include <qtsupport/qtkitinformation.h> - namespace QmlDesigner { static QString propertyEditorResourcesPath() @@ -263,44 +259,7 @@ QSet<QString> AssetsLibraryWidget::supportedAssetSuffixes(bool complex) 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(); - } + ModelNodeOperations::openEffectMaker(filePath); } void AssetsLibraryWidget::setModel(Model *model) diff --git a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.h b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.h index dcec0f9414..cdc11f43af 100644 --- a/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.h +++ b/src/plugins/qmldesigner/components/assetslibrary/assetslibrarywidget.h @@ -44,7 +44,6 @@ QT_END_NAMESPACE namespace Utils { class FileSystemWatcher; - class QtcProcess; } namespace QmlDesigner { @@ -118,8 +117,6 @@ private: bool m_updateRetry = false; QString m_filterText; QPoint m_dragStartPoint; - - std::unique_ptr<Utils::QtcProcess> m_qqemProcess; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp index 0e442918da..243510a9f3 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp @@ -69,11 +69,15 @@ #include <projectexplorer/project.h> #include <projectexplorer/projectnodes.h> #include <projectexplorer/projecttree.h> -#include "projectexplorer/session.h" +#include "projectexplorer/target.h" + +#include <qtsupport/baseqtversion.h> +#include <qtsupport/qtkitinformation.h> #include <utils/algorithm.h> #include <utils/fileutils.h> #include <utils/qtcassert.h> +#include "utils/qtcprocess.h" #include <QComboBox> #include <QCoreApplication> @@ -1617,6 +1621,52 @@ void updateImported3DAsset(const SelectionContext &selectionContext) } } +void 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"); + + Utils::QtcProcess *qqemProcess = new Utils::QtcProcess(); + qqemProcess->setEnvironment(env); + qqemProcess->setCommand({ effectMakerPath, arguments }); + qqemProcess->start(); + + QObject::connect(qqemProcess, &Utils::QtcProcess::done, [qqemProcess]() { + qqemProcess->deleteLater(); + }); + } +} + Utils::FilePath getEffectsDirectory() { QString defaultDir = "asset_imports/Effects"; diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h index 0b1b298a6f..7c4aa60d8f 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.h @@ -101,6 +101,7 @@ void openSignalDialog(const SelectionContext &selectionContext); void updateImported3DAsset(const SelectionContext &selectionContext); QMLDESIGNERCORE_EXPORT Utils::FilePath getEffectsDirectory(); +void openEffectMaker(const QString &filePath); // ModelNodePreviewImageOperations QVariant previewImageDataForGenericNode(const ModelNode &modelNode); diff --git a/src/plugins/qmldesigner/components/formeditor/dragtool.cpp b/src/plugins/qmldesigner/components/formeditor/dragtool.cpp index 290e9f2193..b40ad0eaaa 100644 --- a/src/plugins/qmldesigner/components/formeditor/dragtool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/dragtool.cpp @@ -28,7 +28,9 @@ #include "formeditorscene.h" #include "formeditorview.h" #include "assetslibrarywidget.h" +#include "assetslibrarymodel.h" #include <metainfo.h> +#include <modelnodeoperations.h> #include <nodehints.h> #include <rewritingexception.h> #include "qmldesignerconstants.h" @@ -41,6 +43,7 @@ #include <QMimeData> #include <QTimer> #include <QWidget> +#include <QMessageBox> static Q_LOGGING_CATEGORY(dragToolInfo, "qtc.qmldesigner.formeditor", QtWarningMsg); @@ -264,9 +267,31 @@ void DragTool::dropEvent(const QList<QGraphicsItem *> &itemList, QGraphicsSceneD if (targetContainerFormEditorItem) { QmlItemNode parentQmlItemNode = targetContainerFormEditorItem->qmlItemNode(); QString effectName = QFileInfo(effectPath).baseName(); - QmlItemNode effectNode = QmlItemNode::createQmlItemNodeForEffect(view(), parentQmlItemNode, effectName); - view()->setSelectedModelNodes({effectNode}); + if (!AssetsLibraryModel::isEffectQmlExist(effectName)) { + QMessageBox msgBox; + msgBox.setText("Effect " + effectName + " is empty"); + msgBox.setInformativeText("Do you want to edit " + effectName + "?"); + msgBox.setStandardButtons(QMessageBox::No |QMessageBox::Yes); + msgBox.setDefaultButton(QMessageBox::Yes); + msgBox.setIcon(QMessageBox::Question); + int ret = msgBox.exec(); + switch (ret) { + case QMessageBox::Yes: + ModelNodeOperations::openEffectMaker(effectPath); + break; + default: + break; + } + + event->ignore(); + return; + } + + QmlItemNode effectNode = QmlItemNode:: + createQmlItemNodeForEffect(view(), parentQmlItemNode, effectName); + + view()->setSelectedModelNodes({parentQmlItemNode}); view()->resetPuppet(); commitTransaction(); |