def addStep(self, step):

        column = 0
        parentItem = self.findParentItem(step._category)
        if not parentItem:
            parentItem = QtGui.QTreeWidgetItem(self)
            parentItem.setText(column, step._category)
            parentItem.setTextAlignment(column, QtCore.Qt.AlignCenter)
            font = parentItem.font(column)
            font.setPointSize(12)
            font.setWeight(QtGui.QFont.Bold)
            parentItem.setFont(column, font)

        if not parentItem.isExpanded():
            parentItem.setExpanded(True)

        stepItem = QtGui.QTreeWidgetItem(parentItem)
        stepItem.setText(column, step.getName())
        if step._icon:
            stepItem.setIcon(column, QtGui.QIcon(QtGui.QPixmap.fromImage(step._icon)))
        else:
            stepItem.setIcon(column, QtGui.QIcon(QtGui.QPixmap.fromImage(createDefaultImageIcon(step.getName()))))

        stepItem.setData(column, QtCore.Qt.UserRole, step)
        stepItem.setFlags(QtCore.Qt.ItemIsEnabled)
    def _updateImage(self):

        image_file = self._ui.iconLineEdit.text()
        if image_file:
            image = QtGui.QPixmap(image_file)
            if image:
                self._ui.iconPictureLabel.setPixmap(image.scaled(64, 64, aspectRatioMode=QtCore.Qt.KeepAspectRatio, transformMode=QtCore.Qt.FastTransformation))
        else:
            image = createDefaultImageIcon(self._ui.nameLineEdit.text())
            self._ui.iconPictureLabel.setPixmap(QtGui.QPixmap.fromImage(image).scaled(64, 64, aspectRatioMode=QtCore.Qt.KeepAspectRatio, transformMode=QtCore.Qt.FastTransformation))

        self.completeChanged.emit()
    def mousePressEvent(self, event):
        item = self.itemAt(event.pos())
        if not item:
            return None

        if self.indexOfTopLevelItem(item) >= 0:
            # Item is a top level item and it doesn't have drag and drop abilities
            return QtGui.QTreeWidget.mousePressEvent(self, event)

        itemData = QtCore.QByteArray()
        dataStream = QtCore.QDataStream(itemData, QtCore.QIODevice.WriteOnly)
        step = item.data(0, QtCore.Qt.UserRole)
        if step._icon:
            pixmap = QtGui.QPixmap(step._icon)
        else:
            icon = createDefaultImageIcon(step.getName())
            pixmap = QtGui.QPixmap()
            pixmap.convertFromImage(icon)

        pixmap = pixmap.scaled(64, 64, aspectRatioMode=QtCore.Qt.KeepAspectRatio, transformMode=QtCore.Qt.FastTransformation)
        hotspot = QtCore.QPoint(pixmap.width() / 2, pixmap.height() / 2)

        name = step.getName()  # bytearray(step.getName(), sys.stdout.encoding)
        dataStream.writeUInt32(len(name))
        dataStream.writeRawData(name)

        dataStream << hotspot

        mimeData = QtCore.QMimeData()
        mimeData.setData('image/x-workflow-step', itemData)

        drag = QtGui.QDrag(self)
        drag.setMimeData(mimeData)
        drag.setHotSpot(hotspot)
        drag.setPixmap(pixmap)

        drag.exec_(QtCore.Qt.MoveAction)

        return QtGui.QTreeWidget.mousePressEvent(self, event)
    def __init__(self, metastep):
        Item.__init__(self)

        self._metastep = metastep
        icon = self._metastep._step._icon
        if not icon:
            icon = QtGui.QImage(createDefaultImageIcon(self._metastep._step.getName()))

        self._pixmap = QtGui.QPixmap.fromImage(icon).scaled(self.Size, self.Size, aspectRatioMode=QtCore.Qt.KeepAspectRatio, transformMode=QtCore.Qt.FastTransformation)

        self.setToolTip(metastep._step._name)

        self.setFlag(QtGui.QGraphicsItem.ItemIsMovable)
        self.setFlag(QtGui.QGraphicsItem.ItemSendsGeometryChanges)
        self.setCacheMode(self.DeviceCoordinateCache)
        self.setZValue(-1)

        self._contextMenu = QtGui.QMenu()
        configureAction = QtGui.QAction('Configure', self._contextMenu)
        configureAction.triggered.connect(self.configureMe)
        annotateAction = QtGui.QAction('Annotate', self._contextMenu)
        annotateAction.setEnabled(False)
        annotateAction.triggered.connect(self.annotateMe)
        deleteAction = QtGui.QAction('Delete', self._contextMenu)
        deleteAction.triggered.connect(self._removeMe)
        self._contextMenu.addAction(configureAction)
        self._contextMenu.addAction(annotateAction)
        self._contextMenu.addSeparator()
        self._contextMenu.addAction(deleteAction)

        self._step_port_items = []
        # Collect all ports that provide or use from the step
        uses_ports = [port for port in self._metastep._step._ports if port.hasUses()]
        provides_ports = [port for port in self._metastep._step._ports if port.hasProvides()]

        uses_count = 0
        uses_total = len(uses_ports)
        provides_count = 0
        provides_total = len(provides_ports)
        for port in self._metastep._step._ports:
            port_item = StepPort(port, self)
            w = port_item.width()
            h = port_item.height()
            if port in uses_ports:
                port_total = uses_total
                index = uses_count
                x_pos = -3 * w / 4
                uses_count += 1
                pred = 'http://physiomeproject.org/workflow/1.0/rdf-schema#uses'
                tooltip_stub = 'uses: '
            else:  # port in provides_ports:
                port_total = provides_total
                index = provides_count
                x_pos = self.Size - w / 4
                provides_count += 1
                pred = 'http://physiomeproject.org/workflow/1.0/rdf-schema#provides'
                tooltip_stub = 'provides: '

            triples = port.getTriplesForPred(pred)
            triple_objects = [triple[2] for triple in triples]
            alpha = h / 4.0  # Controls the spacing between the ports
            y_pos = self.Size / 2.0 - (port_total * h + (port_total - 1) * alpha) / 2.0 + (h + alpha) * index
            port_item.moveBy(x_pos, y_pos)
            port_item.setToolTip(tooltip_stub + ', '.join(triple_objects))
            self._step_port_items.append(port_item)

        self._configure_item = ConfigureIcon(self)
        self._configure_item.moveBy(40, 40)

        self.updateConfigureIcon()

        self._modified_item = MercurialIcon(self)
        self._modified_item.moveBy(5, 40)

        self.updateMercurialIcon()