aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2023-12-05 16:05:06 +0200
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2023-12-07 08:37:29 +0000
commitb5370c435eabc647e30e5dd366d668b65a076a04 (patch)
tree7d906bd49028b63d18b1629610e42308c3aa71ec
parent9184db8dfb3ef71b6c54815f937387e5d959cadb (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.qml18
-rw-r--r--src/plugins/effectmakernew/effectmakermodel.cpp22
-rw-r--r--src/plugins/effectmakernew/effectmakermodel.h5
-rw-r--r--src/plugins/effectmakernew/effectmakernodesmodel.cpp21
-rw-r--r--src/plugins/effectmakernew/effectmakernodesmodel.h3
-rw-r--r--src/plugins/effectmakernew/effectmakerwidget.cpp4
-rw-r--r--src/plugins/effectmakernew/effectnode.cpp21
-rw-r--r--src/plugins/effectmakernew/effectnode.h11
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