diff --git a/meshroom/ui/graph.py b/meshroom/ui/graph.py index 60fbacf0..00470e1c 100644 --- a/meshroom/ui/graph.py +++ b/meshroom/ui/graph.py @@ -390,6 +390,18 @@ class UIGraph(QObject): def removeNode(self, 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) def addEdge(self, src, dst): if isinstance(dst, ListAttribute) and not isinstance(src, ListAttribute): diff --git a/meshroom/ui/qml/GraphEditor/GraphEditor.qml b/meshroom/ui/qml/GraphEditor/GraphEditor.qml index 67eb2dd3..50d5bbe4 100755 --- a/meshroom/ui/qml/GraphEditor/GraphEditor.qml +++ b/meshroom/ui/qml/GraphEditor/GraphEditor.qml @@ -2,6 +2,7 @@ import QtQuick 2.7 import QtQuick.Controls 2.3 import QtQuick.Layouts 1.3 import Controls 1.0 +import Utils 1.0 import MaterialIcons 2.2 /** @@ -274,7 +275,7 @@ Item { } MenuSeparator {} MenuItem { - text: "Duplicate" + text: "Duplicate Node" onTriggered: duplicateNode(nodeMenu.currentNode, false) } MenuItem { @@ -282,16 +283,23 @@ Item { onTriggered: duplicateNode(nodeMenu.currentNode, true) } MenuSeparator {} - MenuItem { - text: "Clear Data" - enabled: !root.readOnly - onTriggered: nodeMenu.currentNode.clearData() - } MenuItem { text: "Delete Node" enabled: !root.readOnly 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 @@ -337,7 +345,12 @@ Item { onEntered: uigraph.hoveredNode = node 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 { enabled: animatePosition