diff options
author | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2023-12-05 16:05:06 +0200 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2023-12-07 08:37:29 +0000 |
commit | b5370c435eabc647e30e5dd366d668b65a076a04 (patch) | |
tree | 7d906bd49028b63d18b1629610e42308c3aa71ec | |
parent | 9184db8dfb3ef71b6c54815f937387e5d959cadb (diff) |
EffectMaker: Block adding same effect node twice
The actual blocking is done at uniform level, as the problem of having
same effect node twice is duplicate uniforms.
Fixes: QDS-11470
Change-Id: I77b15b4a207efaebff39b4f6b1700d70262abcdb
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
Reviewed-by: Qt CI Patch Build Bot <ci_patchbuild_bot@qt.io>
-rw-r--r-- | share/qtcreator/qmldesigner/effectMakerQmlSources/EffectNode.qml | 18 | ||||
-rw-r--r-- | src/plugins/effectmakernew/effectmakermodel.cpp | 22 | ||||
-rw-r--r-- | src/plugins/effectmakernew/effectmakermodel.h | 5 | ||||
-rw-r--r-- | src/plugins/effectmakernew/effectmakernodesmodel.cpp | 21 | ||||
-rw-r--r-- | src/plugins/effectmakernew/effectmakernodesmodel.h | 3 | ||||
-rw-r--r-- | src/plugins/effectmakernew/effectmakerwidget.cpp | 4 | ||||
-rw-r--r-- | src/plugins/effectmakernew/effectnode.cpp | 21 | ||||
-rw-r--r-- | src/plugins/effectmakernew/effectnode.h | 11 |
8 files changed, 92 insertions, 13 deletions
diff --git a/share/qtcreator/qmldesigner/effectMakerQmlSources/EffectNode.qml b/share/qtcreator/qmldesigner/effectMakerQmlSources/EffectNode.qml index 8ae703adb7..f3fca1ccec 100644 --- a/share/qtcreator/qmldesigner/effectMakerQmlSources/EffectNode.qml +++ b/share/qtcreator/qmldesigner/effectMakerQmlSources/EffectNode.qml @@ -15,20 +15,22 @@ Rectangle { width: 140 height: 32 - color: mouseArea.containsMouse ? StudioTheme.Values.themeControlBackgroundInteraction - : "transparent" + color: mouseArea.containsMouse && modelData.canBeAdded + ? StudioTheme.Values.themeControlBackgroundInteraction : "transparent" signal addEffectNode(var nodeQenPath) - MouseArea { + ToolTipArea { id: mouseArea anchors.fill: parent - hoverEnabled: true acceptedButtons: Qt.LeftButton + tooltip: modelData.canBeAdded ? "" : qsTr("Existing effect has conflicting properties, this effect cannot be added.") + onClicked: { - root.addEffectNode(modelData.nodeQenPath) + if (modelData.canBeAdded) + root.addEffectNode(modelData.nodeQenPath) } } @@ -41,13 +43,15 @@ Rectangle { width: 32 height: 32 - color: StudioTheme.Values.themeTextColor + color: modelData.canBeAdded ? StudioTheme.Values.themeTextColor + : StudioTheme.Values.themeTextColorDisabled source: modelData.nodeIcon } Text { text: modelData.nodeName - color: StudioTheme.Values.themeTextColor + color: modelData.canBeAdded ? StudioTheme.Values.themeTextColor + : StudioTheme.Values.themeTextColorDisabled font.pointSize: StudioTheme.Values.smallFontSize anchors.verticalCenter: nodeIcon.verticalCenter } diff --git a/src/plugins/effectmakernew/effectmakermodel.cpp b/src/plugins/effectmakernew/effectmakermodel.cpp index 58f46b2b1f..f71fa1d75f 100644 --- a/src/plugins/effectmakernew/effectmakermodel.cpp +++ b/src/plugins/effectmakernew/effectmakermodel.cpp @@ -112,6 +112,8 @@ void EffectMakerModel::addNode(const QString &nodeQenPath) setIsEmpty(false); bakeShaders(); + + emit nodesChanged(); } void EffectMakerModel::moveNode(int fromIdx, int toIdx) @@ -138,6 +140,8 @@ void EffectMakerModel::removeNode(int idx) setIsEmpty(true); else bakeShaders(); + + emit nodesChanged(); } void EffectMakerModel::clear() @@ -148,6 +152,7 @@ void EffectMakerModel::clear() endResetModel(); setIsEmpty(true); + emit nodesChanged(); } QString EffectMakerModel::fragmentShader() const @@ -181,7 +186,7 @@ const QString &EffectMakerModel::qmlComponentString() const return m_qmlComponentString; } -const QList<Uniform *> EffectMakerModel::allUniforms() +const QList<Uniform *> EffectMakerModel::allUniforms() const { QList<Uniform *> uniforms = {}; for (const auto &node : std::as_const(m_nodes)) @@ -604,10 +609,6 @@ void EffectMakerModel::openComposition(const QString &path) return; } - // Get effects dir - const Utils::FilePath effectsResDir = QmlDesigner::ModelNodeOperations::getEffectsImportDirectory(); - const QString effectsResPath = effectsResDir.pathAppended(effectName).toString(); - if (json.contains("nodes") && json["nodes"].isArray()) { const QJsonArray nodesArray = json["nodes"].toArray(); for (const auto &nodeElement : nodesArray) { @@ -620,6 +621,8 @@ void EffectMakerModel::openComposition(const QString &path) setIsEmpty(m_nodes.isEmpty()); bakeShaders(); } + + emit nodesChanged(); } void EffectMakerModel::exportResources(const QString &name) @@ -1438,6 +1441,15 @@ void EffectMakerModel::setCurrentComposition(const QString &newCurrentCompositio emit currentCompositionChanged(); } +QStringList EffectMakerModel::uniformNames() const +{ + QStringList usedList; + const QList<Uniform *> uniforms = allUniforms(); + for (const auto uniform : uniforms) + usedList.append(uniform->name()); + return usedList; +} + void EffectMakerModel::updateQmlComponent() { // Clear possible QML runtime errors diff --git a/src/plugins/effectmakernew/effectmakermodel.h b/src/plugins/effectmakernew/effectmakermodel.h index 9582450d84..1f4284b081 100644 --- a/src/plugins/effectmakernew/effectmakermodel.h +++ b/src/plugins/effectmakernew/effectmakermodel.h @@ -89,6 +89,8 @@ public: QString currentComposition() const; void setCurrentComposition(const QString &newCurrentComposition); + QStringList uniformNames() const; + signals: void isEmptyChanged(); void selectedIndexChanged(int idx); @@ -97,6 +99,7 @@ signals: void shadersBaked(); void currentCompositionChanged(); + void nodesChanged(); private: enum Roles { @@ -116,7 +119,7 @@ private: bool isValidIndex(int idx) const; - const QList<Uniform *> allUniforms(); + const QList<Uniform *> allUniforms() const; const QString getBufUniform(); const QString getVSUniforms(); diff --git a/src/plugins/effectmakernew/effectmakernodesmodel.cpp b/src/plugins/effectmakernew/effectmakernodesmodel.cpp index dce99bba26..c6773faa09 100644 --- a/src/plugins/effectmakernew/effectmakernodesmodel.cpp +++ b/src/plugins/effectmakernew/effectmakernodesmodel.cpp @@ -52,6 +52,9 @@ QString EffectMakerNodesModel::nodesSourcesPath() const void EffectMakerNodesModel::loadModel() { + if (m_modelLoaded) + return; + auto nodesPath = Utils::FilePath::fromString(nodesSourcesPath()); if (!nodesPath.exists()) { @@ -88,6 +91,8 @@ void EffectMakerNodesModel::loadModel() return a->name() < b->name(); }); + m_modelLoaded = true; + resetModel(); } @@ -97,4 +102,20 @@ void EffectMakerNodesModel::resetModel() endResetModel(); } +void EffectMakerNodesModel::updateCanBeAdded(const QStringList &uniforms) +{ + for (const EffectNodesCategory *cat : std::as_const(m_categories)) { + const QList<EffectNode *> nodes = cat->nodes(); + for (EffectNode *node : nodes) { + bool match = false; + for (const QString &uniform : uniforms) { + match = node->hasUniform(uniform); + if (match) + break; + } + node->setCanBeAdded(!match); + } + } +} + } // namespace EffectMaker diff --git a/src/plugins/effectmakernew/effectmakernodesmodel.h b/src/plugins/effectmakernew/effectmakernodesmodel.h index 56400982da..7320ca729f 100644 --- a/src/plugins/effectmakernew/effectmakernodesmodel.h +++ b/src/plugins/effectmakernew/effectmakernodesmodel.h @@ -30,11 +30,14 @@ public: QList<EffectNodesCategory *> categories() const { return m_categories; } + void updateCanBeAdded(const QStringList &uniforms); + private: QString nodesSourcesPath() const; QList<EffectNodesCategory *> m_categories; bool m_probeNodesDir = false; + bool m_modelLoaded = false; }; } // namespace EffectMaker diff --git a/src/plugins/effectmakernew/effectmakerwidget.cpp b/src/plugins/effectmakernew/effectmakerwidget.cpp index 724ab04f89..e11b4015a1 100644 --- a/src/plugins/effectmakernew/effectmakerwidget.cpp +++ b/src/plugins/effectmakernew/effectmakerwidget.cpp @@ -76,6 +76,10 @@ EffectMakerWidget::EffectMakerWidget(EffectMakerView *view) {"rootView", QVariant::fromValue(this)}}); QmlDesigner::QmlDesignerPlugin::trackWidgetFocusTime( this, QmlDesigner::Constants::EVENT_NEWEFFECTMAKER_TIME); + + connect(m_effectMakerModel.data(), &EffectMakerModel::nodesChanged, [this]() { + m_effectMakerNodesModel->updateCanBeAdded(m_effectMakerModel->uniformNames()); + }); } diff --git a/src/plugins/effectmakernew/effectnode.cpp b/src/plugins/effectmakernew/effectnode.cpp index 292c04d13e..fc9d8ae7bf 100644 --- a/src/plugins/effectmakernew/effectnode.cpp +++ b/src/plugins/effectmakernew/effectnode.cpp @@ -2,6 +2,8 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #include "effectnode.h" +#include "compositionnode.h" +#include "uniform.h" #include <QDir> #include <QFileInfo> @@ -22,6 +24,12 @@ EffectNode::EffectNode(const QString &qenPath) iconPath = QStringLiteral("%1/%2").arg(parentDir.path(), "placeholder.svg"); } m_iconPath = QUrl::fromLocalFile(iconPath); + + CompositionNode node({}, qenPath); + const QList<Uniform *> uniforms = node.uniforms(); + + for (const Uniform *uniform : uniforms) + m_uniformNames.insert(uniform->name()); } QString EffectNode::name() const @@ -39,5 +47,18 @@ QString EffectNode::qenPath() const return m_qenPath; } +void EffectNode::setCanBeAdded(bool enabled) +{ + if (enabled != m_canBeAdded) { + m_canBeAdded = enabled; + emit canBeAddedChanged(); + } +} + +bool EffectNode::hasUniform(const QString &name) +{ + return m_uniformNames.contains(name); +} + } // namespace EffectMaker diff --git a/src/plugins/effectmakernew/effectnode.h b/src/plugins/effectmakernew/effectnode.h index 5c457e2a6d..864904e088 100644 --- a/src/plugins/effectmakernew/effectnode.h +++ b/src/plugins/effectmakernew/effectnode.h @@ -4,6 +4,7 @@ #pragma once #include <QObject> +#include <QSet> #include <QUrl> namespace EffectMaker { @@ -16,6 +17,7 @@ class EffectNode : public QObject Q_PROPERTY(QString nodeDescription MEMBER m_description CONSTANT) Q_PROPERTY(QUrl nodeIcon MEMBER m_iconPath CONSTANT) Q_PROPERTY(QString nodeQenPath MEMBER m_qenPath CONSTANT) + Q_PROPERTY(bool canBeAdded MEMBER m_canBeAdded NOTIFY canBeAddedChanged) public: EffectNode(const QString &qenPath); @@ -24,11 +26,20 @@ public: QString description() const; QString qenPath() const; + void setCanBeAdded(bool enabled); + + bool hasUniform(const QString &name); + +signals: + void canBeAddedChanged(); + private: QString m_name; QString m_description; QString m_qenPath; QUrl m_iconPath; + bool m_canBeAdded = true; + QSet<QString> m_uniformNames; }; } // namespace EffectMaker |