QmlDesigner: Implement disabling effect maker composition nodes

Disabling happens using a new button added to the section.
Also a small tweak to disable drag button when there is only one section
in a category.

Fixes: QDS-10575
Change-Id: I33884a5b333c54b2bae650943940d4858f489f7a
Reviewed-by: Qt CI Patch Build Bot <ci_patchbuild_bot@qt.io>
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Reviewed-by: Amr Elsayed <amr.elsayed@qt.io>
Reviewed-by: Henning Gründl <henning.gruendl@qt.io>
This commit is contained in:
Mahmoud Badri
2023-09-06 15:18:02 +03:00
committed by Amr Elsayed
parent 1b0f25eee8
commit c5c1612c6b
8 changed files with 91 additions and 9 deletions

View File

@@ -12,7 +12,14 @@ import EffectMakerBackend
HelperWidgets.Section { HelperWidgets.Section {
id: root id: root
caption: nodeName // model properties
required property string nodeName
required property bool nodeEnabled
required property var nodeUniformsModel
required property int index
caption: root.nodeName
category: "EffectMaker" category: "EffectMaker"
draggable: true draggable: true
@@ -21,14 +28,22 @@ HelperWidgets.Section {
closeButtonToolTip: qsTr("Remove") closeButtonToolTip: qsTr("Remove")
onCloseButtonClicked: { onCloseButtonClicked: {
EffectMakerBackend.effectMakerModel.removeNode(index) EffectMakerBackend.effectMakerModel.removeNode(root.index)
}
showEyeButton: true
eyeEnabled: root.nodeEnabled
eyeButtonToolTip: qsTr("Enable/Disable Node")
onEyeButtonClicked: {
root.nodeEnabled = root.eyeEnabled
} }
Column { Column {
spacing: 10 spacing: 10
Repeater { Repeater {
model: nodeUniformsModel model: root.nodeUniformsModel
EffectCompositionNodeUniform { EffectCompositionNodeUniform {
width: root.width width: root.width

View File

@@ -69,6 +69,10 @@ Item {
width: root.width width: root.width
model: EffectMakerBackend.effectMakerModel model: EffectMakerBackend.effectMakerModel
onCountChanged: {
HelperWidgets.Controller.setCount("EffectMaker", repeater.count)
}
delegate: EffectCompositionNode { delegate: EffectCompositionNode {
width: root.width width: root.width

View File

@@ -5,13 +5,29 @@ pragma Singleton
import QtQuick 2.15 import QtQuick 2.15
QtObject { QtObject {
id: values id: root
// counts of sections in each category, allows accessing the count from inside a section
property var counts: ({})
property Item mainScrollView property Item mainScrollView
property bool contextMenuOpened: false property bool contextMenuOpened: false
function count(category) {
if (!root.counts.hasOwnProperty(category))
return 0
return root.counts[category]
}
function setCount(category, count) {
root.counts[category] = count
root.countChanged(category, count)
}
signal collapseAll(string category) signal collapseAll(string category)
signal expandAll(string category) signal expandAll(string category)
signal closeContextMenu() signal closeContextMenu()
signal countChanged(string category, int count)
} }

View File

@@ -20,6 +20,8 @@ Item {
property alias showLeftBorder: leftBorder.visible property alias showLeftBorder: leftBorder.visible
property alias showCloseButton: closeButton.visible property alias showCloseButton: closeButton.visible
property alias closeButtonToolTip: closeButton.tooltip property alias closeButtonToolTip: closeButton.tooltip
property alias showEyeButton: eyeButton.visible
property alias eyeButtonToolTip: eyeButton.tooltip
property alias spacing: column.spacing property alias spacing: column.spacing
property alias draggable: dragButton.visible property alias draggable: dragButton.visible
property alias fillBackground: sectionBackground.visible property alias fillBackground: sectionBackground.visible
@@ -40,6 +42,7 @@ Item {
property bool addBottomPadding: true property bool addBottomPadding: true
property bool dropEnabled: false property bool dropEnabled: false
property bool highlight: false property bool highlight: false
property bool eyeEnabled: true // eye button enabled (on)
property bool useDefaulContextMenu: true property bool useDefaulContextMenu: true
@@ -75,6 +78,10 @@ Item {
function onCloseContextMenu() { function onCloseContextMenu() {
contextMenu.close() contextMenu.close()
} }
function onCountChanged(cat, count) {
if (section.showEyeButton && cat === section.category)
dragButton.enabled = count > 1
}
} }
signal drop(var drag) signal drop(var drag)
@@ -85,6 +92,7 @@ Item {
signal expand() signal expand()
signal collapse() signal collapse()
signal closeButtonClicked() signal closeButtonClicked()
signal eyeButtonClicked()
signal startDrag(var section) signal startDrag(var section)
signal stopDrag() signal stopDrag()
@@ -133,7 +141,7 @@ Item {
height: 4 height: 4
source: "image://icons/down-arrow" source: "image://icons/down-arrow"
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: 4 + (section.level * section.levelShift) + (section.draggable ? 20 : 0) anchors.leftMargin: 4 + (section.level * section.levelShift) + (section.draggable ? 20 : 0) + (section.showEyeButton ? 25 : 0)
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
} }
@@ -185,11 +193,11 @@ Item {
icon: StudioTheme.Constants.dragmarks icon: StudioTheme.Constants.dragmarks
buttonSize: 22 buttonSize: 22
iconScale: containsMouse ? 1.2 : 1 iconScale: dragButton.enabled && dragButton.containsMouse ? 1.2 : 1
transparentBg: true transparentBg: true
visible: false visible: false
drag.target: section drag.target: dragButton.enabled ? section : null
drag.axis: Drag.YAxis drag.axis: Drag.YAxis
onPressed: { onPressed: {
@@ -202,6 +210,24 @@ Item {
section.stopDrag() section.stopDrag()
} }
} }
IconButton {
id: eyeButton
anchors.left: dragButton.right
icon: section.eyeEnabled ? StudioTheme.Constants.visible_small : StudioTheme.Constants.invisible_small
buttonSize: 22
iconScale: eyeButton.containsMouse ? 1.2 : 1
transparentBg: true
visible: false
onClicked: {
section.eyeEnabled = !section.eyeEnabled
root.eyeButtonClicked()
}
}
} }
Drag.active: dragButton.drag.active Drag.active: dragButton.drag.active

View File

@@ -51,7 +51,10 @@ bool CompositionNode::isEnabled() const
void CompositionNode::setIsEnabled(bool newIsEnabled) void CompositionNode::setIsEnabled(bool newIsEnabled)
{ {
m_isEnabled = newIsEnabled; if (newIsEnabled != m_isEnabled) {
m_isEnabled = newIsEnabled;
emit isEnabledChanged();
}
} }
CompositionNode::NodeType CompositionNode::type() const CompositionNode::NodeType CompositionNode::type() const

View File

@@ -14,6 +14,7 @@ class CompositionNode : public QObject
Q_OBJECT Q_OBJECT
Q_PROPERTY(QString nodeName MEMBER m_name CONSTANT) Q_PROPERTY(QString nodeName MEMBER m_name CONSTANT)
Q_PROPERTY(bool nodeEnabled READ isEnabled WRITE setIsEnabled NOTIFY isEnabledChanged)
Q_PROPERTY(QObject *nodeUniformsModel READ uniformsModel NOTIFY uniformsModelChanged) Q_PROPERTY(QObject *nodeUniformsModel READ uniformsModel NOTIFY uniformsModelChanged)
public: public:
@@ -40,6 +41,7 @@ public:
signals: signals:
void uniformsModelChanged(); void uniformsModelChanged();
void isEnabledChanged();
private: private:
void parse(const QString &qenPath); void parse(const QString &qenPath);
@@ -50,7 +52,7 @@ private:
QString m_vertexCode; QString m_vertexCode;
QString m_description; QString m_description;
QStringList m_requiredNodes; QStringList m_requiredNodes;
bool m_isEnabled; bool m_isEnabled = true;
EffectMakerUniformsModel m_unifomrsModel; EffectMakerUniformsModel m_unifomrsModel;
}; };

View File

@@ -23,6 +23,7 @@ QHash<int, QByteArray> EffectMakerModel::roleNames() const
{ {
QHash<int, QByteArray> roles; QHash<int, QByteArray> roles;
roles[NameRole] = "nodeName"; roles[NameRole] = "nodeName";
roles[EnabledRole] = "nodeEnabled";
roles[UniformsRole] = "nodeUniformsModel"; roles[UniformsRole] = "nodeUniformsModel";
return roles; return roles;
} }
@@ -42,6 +43,19 @@ QVariant EffectMakerModel::data(const QModelIndex &index, int role) const
return m_nodes.at(index.row())->property(roleNames().value(role)); return m_nodes.at(index.row())->property(roleNames().value(role));
} }
bool EffectMakerModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (!index.isValid() || !roleNames().contains(role))
return false;
if (role == EnabledRole) {
m_nodes.at(index.row())->setIsEnabled(value.toBool());
emit dataChanged(index, index, {role});
}
return true;
}
void EffectMakerModel::addNode(const QString &nodeQenPath) void EffectMakerModel::addNode(const QString &nodeQenPath)
{ {
beginInsertRows({}, m_nodes.size(), m_nodes.size()); beginInsertRows({}, m_nodes.size(), m_nodes.size());

View File

@@ -40,6 +40,7 @@ public:
QHash<int, QByteArray> roleNames() const override; QHash<int, QByteArray> roleNames() const override;
int rowCount(const QModelIndex & parent = QModelIndex()) const override; int rowCount(const QModelIndex & parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
bool setData(const QModelIndex &index, const QVariant &value, int role) override;
bool isEmpty() const { return m_isEmpty; } bool isEmpty() const { return m_isEmpty; }
@@ -60,6 +61,7 @@ signals:
private: private:
enum Roles { enum Roles {
NameRole = Qt::UserRole + 1, NameRole = Qt::UserRole + 1,
EnabledRole,
UniformsRole UniformsRole
}; };