diff --git a/share/qtcreator/qmldesigner/effectMakerQmlSources/EffectMakerPreview.qml b/share/qtcreator/qmldesigner/effectMakerQmlSources/EffectMakerPreview.qml index f2b352ba4d1..c23e95e5628 100644 --- a/share/qtcreator/qmldesigner/effectMakerQmlSources/EffectMakerPreview.qml +++ b/share/qtcreator/qmldesigner/effectMakerQmlSources/EffectMakerPreview.qml @@ -17,6 +17,8 @@ Column { required property Item mainRoot property var effectMakerModel: EffectMakerBackend.effectMakerModel property alias source: source + // The delay in ms to wait until updating the effect + readonly property int updateDelay: 200 Rectangle { // toolbar width: parent.width @@ -160,7 +162,7 @@ Column { try { const newObject = Qt.createQmlObject( - effectMakerModel.qmlComponentString, //TODO + effectMakerModel.qmlComponentString, componentParent, "" ); @@ -178,11 +180,19 @@ Column { } } + Connections { + target: effectMakerModel + function onShadersBaked() { + console.log("Shaders Baked!") + //updateTimer.restart(); // Disable for now + } + } + Timer { id: updateTimer - interval: effectMakerModel.effectUpdateDelay(); //TODO + interval: updateDelay; onTriggered: { - effectMakerModel.updateQmlComponent(); //TODO + effectMakerModel.updateQmlComponent(); createNewComponent(); } } diff --git a/src/plugins/effectmakernew/effectmakermodel.cpp b/src/plugins/effectmakernew/effectmakermodel.cpp index 8b1836a5afa..9f86025207a 100644 --- a/src/plugins/effectmakernew/effectmakermodel.cpp +++ b/src/plugins/effectmakernew/effectmakermodel.cpp @@ -104,6 +104,8 @@ void EffectMakerModel::addNode(const QString &nodeQenPath) endInsertRows(); setIsEmpty(false); + + bakeShaders(); } void EffectMakerModel::moveNode(int fromIdx, int toIdx) @@ -115,6 +117,8 @@ void EffectMakerModel::moveNode(int fromIdx, int toIdx) beginMoveRows({}, fromIdx, fromIdx, {}, toIdxAdjusted); m_nodes.move(fromIdx, toIdx); endMoveRows(); + + bakeShaders(); } void EffectMakerModel::removeNode(int idx) @@ -127,6 +131,8 @@ void EffectMakerModel::removeNode(int idx) if (m_nodes.isEmpty()) setIsEmpty(true); + else + bakeShaders(); } void EffectMakerModel::updateBakedShaderVersions() @@ -170,6 +176,11 @@ void EffectMakerModel::setVertexShader(const QString &newVertexShader) m_vertexShader = newVertexShader; } +const QString &EffectMakerModel::qmlComponentString() const +{ + return m_qmlComponentString; +} + const QList EffectMakerModel::allUniforms() { QList uniforms = {}; @@ -601,7 +612,7 @@ QString EffectMakerModel::generateVertexShader(bool includeUniforms) const bool removeTags = includeUniforms; s += getDefineProperties(); - s += getConstVariables(); + // s += getConstVariables(); // Not sure yet, will check on this later // When the node is complete, add shader code in correct nodes order // split to root and main parts @@ -661,7 +672,7 @@ QString EffectMakerModel::generateFragmentShader(bool includeUniforms) const bool removeTags = includeUniforms; s += getDefineProperties(); - s += getConstVariables(); + // s += getConstVariables(); // Not sure yet, will check on this later // When the node is complete, add shader code in correct nodes order // split to root and main parts @@ -787,14 +798,14 @@ void EffectMakerModel::bakeShaders() // First update the features based on shader content // This will make sure that next calls to "generate" will produce correct uniforms. - m_shaderFeatures.update(generateVertexShader(false), generateFragmentShader(false), m_previewEffectPropertiesString); + m_shaderFeatures.update(generateVertexShader(false), generateFragmentShader(false), + m_previewEffectPropertiesString); updateCustomUniforms(); setVertexShader(generateVertexShader()); QString vs = m_vertexShader; m_baker.setSourceString(vs.toUtf8(), QShader::VertexStage); - QShader vertShader = m_baker.bake(); if (!vertShader.isValid()) { qWarning() << "Shader baking failed:" << qPrintable(m_baker.errorMessage()); @@ -840,5 +851,20 @@ void EffectMakerModel::setShadersUpToDate(bool UpToDate) emit shadersUpToDateChanged(); } +QString EffectMakerModel::getQmlComponentString(bool localFiles) +{ + Q_UNUSED(localFiles) + + // TODO + return QString(); +} + +void EffectMakerModel::updateQmlComponent() +{ + // Clear possible QML runtime errors + resetEffectError(ErrorQMLRuntime); + m_qmlComponentString = getQmlComponentString(false); +} + } // namespace EffectMaker diff --git a/src/plugins/effectmakernew/effectmakermodel.h b/src/plugins/effectmakernew/effectmakermodel.h index aa418df303e..af093de1814 100644 --- a/src/plugins/effectmakernew/effectmakermodel.h +++ b/src/plugins/effectmakernew/effectmakermodel.h @@ -36,6 +36,8 @@ class EffectMakerModel : public QAbstractListModel Q_PROPERTY(bool isEmpty MEMBER m_isEmpty NOTIFY isEmptyChanged) Q_PROPERTY(int selectedIndex MEMBER m_selectedIndex NOTIFY selectedIndexChanged) Q_PROPERTY(bool shadersUpToDate READ shadersUpToDate WRITE setShadersUpToDate NOTIFY shadersUpToDateChanged) + Q_PROPERTY(QString qmlComponentString READ qmlComponentString) + public: EffectMakerModel(QObject *parent = nullptr); @@ -61,6 +63,11 @@ public: QString vertexShader() const; void setVertexShader(const QString &newVertexShader); + const QString &qmlComponentString() const; + void setQmlComponentString(const QString &string); + + Q_INVOKABLE void updateQmlComponent(); + signals: void isEmptyChanged(); void selectedIndexChanged(int idx); @@ -117,6 +124,8 @@ private: void updateCustomUniforms(); void bakeShaders(); + QString getQmlComponentString(bool localFiles); + QList m_nodes; int m_selectedIndex = -1; @@ -139,6 +148,7 @@ private: QString m_exportedEffectPropertiesString; // Used in preview QML, at ShaderEffect component of the file QString m_previewEffectPropertiesString; + QString m_qmlComponentString; const QRegularExpression m_spaceReg = QRegularExpression("\\s+"); };