def shape(self): # hitbox for selecting path = super(Edge, self).shape() delta = QtCore.QPointF(3, 3) # padding to make it thicker line = QtGui.QPolygonF([ self.sourcePoint + delta, self.destPoint + delta, self.destPoint - delta, self.sourcePoint - delta ]) path.addPolygon(line) return path
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 __init__(self, nodeWidget, CanvasBackend, portTitle, portNum, intype=None, dtype=None, ndim=None, menuWidget=None): super(Port, self).__init__() self._id = None self.setID() self.node = nodeWidget self.menuWidget = menuWidget # a reference to a module menu widget self.graph = CanvasBackend self.edgeList = [] self.newPos = QtCore.QPointF() self.setFlag(QtGui.QGraphicsItem.ItemSendsGeometryChanges) self.setCacheMode(QtGui.QGraphicsItem.DeviceCoordinateCache) self.setZValue(3) ## TYPE info self._GPIType = intype # basic data type # for NPY arrays self._dtype = dtype # array data type self._ndim = ndim self._obligation = None # inport use only # a link to the data self._data = None # position self.portNum = portNum self.portTitle = portTitle if portTitle is None: self.portTitle = str(portNum) # port shape self.largenessFact = 3.0 self.pointsCoord = [[0.0, 0.0], [7.0, 0.0], [3.5, 5]] self.setTransformOriginPoint(3.5, 5) if isinstance(self, OutPort): self.setTransformOriginPoint(3.5, 0) # self.portShape = trianglePolygon = QtGui.QPolygonF() self.portShape = QtGui.QPolygonF() for i in self.pointsCoord: self.portShape.append(QtCore.QPointF(i[0], i[1])) # box # self.pointsCoord_canvasConnect = [[0.0, 0.0], [7.0, 0.0], [7.0, 5], [0.0, 5]] # bowtie #self.pointsCoord_canvasConnect = [[0.0, 0.0], [7.0, 0.0], [3.5, 2.5], [0.0, 5.0], [7.0, 5.0], [3.5, 2.5]] #self.portShape_canvasConnect = QtGui.QPolygonF() #for i in self.pointsCoord_canvasConnect: # self.portShape_canvasConnect.append(QtCore.QPointF(i[0], i[1])) # box # self.pointsCoord_canvasConnect = [[0.0, 0.0], [7.0, 0.0], [7.0, 5], [0.0, 5]] # bowtie self.pointsCoord_memSave = [[0.0, 0.0], [7.0, 0.0], [3.5, 2.5], [0.0, 5.0], [7.0, 5.0], [3.5, 2.5]] self.portShape_memSave = QtGui.QPolygonF() for i in self.pointsCoord_memSave: self.portShape_memSave.append(QtCore.QPointF(i[0], i[1])) self.setCursor(QtCore.Qt.CrossCursor) self.setAcceptHoverEvents(True) self._beingHovered = False self.updateToolTip() # src or sink self._canvasConnect = False # save memory self._savemem = False