[ui] GraphEditor: add "Delete From Here" in node contextual menu

* ease the deletion of a branch from a given starting point
* accessible with alt+del on a node
* re-order menu to put the most destructive operation (Clear Data) at the very end
This commit is contained in:
Yann Lanthony 2019-01-02 18:44:11 +01:00
parent b50f9fb44d
commit d10c779914
2 changed files with 32 additions and 7 deletions

View file

@ -390,6 +390,18 @@ class UIGraph(QObject):
def removeNode(self, node): def removeNode(self, node):
self.push(commands.RemoveNodeCommand(self._graph, node)) self.push(commands.RemoveNodeCommand(self._graph, node))
@Slot(Node)
def removeNodesFrom(self, startNode):
"""
Remove all nodes starting from 'startNode' to graph leaves.
Args:
startNode (Node): the node to start from.
"""
with self.groupedGraphModification("Remove Nodes from {}".format(startNode.name)):
# Perform nodes removal from leaves to start node so that edges
# can be re-created in correct order on redo.
[self.removeNode(node) for node in reversed(self._graph.nodesFromNode(startNode)[0])]
@Slot(Attribute, Attribute) @Slot(Attribute, Attribute)
def addEdge(self, src, dst): def addEdge(self, src, dst):
if isinstance(dst, ListAttribute) and not isinstance(src, ListAttribute): if isinstance(dst, ListAttribute) and not isinstance(src, ListAttribute):

View file

@ -2,6 +2,7 @@ import QtQuick 2.7
import QtQuick.Controls 2.3 import QtQuick.Controls 2.3
import QtQuick.Layouts 1.3 import QtQuick.Layouts 1.3
import Controls 1.0 import Controls 1.0
import Utils 1.0
import MaterialIcons 2.2 import MaterialIcons 2.2
/** /**
@ -274,7 +275,7 @@ Item {
} }
MenuSeparator {} MenuSeparator {}
MenuItem { MenuItem {
text: "Duplicate" text: "Duplicate Node"
onTriggered: duplicateNode(nodeMenu.currentNode, false) onTriggered: duplicateNode(nodeMenu.currentNode, false)
} }
MenuItem { MenuItem {
@ -282,16 +283,23 @@ Item {
onTriggered: duplicateNode(nodeMenu.currentNode, true) onTriggered: duplicateNode(nodeMenu.currentNode, true)
} }
MenuSeparator {} MenuSeparator {}
MenuItem {
text: "Clear Data"
enabled: !root.readOnly
onTriggered: nodeMenu.currentNode.clearData()
}
MenuItem { MenuItem {
text: "Delete Node" text: "Delete Node"
enabled: !root.readOnly enabled: !root.readOnly
onTriggered: uigraph.removeNode(nodeMenu.currentNode) onTriggered: uigraph.removeNode(nodeMenu.currentNode)
} }
MenuItem {
text: "Delete From Here"
enabled: !root.readOnly
onTriggered: uigraph.removeNodesFrom(nodeMenu.currentNode)
}
MenuSeparator {}
MenuItem {
text: "Clear Data"
palette.text: Colors.red
enabled: !root.readOnly
onTriggered: nodeMenu.currentNode.clearData()
}
} }
// Nodes // Nodes
@ -337,7 +345,12 @@ Item {
onEntered: uigraph.hoveredNode = node onEntered: uigraph.hoveredNode = node
onExited: uigraph.hoveredNode = null onExited: uigraph.hoveredNode = null
Keys.onDeletePressed: uigraph.removeNode(node) Keys.onDeletePressed: {
if(event.modifiers == Qt.AltModifier)
uigraph.removeNodesFrom(node)
else
uigraph.removeNode(node)
}
Behavior on x { Behavior on x {
enabled: animatePosition enabled: animatePosition