def startLineDraw(self, event): # highlight all ports that match startItems = self.items(event.scenePos()) if len(startItems): if isinstance(startItems[0], OutPort): if QtCore.Qt.AltModifier == getKeyboardModifiers(): startItems[0].toggleMemSaver() return self.portMatches = startItems[0].findMatchingInPorts() for port in self.portMatches: port.scaleUp() self.graph.viewAndSceneForcedUpdate() if isinstance(startItems[0], InPort): self.portMatches = startItems[0].findMatchingOutPorts() for port in self.portMatches: port.scaleUp() self.graph.viewAndSceneForcedUpdate() self.line = QtGui.QGraphicsLineItem( QtCore.QLineF(event.scenePos(), event.scenePos())) fade = QtGui.QColor(QtCore.Qt.red) fade.setAlpha(150) self.line.setPen(QtGui.QPen(fade, 2)) self.line.setZValue(10) self.addItem(self.line)
def __init__(self, graph, destPort, sourcePort): super(EdgeTracer, self).__init__() # show a faux copy of the delete menu menu = QtWidgets.QMenu() menu.addAction("Delete") # position of pipe end based on port type bindout_y = 5 bindin_y = -1 p1 = self.mapFromItem(sourcePort, 3.5, bindin_y) p2 = self.mapFromItem(destPort, 3.5, bindout_y) pos = graph.mapToGlobal(graph.mapFromScene((p1 - p2) / 2 + p2)) # render the menu without executing it try: # PyQt4 menupixmap = QtGui.QPixmap().grabWidget(menu) except AttributeError: menupixmap = menu.grab() # QtGui.QPixmap().grabWidget(menu) # round edges #mask = menupixmap.createMaskFromColor(QtGui.QColor(255, 255, 255), QtCore.Qt.MaskOutColor) #p = QtGui.QPainter(menupixmap) #p.setRenderHint(QtGui.QPainter.Antialiasing) #p.drawRoundedRect(0,0,menupixmap.width(),menupixmap.height(), 5,5) #p.drawPixmap(menupixmap.rect(), mask, mask.rect()) #p.end() # display the menu image (as a dummy menu as its being built) # TODO: this could probably be moved to the FauxMenu self._tracer = QtWidgets.QLabel() self._tracer.setWindowFlags(QtCore.Qt.Tool | QtCore.Qt.FramelessWindowHint) self._tracer.move(pos) self._tracer.setPixmap(menupixmap) self._tracer.show() self._tracer.raise_() # draw a faux selected line line = QtCore.QLineF(p1, p2) self.setPen( QtGui.QPen(QtGui.QColor(QtCore.Qt.red), 2, QtCore.Qt.DashLine, QtCore.Qt.RoundCap, QtCore.Qt.RoundJoin)) self.setLine(line) self.setZValue(0) # cleanup both menu item and line by removing from scene (parent). self._timer = QtCore.QTimer() self._timer.singleShot(300, lambda: graph.scene().removeItem(self))
def mousePressEvent(self, event): # CANVAS SCENE printMouseEvent(self, event) modifiers = getKeyboardModifiers() # allow graphics view panning if self.graph._panning: event.ignore() return # if its not a port, then don't draw a line modmidbutton_event = (event.button() == QtCore.Qt.LeftButton and modifiers == QtCore.Qt.AltModifier) if ((event.button() == QtCore.Qt.LeftButton) or (event.button() == QtCore.Qt.MidButton) or modmidbutton_event) \ and isinstance(self.itemAt(event.scenePos()), Port): event.accept() self.startLineDraw(event) # rubber band select # elif ((event.button() == QtCore.Qt.MidButton) or modmidbutton_event): elif ((event.button() == QtCore.Qt.LeftButton) \ and not isinstance(self.itemAt(event.scenePos()), Node) \ and not isinstance(self.itemAt(event.scenePos()), PortEdge)): event.accept() self.unselectAllItems() # reset select before making another self.origin = event.scenePos() self.rubberBand = QtGui.QGraphicsRectItem( QtCore.QRectF(self.origin, QtCore.QSizeF())) self.rubberBand.setPen( QtGui.QPen(QtCore.Qt.gray, 0, QtCore.Qt.SolidLine)) self.rubberBand.setBrush(QtGui.QBrush(QtCore.Qt.lightGray)) self.rubberBand.setZValue(0) self.addItem(self.rubberBand) else: QtGui.QApplication.restoreOverrideCursor() event.ignore() super(CanvasScene, self).mousePressEvent(event)
def paint(self, painter, option, widget): # EDGE if not self.source or not self.dest: return # Draw the line itself. line = QtCore.QLineF(self.sourcePoint, self.destPoint) if line.length() == 0.0: return if self.isSelected( ) or self._beingHovered or self.connectedPortIsHovered(): fade = QtGui.QColor(QtCore.Qt.red) fade.setAlpha(200) #painter.setPen(QtGui.QPen(QtCore.Qt.red, 1, QtCore.Qt.DashLine, painter.setPen( QtGui.QPen(fade, 2, QtCore.Qt.SolidLine, QtCore.Qt.RoundCap, QtCore.Qt.RoundJoin)) elif self.isCyclicConnection(): painter.setPen( QtGui.QPen(QtCore.Qt.red, 2, QtCore.Qt.SolidLine, QtCore.Qt.RoundCap, QtCore.Qt.RoundJoin)) else: fade = QtGui.QColor(QtCore.Qt.black) fade.setAlpha(150) #painter.setPen(QtGui.QPen(QtCore.Qt.black, 2, QtCore.Qt.SolidLine, painter.setPen( QtGui.QPen(fade, 2, QtCore.Qt.SolidLine, QtCore.Qt.RoundCap, QtCore.Qt.RoundJoin)) painter.drawLine(line) x = (line.x1() + line.x2()) / 2.0 y = (line.y1() + line.y2()) / 2.0 xa = (line.x1() - line.x2()) ya = (line.y1() - line.y2()) m = math.sqrt(xa * xa + ya * ya) a = math.atan2(ya, xa) * 180.0 / math.pi buf = self.source.getDataString() if self._beingHovered: f = QtGui.QFont("Times New Roman", 8) else: f = QtGui.QFont("Times New Roman", 6) fm = QtGui.QFontMetricsF(f) bw = fm.width(buf) bw2 = -bw * 0.5 #bh = fm.height() # bezier curves if False: sa = (a + 90.) * 0.5 path = QtGui.QPainterPath(line.p1()) path.cubicTo(x - sa, y - sa, x + sa, y + sa, line.x2(), line.y2()) painter.drawPath(path) # bezier curves, change direction on the angle if False: sa = (a + 90.) * 0.5 if a > 90 or a < -90: path = QtGui.QPainterPath(line.p1()) path.cubicTo(x - sa, y - sa, x + sa, y + sa, line.x2(), line.y2()) painter.drawPath(path) else: path = QtGui.QPainterPath(line.p1()) path.cubicTo(x + sa, y + sa, x - sa, y - sa, line.x2(), line.y2()) painter.drawPath(path) painter.setFont(f) if self._beingHovered: painter.setPen(QtGui.QPen(QtCore.Qt.red, 1)) else: painter.setPen(QtGui.QPen(QtCore.Qt.darkGray, 1)) painter.save() painter.translate(QtCore.QPointF(x, y)) if m > bw * 1.1 or self._beingHovered: if a > 90 or a < -90: painter.rotate(a + 180.0) painter.drawText(QtCore.QPointF(bw2, -2.0), buf) else: painter.rotate(a) painter.drawText(QtCore.QPointF(bw2, -2.0), buf) else: painter.drawText(QtCore.QPointF(bw2, -2.0), '') painter.restore()
def paint(self, painter, option, widget): if not self.source or not self.dest: return # Draw the line itself. line = QtCore.QLineF(self.sourcePoint, self.destPoint) if line.length() == 0.0: return painter.setPen( QtGui.QPen(QtCore.Qt.gray, self.penWidth, QtCore.Qt.SolidLine, QtCore.Qt.RoundCap, QtCore.Qt.RoundJoin)) painter.drawLine(line) # drawing text x = (line.x1() + line.x2()) / 2.0 y = (line.y1() + line.y2()) / 2.0 xa = (line.x1() - line.x2()) ya = (line.y1() - line.y2()) m = math.sqrt(xa * xa + ya * ya) a = math.atan2(ya, xa) * 180.0 / math.pi buf = "Macro" f = QtGui.QFont("times", 20) fm = QtGui.QFontMetricsF(f) bw = fm.width(buf) bw2 = -bw * 0.5 # bh = fm.height() # Draw the arrows if there's enough room. angle = math.acos(line.dx() / line.length()) if line.dy() >= 0: angle = self.TwoPi - angle sourceArrowP1 = self.sourcePoint + QtCore.QPointF( math.sin(angle + self.Pi / 3) * self.arrowSize, math.cos(angle + self.Pi / 3) * self.arrowSize) sourceArrowP2 = self.sourcePoint + QtCore.QPointF( math.sin(angle + self.Pi - self.Pi / 3) * self.arrowSize, math.cos(angle + self.Pi - self.Pi / 3) * self.arrowSize) destArrowP1 = self.destPoint + QtCore.QPointF( math.sin(angle - self.Pi / 3) * self.arrowSize, math.cos(angle - self.Pi / 3) * self.arrowSize) destArrowP2 = self.destPoint + QtCore.QPointF( math.sin(angle - self.Pi + self.Pi / 3) * self.arrowSize, math.cos(angle - self.Pi + self.Pi / 3) * self.arrowSize) painter.setBrush(QtCore.Qt.gray) painter.drawPolygon( QtGui.QPolygonF([line.p1(), sourceArrowP1, sourceArrowP2])) painter.drawPolygon( QtGui.QPolygonF([line.p2(), destArrowP1, destArrowP2])) # drawing text painter.setFont(f) painter.setPen(QtGui.QPen(QtCore.Qt.darkGray, 1)) painter.save() painter.translate(QtCore.QPointF(x, y)) if m > bw * 1.1: if a > 90 or a < -90: painter.rotate(a + 180.0) painter.drawText(QtCore.QPointF(bw2, -5.0), buf) else: painter.rotate(a) painter.drawText(QtCore.QPointF(bw2, -5.0), buf) else: painter.drawText(QtCore.QPointF(bw2, -5.0), '') painter.restore()
def paint(self, painter, option, widget): # NODE w = self.getNodeWidth() # h = self.getTitleWidth()[1] # draw shadow painter.setPen(QtCore.Qt.NoPen) painter.setBrush(QtCore.Qt.darkGray) painter.drawRoundedRect(-8, -8, w, 20, 3, 3) # choose module color gradient = QtGui.QRadialGradient(-10, -10, 40) # update the face node based on the state of internal nodes. if self._role == 'Macro': if self._macroParent.isProcessing(): gradient.setColorAt(0, QtGui.QColor(QtCore.Qt.gray).lighter(70)) gradient.setColorAt( 1, QtGui.QColor(QtCore.Qt.darkGray).lighter(70)) elif (option.state & QtGui.QStyle.State_Sunken) or ( self._macroParent.inComputeErrorState()): gradient.setColorAt(0, QtGui.QColor(QtCore.Qt.red).lighter(150)) gradient.setColorAt(1, QtGui.QColor(QtCore.Qt.red).lighter(170)) elif self._macroParent.inValidateErrorState(): gradient.setColorAt( 0, QtGui.QColor(QtCore.Qt.yellow).lighter(190)) gradient.setColorAt( 1, QtGui.QColor(QtCore.Qt.yellow).lighter(170)) elif self._macroParent.inInitUIErrorState(): gradient.setColorAt(0, QtGui.QColor(QtCore.Qt.red).lighter(150)) gradient.setColorAt( 1, QtGui.QColor(QtCore.Qt.yellow).lighter(170)) else: gradient.setColorAt(0, QtGui.QColor(QtCore.Qt.gray).lighter(150)) gradient.setColorAt( 1, QtGui.QColor(QtCore.Qt.darkGray).lighter(150)) # let the src and sink nodes update themselves normally else: conf = self.getCurState() if self._computeState is conf: gradient.setColorAt(0, QtGui.QColor(QtCore.Qt.gray).lighter(70)) gradient.setColorAt( 1, QtGui.QColor(QtCore.Qt.darkGray).lighter(70)) elif (option.state & QtGui.QStyle.State_Sunken) or ( self._computeErrorState is conf): gradient.setColorAt(0, QtGui.QColor(QtCore.Qt.red).lighter(150)) gradient.setColorAt(1, QtGui.QColor(QtCore.Qt.red).lighter(170)) elif self._validateError is conf: gradient.setColorAt( 0, QtGui.QColor(QtCore.Qt.yellow).lighter(190)) gradient.setColorAt( 1, QtGui.QColor(QtCore.Qt.yellow).lighter(170)) else: gradient.setColorAt(0, QtGui.QColor(QtCore.Qt.gray).lighter(150)) gradient.setColorAt( 1, QtGui.QColor(QtCore.Qt.darkGray).lighter(150)) # draw module box (apply color) painter.setBrush(QtGui.QBrush(gradient)) if self.beingHovered or self.isSelected(): #painter.setPen(QtGui.QPen(QtCore.Qt.red, 1)) fade = QtGui.QColor(QtCore.Qt.red) fade.setAlpha(100) painter.setPen(QtGui.QPen(fade, 2)) else: #painter.setPen(QtGui.QPen(QtCore.Qt.black, 0)) fade = QtGui.QColor(QtCore.Qt.black) fade.setAlpha(50) painter.setPen(QtGui.QPen(fade, 0)) painter.drawRoundedRect(-10, -10, w, 20, 3, 3) # title painter.setPen(QtGui.QPen(QtCore.Qt.black, 0)) painter.setFont(self.title_font) buf = self.getMacroNodeName() # paint the node title painter.drawText(-5, -9, w, 20, (QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter), str(buf))
def paint(self, painter, option, widget): # PORT # choose module color gradient = QtGui.QRadialGradient(-1, -1, 10) if option.state & QtGui.QStyle.State_Sunken: gradient.setColorAt(0, QtGui.QColor(QtCore.Qt.red).lighter(150)) gradient.setColorAt(1, QtGui.QColor(QtCore.Qt.darkRed).lighter(150)) # elif self._beingHovered: # gradient.setColorAt(0, QtGui.QColor(QtCore.Qt.darkRed).lighter(150)) # gradient.setColorAt(1, QtGui.QColor(QtCore.Qt.red).lighter(150)) elif isinstance(self, InPort): # if self.menuWidget: if self.isREQUIRED(): # gradient.setColorAt(0, QtGui.QColor(QtCore.Qt.yellow).lighter(200)) # gradient.setColorAt(1, # QtGui.QColor(QtCore.Qt.darkYellow).lighter(200)) gradient.setColorAt(0, QtGui.QColor(QtCore.Qt.blue).lighter(200)) gradient.setColorAt( 1, QtGui.QColor(QtCore.Qt.darkBlue).lighter(200)) # gradient.setColorAt(1, QtGui.QColor(QtCore.Qt.gray).lighter(300)) # gradient.setColorAt(0, # QtGui.QColor(QtCore.Qt.darkGray).lighter(150)) else: gradient.setColorAt(0, QtGui.QColor(QtCore.Qt.green).lighter(200)) gradient.setColorAt( 1, QtGui.QColor(QtCore.Qt.darkGreen).lighter(150)) # gradient.setColorAt(0, QtGui.QColor(QtCore.Qt.gray).lighter(150)) # gradient.setColorAt(1, # QtGui.QColor(QtCore.Qt.darkGray).lighter(100)) elif isinstance(self, OutPort): # if self.menuWidget: # orange=QtGui.QColor().fromRgbF(1.,0.5,0.) # gradient.setColorAt(0, orange.lighter(200)) # gradient.setColorAt(1, orange.lighter(100)) # gradient.setColorAt(0, QtGui.QColor(QtCore.Qt.blue).lighter(300)) # gradient.setColorAt(1, # QtGui.QColor(QtCore.Qt.darkBlue).lighter(300)) if self.dataIsNone(): gradient.setColorAt(1, QtGui.QColor(QtCore.Qt.red).lighter(300)) gradient.setColorAt( 0, QtGui.QColor(QtCore.Qt.darkRed).lighter(150)) elif self.dataHasChanged(): # gradient.setColorAt(1, QtGui.QColor(QtCore.Qt.gray).lighter(200)) # gradient.setColorAt(0, # QtGui.QColor(QtCore.Qt.darkGray).lighter(100)) gradient.setColorAt(1, QtGui.QColor(QtCore.Qt.blue).lighter(200)) gradient.setColorAt( 0, QtGui.QColor(QtCore.Qt.darkBlue).lighter(200)) else: gradient.setColorAt( 1, QtGui.QColor(QtCore.Qt.yellow).lighter(200)) gradient.setColorAt( 0, QtGui.QColor(QtCore.Qt.darkYellow).lighter(150)) # else: # gradient.setColorAt(0, QtGui.QColor(QtCore.Qt.blue).lighter(175)) # gradient.setColorAt(1, QtGui.QColor(QtCore.Qt.darkBlue).lighter(175)) # gradient.setColorAt(0, QtGui.QColor(QtCore.Qt.gray).lighter(150)) # gradient.setColorAt(1, QtGui.QColor(QtCore.Qt.darkGray).lighter(100)) # if self.dataIsNone(): # gradient.setColorAt(0, QtGui.QColor(QtCore.Qt.red).lighter(150)) # gradient.setColorAt(1, QtGui.QColor(QtCore.Qt.darkRed).lighter(100)) # elif self.dataHasChanged(): # gradient.setColorAt(0, QtGui.QColor(QtCore.Qt.gray).lighter(150)) # gradient.setColorAt(1, QtGui.QColor(QtCore.Qt.darkGray).lighter(100)) # else: # gradient.setColorAt(0, QtGui.QColor(QtCore.Qt.yellow).lighter(200)) # gradient.setColorAt(1, # QtGui.QColor(QtCore.Qt.darkYellow).lighter(150)) # draw module box (apply color) painter.setBrush(QtGui.QBrush(gradient)) #painter.setPen(QtGui.QPen(QtCore.Qt.black, 0)) fade = QtGui.QColor(QtCore.Qt.black) fade.setAlpha(50) painter.setPen(QtGui.QPen(fade, 0)) # if isinstance(self,InPort): # if self.isREQUIRED(): # painter.setPen(QtGui.QPen(QtCore.Qt.red, 0)) # else: # painter.setPen(QtGui.QPen(QtCore.Qt.black, 0)) # #painter.setPen(QtGui.QPen(QtCore.Qt.yellow, 0)) if self.isMemSaver(): painter.drawPolygon(self.portShape_memSave) else: if self.menuWidget: painter.drawEllipse(1, 0, 5, 5) else: painter.drawPolygon(self.portShape)