@@ -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."""
0 commit comments