Skip to content

Commit 09903c2

Browse files
committed
[ui] updates to the vertical/horizontal alignment (average position)
1 parent b33d921 commit 09903c2

File tree

2 files changed

+34
-13
lines changed

2 files changed

+34
-13
lines changed

meshroom/ui/graph.py

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -690,28 +690,50 @@ 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+
693705
@Slot()
694-
def alignVertically(self):
695-
""" All nodes are moved vertically to the same position than the firstly selected node """
706+
def alignHorizontally(self):
707+
""" All nodes are moved horizontally to the same position, on an average position of selected nodes """
708+
nodePadding = 50
696709
selectedNodes = self.getSelectedNodes()
697-
698710
if len(selectedNodes) < 2:
699711
return
700712

701-
for selectedNode in selectedNodes:
702-
self.moveNode(selectedNode, Position(selectedNode.x, selectedNodes[0].y))
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))
703725

704726
@Slot()
705-
def alignHorizontally(self):
706-
""" All nodes are moved horizontally to the same position than the firstly selected node """
707-
727+
def alignVertically(self):
728+
""" All nodes are moved vertically to the same position, on an average position of selected nodes """
708729
selectedNodes = self.getSelectedNodes()
709-
710730
if len(selectedNodes) < 2:
711731
return
712732

713-
for selectedNode in selectedNodes:
714-
self.moveNode(selectedNode, Position(selectedNodes[0].x, selectedNode.y))
733+
meanX, _ = self.getMeanPosition()
734+
with self.groupedGraphModification("Align nodes vertically"):
735+
for selectedNode in selectedNodes:
736+
self.moveNode(selectedNode, Position(meanX, selectedNode.y))
715737

716738
@Slot()
717739
def removeSelectedNodes(self):

meshroom/ui/qml/GraphEditor/GraphEditor.qml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,7 @@ Item {
134134
uigraph.alignVertically()
135135
} else if (event.key === Qt.Key_H && event.modifiers === Qt.ShiftModifier) {
136136
uigraph.alignHorizontally()
137-
}
138-
else if (event.key === Qt.Key_Tab) {
137+
} else if (event.key === Qt.Key_Tab) {
139138
event.accepted = true
140139
if (mouseArea.containsMouse) {
141140
newNodeMenu.spawnPosition = mouseArea.mapToItem(draggable, mouseArea.mouseX, mouseArea.mouseY)

0 commit comments

Comments
 (0)