Automatically lays out all the nodes in the scene using the private \
        autoLayoutNodes method.
        
        :param      nodes | [<XNode>, ..]
                    padX | <int> || None | default is 2 * cell width
                    padY | <int> || None | default is 2 * cell height
                    direction | <Qt.Direction>
                    layout | <str> | name of the layout plugin to use
                    animate | <int> | number of seconds to animate over
        
        :return     {<XNode>: <QRectF>, ..} | new rects per affected node

def autoLayoutNodes( self, 
                         nodes, 
                         padX = None, 
                         padY = None, 
                         direction = Qt.Horizontal,
                         layout = 'Layered',
                         animate = 0,
                         centerOn = None,
                         center = None,
                         debug=False):
        """
        Automatically lays out all the nodes in the scene using the private \
        autoLayoutNodes method.
        
        :param      nodes | [<XNode>, ..]
                    padX | <int> || None | default is 2 * cell width
                    padY | <int> || None | default is 2 * cell height
                    direction | <Qt.Direction>
                    layout | <str> | name of the layout plugin to use
                    animate | <int> | number of seconds to animate over
        
        :return     {<XNode>: <QRectF>, ..} | new rects per affected node
        """
        plugin = XNodeLayout.plugin(layout)
        if not plugin:
            return 0
        
        if not animate:
            plugin.setTesting(debug)
            results = plugin.layout(self, nodes, center, padX, padY, direction)
            if centerOn:
                self.mainView().centerOn(centerOn)
            return results
        else:
            anim_group = QParallelAnimationGroup(self)
            plugin.setTesting(debug)
            results = plugin.layout(self,
                                   nodes,
                                   center,
                                   padX,
                                   padY,
                                   direction,
                                   anim_group)
            
            if isinstance(centerOn, XNode):
                if centerOn in results:
                    end_center = results[centerOn] + centerOn.rect().center()
                else:
                    end_center = centerOn.sceneRect().center()
                
                anim = XObjectAnimation(self.mainView(), 'centerOn')
                anim.setStartValue(self.mainView().viewportRect().center())
                anim.setEndValue(end_center)
                anim_group.addAnimation(anim)
            
            for i in range(anim_group.animationCount()):
                anim = anim_group.animationAt(i)
                anim.setDuration(1000 * animate)
            
            anim_group.finished.connect(anim_group.deleteLater)
            anim_group.start()
            return results