@@ -690,28 +690,50 @@ def moveSelectedNodesBy(self, offset: QPoint):
690
690
position = Position (node .x + offset .x (), node .y + offset .y ())
691
691
self .moveNode (node , position )
692
692
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
+
693
705
@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
696
709
selectedNodes = self .getSelectedNodes ()
697
-
698
710
if len (selectedNodes ) < 2 :
699
711
return
700
712
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 ))
703
725
704
726
@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 """
708
729
selectedNodes = self .getSelectedNodes ()
709
-
710
730
if len (selectedNodes ) < 2 :
711
731
return
712
732
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 ))
715
737
716
738
@Slot ()
717
739
def removeSelectedNodes (self ):
0 commit comments