Removes all the inputed items from the scene at once.  The \
        list of items will be stored in an internal cache.  When \
        updating a node or connection's prepareToRemove method, \
        any additional items that need to be removed as a result \
        of that object being removed, should use the \
        scene.forceRemove method which will keep track of all the \
        items queued up to remove, so it won't be removed twice.
        
        :sa         forceRemove
        
        :param      items       <list> [ <QGraphicsItem>, .. ]
        
        :return     <int> number removed

def removeItems(self, items):
        """
        Removes all the inputed items from the scene at once.  The \
        list of items will be stored in an internal cache.  When \
        updating a node or connection's prepareToRemove method, \
        any additional items that need to be removed as a result \
        of that object being removed, should use the \
        scene.forceRemove method which will keep track of all the \
        items queued up to remove, so it won't be removed twice.
        
        :sa         forceRemove
        
        :param      items       <list> [ <QGraphicsItem>, .. ]
        
        :return     <int> number removed
        """
        count = 0
        self._removalQueue = items
        blocked = self.signalsBlocked()
        self.blockSignals(True)
        update = set()
        for item in items:
            if isinstance(item, XNodeConnection):
                update.add(item.inputNode())
                update.add(item.outputNode())
            
            if self.removeItem(item):
                count += 1
        
        self.blockSignals(blocked)
        self._removalQueue = []
        
        # update any existing nodes once the connections have been removed
        for node in update.difference(items):
            node.setDirty(True)
        
        if not self.signalsBlocked():
            self.itemsRemoved.emit()
        
        return count