[ui] Hide disabled File attributes and their edges but keep the connections

This commit effectively hides a node's attributes when they are disabled.
If these attributes have connections, the edges representing these
connections are hidden but not destroyed. When the edges are hidden, if
one of the connected attributes is still enabled, its pin becomes empty as
if it was not connected to anything.

If the disabled attribute is re-enabled and the connection has not been
broken (if the enabled attribute on the other side of the edge has not
been reconnected to another attribute, for example), the edge re-appears.
If the connection has been broken, then the attribute will be unconnected.

Hidden connections are saved in project files and taken into account when
a project file containing some is loaded.
This commit is contained in:
Candice Bentéjac 2023-03-08 16:45:28 +01:00
parent de39143e83
commit 6f1ac9a06e
3 changed files with 46 additions and 4 deletions

View file

@ -35,6 +35,16 @@ RowLayout {
layoutDirection: Qt.LeftToRight layoutDirection: Qt.LeftToRight
spacing: 3 spacing: 3
function updatePin(isSrc, isVisible)
{
if (isSrc) {
innerOutputAnchor.linkEnabled = isVisible
} else {
innerInputAnchor.linkEnabled = isVisible
}
}
// Instantiate empty Items for each child attribute // Instantiate empty Items for each child attribute
Repeater { Repeater {
id: childrenRepeater id: childrenRepeater
@ -59,7 +69,9 @@ RowLayout {
color: Colors.sysPalette.base color: Colors.sysPalette.base
Rectangle { Rectangle {
visible: inputConnectMA.containsMouse || childrenRepeater.count > 0 || (attribute && attribute.isLink) || inputConnectMA.drag.active || inputDropArea.containsDrag id: innerInputAnchor
property bool linkEnabled: true
visible: inputConnectMA.containsMouse || childrenRepeater.count > 0 || (attribute && attribute.isLink && linkEnabled) || inputConnectMA.drag.active || inputDropArea.containsDrag
radius: isList ? 0 : 2 radius: isList ? 0 : 2
anchors.fill: parent anchors.fill: parent
anchors.margins: 2 anchors.margins: 2
@ -207,7 +219,9 @@ RowLayout {
color: Colors.sysPalette.base color: Colors.sysPalette.base
Rectangle { Rectangle {
visible: attribute.hasOutputConnections || outputConnectMA.containsMouse || outputConnectMA.drag.active || outputDropArea.containsDrag id: innerOutputAnchor
property bool linkEnabled: true
visible: (attribute.hasOutputConnections && linkEnabled) || outputConnectMA.containsMouse || outputConnectMA.drag.active || outputDropArea.containsDrag
radius: isList ? 0 : 2 radius: isList ? 0 : 2
anchors.fill: parent anchors.fill: parent
anchors.margins: 2 anchors.margins: 2

View file

@ -383,7 +383,7 @@ Item {
property var src: root._attributeToDelegate[edge.src] property var src: root._attributeToDelegate[edge.src]
property var dst: root._attributeToDelegate[edge.dst] property var dst: root._attributeToDelegate[edge.dst]
property bool isValidEdge: src !== undefined && dst !== undefined property bool isValidEdge: src !== undefined && dst !== undefined
visible: isValidEdge visible: isValidEdge && src.visible && dst.visible
property bool inFocus: containsMouse || (edgeMenu.opened && edgeMenu.currentEdge === edge) property bool inFocus: containsMouse || (edgeMenu.opened && edgeMenu.currentEdge === edge)
@ -407,6 +407,30 @@ Item {
} }
} }
} }
onVisibleChanged: {
if (visible) {
// Enable the pins on both sides
src.updatePin(true, true) // isSrc = true, isVisible = true
dst.updatePin(false, true) // isSrc = false, isVisible = true
} else {
// One of the attributes is visible, we do not need to handle the case where both attributes are hidden
if (isValidEdge && (src.visible || dst.visible)) {
if (src.visible) {
src.updatePin(true, false) // isSrc = true, isVisible = false
} else {
dst.updatePin(false, false) // isSrc = false, isVisible = false
}
}
}
}
Component.onDestruction: {
// Handles the case where the edge is destroyed while hidden because it is replaced: the pins should be re-enabled
if (src && src !== undefined)
src.updatePin(true, true) // isSrc = true, isVisible = true
if (dst && dst !== undefined)
dst.updatePin(false, true) // isSrc = false, isVisible = true
}
} }
} }

View file

@ -387,12 +387,14 @@ Item {
id: outputs id: outputs
width: parent.width width: parent.width
spacing: 3 spacing: 3
Repeater { Repeater {
model: node ? node.attributes : undefined model: node ? node.attributes : undefined
delegate: Loader { delegate: Loader {
id: outputLoader id: outputLoader
active: object.isOutput && isFileAttributeBaseType(object) && object.desc.visible active: object.isOutput && isFileAttributeBaseType(object)
visible: object.enabled
anchors.right: parent.right anchors.right: parent.right
width: outputs.width width: outputs.width
@ -421,9 +423,11 @@ Item {
Repeater { Repeater {
model: node ? node.attributes : undefined model: node ? node.attributes : undefined
delegate: Loader { delegate: Loader {
id: inputLoader id: inputLoader
active: !object.isOutput && isFileAttributeBaseType(object) active: !object.isOutput && isFileAttributeBaseType(object)
visible: object.enabled
width: inputs.width width: inputs.width
sourceComponent: AttributePin { sourceComponent: AttributePin {