From a5e6d61730cf52d0bd4ccbdba0419652178ef498 Mon Sep 17 00:00:00 2001 From: waaake Date: Tue, 21 Jan 2025 09:45:46 +0530 Subject: [PATCH] [ui] GraphEditor: Added Fit to Selected Nodes in the Graph Pressing F or invoking GraphEditor.fit() now considers the selected nodes and fits/focusses on the overall selection if present, else fits/focusses all of available nodes --- meshroom/ui/qml/GraphEditor/GraphEditor.qml | 34 ++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/meshroom/ui/qml/GraphEditor/GraphEditor.qml b/meshroom/ui/qml/GraphEditor/GraphEditor.qml index 8101bb4823..9a6ab00da6 100755 --- a/meshroom/ui/qml/GraphEditor/GraphEditor.qml +++ b/meshroom/ui/qml/GraphEditor/GraphEditor.qml @@ -1203,10 +1203,42 @@ Item { return bbox; } + function selectionBoundingBox() { + /** + * Returns the bounding box considering the nodes which are selected. + * The returned bounding box starts from the Minumum x,y position to the + * Maximum x,y postion of the selected nodes. + */ + var firstIdx = uigraph.nodeSelection.selectedIndexes[0]; + const first = nodeRepeater.itemAt(firstIdx.row); + // Bounding box of the first selected item + var bbox = Qt.rect(first.x, first.y, first.x + first.width, first.y + first.height); + // Iterate over the remaining items in the selection + uigraph.nodeSelection.selectedIndexes.forEach(function(idx) { + if(idx != firstIdx) { + const item = nodeRepeater.itemAt(idx.row); + bbox.x = Math.min(bbox.x, item.x); + bbox.y = Math.min(bbox.y, item.y); + bbox.width = Math.max(bbox.width, item.x + item.width); + bbox.height = Math.max(bbox.height, item.y + item.height); + } + }); + + bbox.width -= bbox.x; + bbox.height -= bbox.y; + return bbox; + } + // Fit graph to fill root function fit() { + var bbox; // Compute bounding box - var bbox = boundingBox() + if (uigraph.nodeSelection.hasSelection) { + bbox = selectionBoundingBox(); + } + else { + bbox = boundingBox(); + } // Rescale to fit the bounding box in the view, zoom is limited to prevent huge text draggable.scale = Math.min(Math.min(root.width / bbox.width, root.height / bbox.height), maxZoom) // Recenter