Skip to content

Commit

Permalink
Merge pull request #2652 from alicevision/dev/NodeLayout
Browse files Browse the repository at this point in the history
Enable Fitting of selected Nodes in the Graph Editor when Fit is invoked
  • Loading branch information
fabiencastan authored Jan 27, 2025
2 parents 2bd98c3 + a5e6d61 commit 2eb30fe
Showing 1 changed file with 33 additions and 1 deletion.
34 changes: 33 additions & 1 deletion meshroom/ui/qml/GraphEditor/GraphEditor.qml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 2eb30fe

Please sign in to comment.