Skip to content

Commit 402b692

Browse files
authored
Merge pull request #2759 from alicevision/dev/alignment
[ui] Improve manual alignment of nodes
2 parents 5ed67e2 + 3fa1f5f commit 402b692

File tree

2 files changed

+49
-0
lines changed

2 files changed

+49
-0
lines changed

meshroom/ui/graph.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -690,6 +690,51 @@ def moveSelectedNodesBy(self, offset: QPoint):
690690
position = Position(node.x + offset.x(), node.y + offset.y())
691691
self.moveNode(node, position)
692692

693+
def getMeanPosition(self):
694+
""" Get the average Position of selected nodes """
695+
# Not great, would be better if Position was a non-tuple class
696+
selectedNodes = self.getSelectedNodes()
697+
sum_pose = [0, 0]
698+
nb_tot = 0
699+
for selectedNode in selectedNodes:
700+
sum_pose[0] += selectedNode.x
701+
sum_pose[1] += selectedNode.y
702+
nb_tot += 1
703+
return Position(int(sum_pose[0] / nb_tot), int(sum_pose[1] / nb_tot))
704+
705+
@Slot()
706+
def alignHorizontally(self):
707+
""" All nodes are moved horizontally to the same position, on an average position of selected nodes """
708+
nodePadding = 50
709+
selectedNodes = self.getSelectedNodes()
710+
if len(selectedNodes) < 2:
711+
return
712+
713+
# Make sure the list is correctly ordered
714+
selectedNodes = sorted(selectedNodes, key=lambda node:node.x)
715+
716+
meanX, meanY = self.getMeanPosition()
717+
nodeWidth = self.layout.nodeWidth
718+
# Compute the first node X position
719+
totalWidth = len(selectedNodes) * nodeWidth + (len(selectedNodes) - 1) * nodePadding
720+
startX = int(meanX - totalWidth / 2 + nodeWidth / 2)
721+
with self.groupedGraphModification("Align nodes horizontally"):
722+
for i, selectedNode in enumerate(selectedNodes):
723+
x = startX + i * (nodeWidth + nodePadding)
724+
self.moveNode(selectedNode, Position(x, meanY))
725+
726+
@Slot()
727+
def alignVertically(self):
728+
""" All nodes are moved vertically to the same position, on an average position of selected nodes """
729+
selectedNodes = self.getSelectedNodes()
730+
if len(selectedNodes) < 2:
731+
return
732+
733+
meanX, _ = self.getMeanPosition()
734+
with self.groupedGraphModification("Align nodes vertically"):
735+
for selectedNode in selectedNodes:
736+
self.moveNode(selectedNode, Position(meanX, selectedNode.y))
737+
693738
@Slot()
694739
def removeSelectedNodes(self):
695740
"""Remove selected nodes from the graph."""

meshroom/ui/qml/GraphEditor/GraphEditor.qml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,10 @@ Item {
130130
}
131131
} else if (event.key === Qt.Key_V && event.modifiers === Qt.ControlModifier) {
132132
pasteNodes()
133+
} else if (event.key === Qt.Key_V && event.modifiers === Qt.ShiftModifier) {
134+
uigraph.alignVertically()
135+
} else if (event.key === Qt.Key_H && event.modifiers === Qt.ShiftModifier) {
136+
uigraph.alignHorizontally()
133137
} else if (event.key === Qt.Key_Tab) {
134138
event.accepted = true
135139
if (mouseArea.containsMouse) {

0 commit comments

Comments
 (0)