diff --git a/share/qtcreator/qmldesigner/effectMakerQmlSources/EffectCompositionNode.qml b/share/qtcreator/qmldesigner/effectMakerQmlSources/EffectCompositionNode.qml index 0cb84e8c89c..d1bcd4fb454 100644 --- a/share/qtcreator/qmldesigner/effectMakerQmlSources/EffectCompositionNode.qml +++ b/share/qtcreator/qmldesigner/effectMakerQmlSources/EffectCompositionNode.qml @@ -12,26 +12,19 @@ import EffectMakerBackend HelperWidgets.Section { id: root - caption: model.nodeName + caption: nodeName category: "EffectMaker" -// TODO: implement effect properties -// property var propList: model.props - Column { - anchors.fill: parent - spacing: 2 + spacing: 10 - // Repeater { - // id: effects - // model: effectList - // width: parent.width - // height: parent.height - // delegate: Text { - // width: parent.width - // //height: StudioTheme.Values.checkIndicatorHeight * 2 // TODO: update or remove - // } - // } + Repeater { + model: nodeUniformsModel + + EffectCompositionNodeUniform { + width: root.width + } + } } } diff --git a/share/qtcreator/qmldesigner/effectMakerQmlSources/EffectCompositionNodeUniform.qml b/share/qtcreator/qmldesigner/effectMakerQmlSources/EffectCompositionNodeUniform.qml new file mode 100644 index 00000000000..8e12395c937 --- /dev/null +++ b/share/qtcreator/qmldesigner/effectMakerQmlSources/EffectCompositionNodeUniform.qml @@ -0,0 +1,81 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +import QtQuick +import QtQuick.Layouts +import QtQuickDesignerTheme +import HelperWidgets as HelperWidgets +import StudioControls as StudioControls +import StudioTheme 1.0 as StudioTheme +import EffectMakerBackend + +Item { + id: root + + height: 22 + + RowLayout { + spacing: 10 + anchors.fill: parent + + Text { + text: uniformName + color: StudioTheme.Values.themeTextColor + font.pointSize: StudioTheme.Values.smallFontSize + horizontalAlignment: Text.AlignRight + Layout.preferredWidth: 80 + } + + Loader { + sourceComponent: floatValue // TODO: set component based on prop type + Layout.fillWidth: true + } + } + + Component { + id: floatValue + + Row { + width: parent.width + spacing: 5 + + StudioControls.RealSpinBox { + id: spinBox + + width: 40 + actionIndicatorVisible: false + spinBoxIndicatorVisible: false + inputHAlignment: Qt.AlignHCenter + from: 21 + to: 78 + stepSize: 1 + onValueChanged: slider.value = realValue + } + + StudioControls.Slider { + id: slider + + width: parent.width - 60 + labels: false + actionIndicatorVisible: false + from: 21 + to: 78 + stepSize: 1 + onValueChanged: spinBox.realValue = value + } + } + } + + Component { // TODO + id: colorValue + + Row { + width: parent.width + spacing: 5 + + HelperWidgets.ColorEditor { + backendValue: "#ffff00" + } + } + } +} diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt index 59f15ef159b..f8bae184ee4 100644 --- a/src/plugins/qmldesigner/CMakeLists.txt +++ b/src/plugins/qmldesigner/CMakeLists.txt @@ -713,6 +713,7 @@ extend_qtc_plugin(QmlDesigner effectmakerview.cpp effectmakerview.h effectmakermodel.cpp effectmakermodel.h effectmakernodesmodel.cpp effectmakernodesmodel.h + effectmakeruniformsmodel.cpp effectmakeruniformsmodel.h effectnode.cpp effectnode.h effectnodescategory.cpp effectnodescategory.h compositionnode.cpp compositionnode.h diff --git a/src/plugins/qmldesigner/components/effectmaker/compositionnode.cpp b/src/plugins/qmldesigner/components/effectmaker/compositionnode.cpp index 0fdf105407f..cd88c224fe3 100644 --- a/src/plugins/qmldesigner/components/effectmaker/compositionnode.cpp +++ b/src/plugins/qmldesigner/components/effectmaker/compositionnode.cpp @@ -4,6 +4,7 @@ #include "compositionnode.h" #include "effectutils.h" +#include "effectmakeruniformsmodel.h" #include "uniform.h" #include @@ -33,6 +34,11 @@ QString CompositionNode::description() const return m_description; } +QObject *CompositionNode::uniformsModel() +{ + return &m_unifomrsModel; +} + void CompositionNode::parse(const QString &qenPath) { @@ -72,17 +78,8 @@ void CompositionNode::parse(const QString &qenPath) // parse properties QJsonArray properties = json.value("properties").toArray(); - for (const auto /*QJsonValueRef*/ &prop : properties) { - QJsonObject propObj = prop.toObject(); - Uniform *u = new Uniform(propObj); - Q_UNUSED(u) - - // TODO - propObj.value("name"); - propObj.value("type"); - propObj.value("defaultValue"); - propObj.value("description"); - } + for (const auto /*QJsonValueRef*/ &prop : properties) + m_unifomrsModel.addUniform(new Uniform(prop.toObject())); } } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/effectmaker/compositionnode.h b/src/plugins/qmldesigner/components/effectmaker/compositionnode.h index cc878a428c9..f50c09a9a44 100644 --- a/src/plugins/qmldesigner/components/effectmaker/compositionnode.h +++ b/src/plugins/qmldesigner/components/effectmaker/compositionnode.h @@ -3,15 +3,20 @@ #pragma once +#include "effectmakeruniformsmodel.h" + #include namespace QmlDesigner { +class Uniform; + class CompositionNode : public QObject { Q_OBJECT Q_PROPERTY(QString nodeName MEMBER m_name CONSTANT) + Q_PROPERTY(QObject *nodeUniformsModel READ uniformsModel NOTIFY uniformsModelChanged) public: CompositionNode(const QString &qenPath); @@ -20,6 +25,11 @@ public: QString vertexCode() const; QString description() const; + QObject *uniformsModel(); + +signals: + void uniformsModelChanged(); + private: void parse(const QString &qenPath); @@ -27,6 +37,8 @@ private: QString m_fragmentCode; QString m_vertexCode; QString m_description; + + EffectMakerUniformsModel m_unifomrsModel; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/effectmaker/effectmakermodel.cpp b/src/plugins/qmldesigner/components/effectmaker/effectmakermodel.cpp index db0754bed4d..50879021938 100644 --- a/src/plugins/qmldesigner/components/effectmaker/effectmakermodel.cpp +++ b/src/plugins/qmldesigner/components/effectmaker/effectmakermodel.cpp @@ -18,6 +18,7 @@ QHash EffectMakerModel::roleNames() const { QHash roles; roles[NameRole] = "nodeName"; + roles[UniformsRole] = "nodeUniformsModel"; return roles; } diff --git a/src/plugins/qmldesigner/components/effectmaker/effectmakermodel.h b/src/plugins/qmldesigner/components/effectmaker/effectmakermodel.h index 969267a7b2d..bad64a6cddc 100644 --- a/src/plugins/qmldesigner/components/effectmaker/effectmakermodel.h +++ b/src/plugins/qmldesigner/components/effectmaker/effectmakermodel.h @@ -41,7 +41,7 @@ signals: private: enum Roles { NameRole = Qt::UserRole + 1, -// TODO + UniformsRole }; bool isValidIndex(int idx) const; diff --git a/src/plugins/qmldesigner/components/effectmaker/effectmakeruniformsmodel.cpp b/src/plugins/qmldesigner/components/effectmaker/effectmakeruniformsmodel.cpp new file mode 100644 index 00000000000..6e2831d2afd --- /dev/null +++ b/src/plugins/qmldesigner/components/effectmaker/effectmakeruniformsmodel.cpp @@ -0,0 +1,58 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include "effectmakeruniformsmodel.h" + +#include "uniform.h" + +#include + +namespace QmlDesigner { + +EffectMakerUniformsModel::EffectMakerUniformsModel(QObject *parent) + : QAbstractListModel{parent} +{ +} + +QHash EffectMakerUniformsModel::roleNames() const +{ + QHash roles; + roles[NameRole] = "uniformName"; + roles[DescriptionRole] = "uniformDescription"; + roles[ValueRole] = "uniformValue"; + roles[DefaultValueRole] = "uniformDefaultValue"; + roles[MinValueRole] = "uniformMinValue"; + roles[MaxValueRole] = "uniformMaxValue"; + roles[TypeRole] = "uniformType"; + return roles; +} + +int EffectMakerUniformsModel::rowCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent) + + return m_uniforms.size(); +} + +QVariant EffectMakerUniformsModel::data(const QModelIndex &index, int role) const +{ + QTC_ASSERT(index.isValid() && index.row() < m_uniforms.size(), return {}); + QTC_ASSERT(roleNames().contains(role), return {}); + + return m_uniforms.at(index.row())->property(roleNames().value(role)); +} + +void EffectMakerUniformsModel::resetModel() +{ + beginResetModel(); + endResetModel(); +} + +void EffectMakerUniformsModel::addUniform(Uniform *uniform) +{ + beginInsertRows({}, m_uniforms.size(), m_uniforms.size()); + m_uniforms.append(uniform); + endInsertRows(); +} + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/effectmaker/effectmakeruniformsmodel.h b/src/plugins/qmldesigner/components/effectmaker/effectmakeruniformsmodel.h new file mode 100644 index 00000000000..fe64efcf42e --- /dev/null +++ b/src/plugins/qmldesigner/components/effectmaker/effectmakeruniformsmodel.h @@ -0,0 +1,41 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#pragma once + +#include + +namespace QmlDesigner { + +class Uniform; + +class EffectMakerUniformsModel : public QAbstractListModel +{ + Q_OBJECT + +public: + EffectMakerUniformsModel(QObject *parent = nullptr); + + QHash roleNames() const override; + int rowCount(const QModelIndex & parent = QModelIndex()) const override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + + void resetModel(); + + void addUniform(Uniform *uniform); + +private: + enum Roles { + NameRole = Qt::UserRole + 1, + DescriptionRole, + ValueRole, + DefaultValueRole, + MaxValueRole, + MinValueRole, + TypeRole, + }; + + QList m_uniforms; +}; + +} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/effectmaker/uniform.h b/src/plugins/qmldesigner/components/effectmaker/uniform.h index c3e4256e431..c4669692872 100644 --- a/src/plugins/qmldesigner/components/effectmaker/uniform.h +++ b/src/plugins/qmldesigner/components/effectmaker/uniform.h @@ -14,6 +14,10 @@ class Uniform : public QObject { Q_OBJECT + Q_PROPERTY(QString uniformName MEMBER m_name CONSTANT) + Q_PROPERTY(Type uniformType MEMBER m_type CONSTANT) + Q_PROPERTY(QVariant uniformValue MEMBER m_value CONSTANT) + public: enum class Type { @@ -71,11 +75,10 @@ private: bool m_enabled = true; bool m_enableMipmap = false; - bool operator==(const Uniform& rhs) const noexcept + bool operator==(const Uniform &rhs) const noexcept { return this->m_name == rhs.m_name; } }; } // namespace QmlDesigner -