@@ -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 ):
0 commit comments