コード例 #1
0
class AttributeUiProxy(QtGui.QGraphicsWidget):
    def __init__(self, attributeUi):
        QtGui.QGraphicsWidget.__init__(self)
        
        self._parentNodeUi = weakref.ref(attributeUi.parentNodeUi())
        self._attributeUi = weakref.ref(attributeUi)
        self._shapePen = self._parentNodeUi().shapePen()
        self._inputHook = None
        self._outputHook = None
        self._label = QtGui.QGraphicsSimpleTextItem(self)
        self._spacerConstant = 5.0
        self._currentMagnifyFactor = 0.0
        self._zValue = self.zValue()
        
        hookColor = QtGui.QColor(100, 100, 100)
        if attributeUi.outputHook():
            hookColor = attributeUi.outputHook().color()
        elif attributeUi.inputHook():
            hookColor = attributeUi.inputHook().color()
        
        if attributeUi.inputHook():
            self._outputHook = ConnectionHook(attributeUi, parentItem = self, isOutput = True)
            self._outputHook.setColor(hookColor)
            self._outputHook.setFlags(QtGui.QGraphicsItem.ItemSendsScenePositionChanges)
        else:
            self._inputHook = ConnectionHook(attributeUi, parentItem = self, isInput = True)
            self._inputHook.setColor(hookColor)
            self._inputHook.setFlags(QtGui.QGraphicsItem.ItemSendsScenePositionChanges)
        
        self.setFlag(QtGui.QGraphicsItem.ItemIsMovable)
        self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable)
        
        self._label.setBrush(attributeUi.labelColor())
        self._label.setText(attributeUi.coralAttribute().name())
        
        self._shapePen.setStyle(QtCore.Qt.NoPen)
        self.setAcceptHoverEvents(True)
        
        self.updateLayout()
    
    def _magnifyAnimStep(self, frame):
        step = frame / nodeView.NodeView._animSteps
        invStep = 1.0 - step
        
        self.setScale((self.scale() * invStep) + ((1.0 * self._currentMagnifyFactor) * step))
        
        if self._inputHook:
            self._inputHook.updateWorldPos()
        elif self._outputHook:
            self._outputHook.updateWorldPos()
                
        self.scene().update()
        
    def _magnify(self, factor):
        self._currentMagnifyFactor = factor
        timer = QtCore.QTimeLine(nodeView.NodeView._animSpeed, self)
        timer.setFrameRange(0, nodeView.NodeView._animSteps)
        
        self.connect(timer, QtCore.SIGNAL("frameChanged(int)"), self._magnifyAnimStep);
        
        timer.start()
    
    def hoverEnterEvent(self, event):
        if nodeView.NodeView._lastHoveredItem is not self:
            if nodeView.NodeView._lastHoveredItem:
                nodeView.NodeView._lastHoveredItem.hoverLeaveEvent(None)
            
            zoom = self.scene().zoom()
            if zoom < 0.6:
                factor =  0.7 / zoom
                
                self.setTransformOriginPoint(self.rect().center())
                self._magnify(factor)
                
                nodeView.NodeView._lastHoveredItem = self
                
                self.setZValue(9999999)
        
    def hoverLeaveEvent(self, event):
        if nodeView.NodeView._lastHoveredItem is self:
            self._magnify(1.0)
            
            self.setZValue(self._zValue)
            nodeView.NodeView._lastHoveredItem = None
    
    def deleteInputConnection(self):
        if self._inputHook:
            if self._inputHook._connections:
                self._inputHook._connections[0].deleteIt()
    
    def onChangedScene(self, scene):
        pass
        
    def deleteIt(self):
        if self._outputHook:
            self._outputHook.deleteIt()
        
        if self._inputHook:
            self._inputHook.deleteIt()
            
        self.scene().removeItem(self)
    
    def coralAttribute(self):
        return self._attributeUi().coralAttribute()
    
    def inputHook(self):
        return self._inputHook
    
    def outputHook(self):
        return self._outputHook
    
    def specialized(self):
        attributeUi = self._attributeUi()
        
        hookColor = QtGui.QColor(100, 100, 100)
        hookMixedColor = hookColor
        if attributeUi.outputHook():
            hook = attributeUi.outputHook()
            hookColor = hook.color()
            hookMixedColor = hook.mixedColor()
        elif attributeUi.inputHook():
            hook = attributeUi.inputHook()
            hookColor = hook.color()
            hookMixedColor = hook.mixedColor()
        
        hook = None
        if self._outputHook:
            hook = self._outputHook
        elif self._inputHook:
            hook = self._inputHook
        
        hook.setColor(hookColor)
        hook.setMixedColor(hookMixedColor)

        self._label.setText(attributeUi._labelText + attributeUi._labelSuffix)

        self.updateLayout()
        self.update()
    
    def itemChange(self, change, value):
        if change == QtGui.QGraphicsItem.ItemSelectedHasChanged:
            if self.isSelected():
                self._shapePen.setStyle(QtCore.Qt.SolidLine)
            else:
                self._shapePen.setStyle(QtCore.Qt.NoPen)
            
        return value
    
    def updateLayout(self):
        labelHeight = self._label.boundingRect().height()
        height = self._spacerConstant + labelHeight + self._spacerConstant
        
        inputHookOffset = 0
        if self._inputHook:
            hookY = (height - self._inputHook.boundingRect().height()) / 2.0
            self._inputHook.setPos(self._spacerConstant, hookY)
            inputHookOffset = self._inputHook.boundingRect().width() + self._inputHook.pos().x()
        
        self._label.setPos(inputHookOffset + self._spacerConstant, (height - labelHeight) / 2.0)
        
        outputHookOffset = self._label.pos().x() + self._label.boundingRect().width()
        if self._outputHook:
            hookY = (height - self._outputHook.boundingRect().height()) / 2.0
            self._outputHook.setPos(outputHookOffset + self._spacerConstant, hookY)
            outputHookOffset = self._outputHook.pos().x() + self._outputHook.boundingRect().width()
            
        self.resize(QtCore.QSizeF(outputHookOffset + self._spacerConstant, height))
    
    def paint(self, painter, option, widget):
        attributeUi = self._attributeUi()
        parentNodeUi = self._parentNodeUi()
        
        shape = QtGui.QPainterPath()
        shape.addRoundedRect(self.rect(), 2, 2)
        
        painter.setPen(self._shapePen)
        painter.setBrush(parentNodeUi.color())
        painter.drawPath(shape)
    
    def data(self):
        data = {"name": self.coralAttribute().name(), "pos": [self.pos().x(), self.pos().y()]}
        
        return data
    
    def setData(self, data):
        if data.has_key("pos"):
            pos = data["pos"]
            self.setPos(pos[0], pos[1])
コード例 #2
0
ファイル: attributeUiProxy.py プロジェクト: ljkart/coraline
class AttributeUiProxy(QtGui.QGraphicsWidget):
    def __init__(self, attributeUi):
        QtGui.QGraphicsWidget.__init__(self)

        self._parentNodeUi = weakref.ref(attributeUi.parentNodeUi())
        self._attributeUi = weakref.ref(attributeUi)
        self._shapePen = self._parentNodeUi().shapePen()
        self._inputHook = None
        self._outputHook = None
        self._label = QtGui.QGraphicsSimpleTextItem(self)
        self._spacerConstant = 5.0
        self._currentMagnifyFactor = 0.0
        self._zValue = self.zValue()

        hookColor = QtGui.QColor(100, 100, 100)
        if attributeUi.outputHook():
            hookColor = attributeUi.outputHook().color()
        elif attributeUi.inputHook():
            hookColor = attributeUi.inputHook().color()

        if attributeUi.inputHook():
            self._outputHook = ConnectionHook(attributeUi,
                                              parentItem=self,
                                              isOutput=True)
            self._outputHook.setColor(hookColor)
            self._outputHook.setFlags(
                QtGui.QGraphicsItem.ItemSendsScenePositionChanges)
        else:
            self._inputHook = ConnectionHook(attributeUi,
                                             parentItem=self,
                                             isInput=True)
            self._inputHook.setColor(hookColor)
            self._inputHook.setFlags(
                QtGui.QGraphicsItem.ItemSendsScenePositionChanges)

        self.setFlag(QtGui.QGraphicsItem.ItemIsMovable)
        self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable)

        self._label.setBrush(attributeUi.labelColor())
        self._label.setText(attributeUi.coralAttribute().name())

        self._shapePen.setStyle(QtCore.Qt.NoPen)
        self.setAcceptHoverEvents(True)

        self.updateLayout()

    def _magnifyAnimStep(self, frame):
        step = frame / nodeView.NodeView._animSteps
        invStep = 1.0 - step

        self.setScale((self.scale() * invStep) +
                      ((1.0 * self._currentMagnifyFactor) * step))

        if self._inputHook:
            self._inputHook.updateWorldPos()
        elif self._outputHook:
            self._outputHook.updateWorldPos()

        self.scene().update()

    def _magnify(self, factor):
        self._currentMagnifyFactor = factor
        timer = QtCore.QTimeLine(nodeView.NodeView._animSpeed, self)
        timer.setFrameRange(0, nodeView.NodeView._animSteps)

        self.connect(timer, QtCore.SIGNAL("frameChanged(int)"),
                     self._magnifyAnimStep)

        timer.start()

    def hoverEnterEvent(self, event):
        if nodeView.NodeView._lastHoveredItem is not self:
            if nodeView.NodeView._lastHoveredItem:
                nodeView.NodeView._lastHoveredItem.hoverLeaveEvent(None)

            zoom = self.scene().zoom()
            if zoom < 0.6:
                factor = 0.7 / zoom

                self.setTransformOriginPoint(self.rect().center())
                self._magnify(factor)

                nodeView.NodeView._lastHoveredItem = self

                self.setZValue(9999999)

    def hoverLeaveEvent(self, event):
        if nodeView.NodeView._lastHoveredItem is self:
            self._magnify(1.0)

            self.setZValue(self._zValue)
            nodeView.NodeView._lastHoveredItem = None

    def deleteInputConnection(self):
        if self._inputHook:
            if self._inputHook._connections:
                self._inputHook._connections[0].deleteIt()

    def onChangedScene(self, scene):
        pass

    def deleteIt(self):
        if self._outputHook:
            self._outputHook.deleteIt()

        if self._inputHook:
            self._inputHook.deleteIt()

        self.scene().removeItem(self)

    def coralAttribute(self):
        return self._attributeUi().coralAttribute()

    def inputHook(self):
        return self._inputHook

    def outputHook(self):
        return self._outputHook

    def specialized(self):
        attributeUi = self._attributeUi()

        hookColor = QtGui.QColor(100, 100, 100)
        hookMixedColor = hookColor
        if attributeUi.outputHook():
            hook = attributeUi.outputHook()
            hookColor = hook.color()
            hookMixedColor = hook.mixedColor()
        elif attributeUi.inputHook():
            hook = attributeUi.inputHook()
            hookColor = hook.color()
            hookMixedColor = hook.mixedColor()

        hook = None
        if self._outputHook:
            hook = self._outputHook
        elif self._inputHook:
            hook = self._inputHook

        hook.setColor(hookColor)
        hook.setMixedColor(hookMixedColor)

        self._label.setText(attributeUi._labelText + attributeUi._labelSuffix)

        self.updateLayout()
        self.update()

    def itemChange(self, change, value):
        if change == QtGui.QGraphicsItem.ItemSelectedHasChanged:
            if self.isSelected():
                self._shapePen.setStyle(QtCore.Qt.SolidLine)
            else:
                self._shapePen.setStyle(QtCore.Qt.NoPen)

        return value

    def updateLayout(self):
        labelHeight = self._label.boundingRect().height()
        height = self._spacerConstant + labelHeight + self._spacerConstant

        inputHookOffset = 0
        if self._inputHook:
            hookY = (height - self._inputHook.boundingRect().height()) / 2.0
            self._inputHook.setPos(self._spacerConstant, hookY)
            inputHookOffset = self._inputHook.boundingRect().width(
            ) + self._inputHook.pos().x()

        self._label.setPos(inputHookOffset + self._spacerConstant,
                           (height - labelHeight) / 2.0)

        outputHookOffset = self._label.pos().x() + self._label.boundingRect(
        ).width()
        if self._outputHook:
            hookY = (height - self._outputHook.boundingRect().height()) / 2.0
            self._outputHook.setPos(outputHookOffset + self._spacerConstant,
                                    hookY)
            outputHookOffset = self._outputHook.pos().x(
            ) + self._outputHook.boundingRect().width()

        self.resize(
            QtCore.QSizeF(outputHookOffset + self._spacerConstant, height))

    def paint(self, painter, option, widget):
        attributeUi = self._attributeUi()
        parentNodeUi = self._parentNodeUi()

        shape = QtGui.QPainterPath()
        shape.addRoundedRect(self.rect(), 2, 2)

        painter.setPen(self._shapePen)
        painter.setBrush(parentNodeUi.color())
        painter.drawPath(shape)

    def data(self):
        data = {
            "name": self.coralAttribute().name(),
            "pos": [self.pos().x(), self.pos().y()]
        }

        return data

    def setData(self, data):
        if data.has_key("pos"):
            pos = data["pos"]
            self.setPos(pos[0], pos[1])