QmlDesigner: Add effect maker uniforms model

Also some initial relevant UI part.

Change-Id: I79a4a060d0e2af0aeff86e27ebe3c70faf5681c2
Task-number: QDS-10404
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
This commit is contained in:
Mahmoud Badri
2023-08-21 11:52:11 +03:00
parent 87c9e64a74
commit 82ee90b875
10 changed files with 217 additions and 30 deletions

View File

@@ -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
}
}
}
}

View File

@@ -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"
}
}
}
}

View File

@@ -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

View File

@@ -4,6 +4,7 @@
#include "compositionnode.h"
#include "effectutils.h"
#include "effectmakeruniformsmodel.h"
#include "uniform.h"
#include <QFileInfo>
@@ -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

View File

@@ -3,15 +3,20 @@
#pragma once
#include "effectmakeruniformsmodel.h"
#include <QObject>
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

View File

@@ -18,6 +18,7 @@ QHash<int, QByteArray> EffectMakerModel::roleNames() const
{
QHash<int, QByteArray> roles;
roles[NameRole] = "nodeName";
roles[UniformsRole] = "nodeUniformsModel";
return roles;
}

View File

@@ -41,7 +41,7 @@ signals:
private:
enum Roles {
NameRole = Qt::UserRole + 1,
// TODO
UniformsRole
};
bool isValidIndex(int idx) const;

View File

@@ -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 <utils/qtcassert.h>
namespace QmlDesigner {
EffectMakerUniformsModel::EffectMakerUniformsModel(QObject *parent)
: QAbstractListModel{parent}
{
}
QHash<int, QByteArray> EffectMakerUniformsModel::roleNames() const
{
QHash<int, QByteArray> 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

View File

@@ -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 <QStandardItemModel>
namespace QmlDesigner {
class Uniform;
class EffectMakerUniformsModel : public QAbstractListModel
{
Q_OBJECT
public:
EffectMakerUniformsModel(QObject *parent = nullptr);
QHash<int, QByteArray> 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<Uniform *> m_uniforms;
};
} // namespace QmlDesigner

View File

@@ -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
{
@@ -78,4 +82,3 @@ private:
};
} // namespace QmlDesigner