def paint(self, painter, option, widget): # pylint: disable=unused-argument lod = option.levelOfDetailFromTransform(painter.worldTransform()) should_omit_text = lod < QGraphBlock.MINIMUM_DETAIL_LEVEL painter.setBrush(self._config.disasm_view_node_shadow_color) painter.setPen(self._config.disasm_view_node_shadow_color) shadow_path = QPainterPath(self._block_item) shadow_path.translate(self.SHADOW_OFFSET_X, self.SHADOW_OFFSET_Y) painter.drawPath(shadow_path) # background of the node painter.setBrush(self._calc_backcolor(should_omit_text)) if self.infodock.is_block_selected(self.addr): painter.setPen( QPen(self._config.disasm_view_selected_node_border_color, 2.5)) else: painter.setPen( QPen(self._config.disasm_view_node_border_color, 1.5)) self._block_item_obj = painter.drawPath(self._block_item) # content drawing is handled by qt since children are actual child widgets # if we are too far zoomed out, do not draw the text if self._objects_are_hidden != should_omit_text: self._set_block_objects_visibility(not should_omit_text) view = self.scene.parent() if view.is_extra_render_pass: self._objects_are_temporarily_hidden = should_omit_text else: self._objects_are_hidden = should_omit_text # extra content self.workspace.plugins.draw_block(self, painter)
def updateShape(self): p1 = QPointF(0, 0) p2 = QPointF(self.width(), self.height()) ctrlPt = QPointF(abs(self.width() * self.curveScale), 0) path = QPainterPath(p1) path.cubicTo(p1 + ctrlPt, p2 - ctrlPt, p2) # Compute offset on x and y axis halfThickness = self._thickness / 2.0 v = QVector2D(p2 - p1).normalized() offset = QPointF(halfThickness * -v.y(), halfThickness * v.x()) self._path = QPainterPath(path.toReversed()) self._path.translate(-offset) path.translate(offset) self._path.connectPath(path)
class EdgeMouseArea(QQuickItem): """ Provides a MouseArea shaped as a cubic spline for mouse interaction with edges. Spline goes from (0,0) to (width, height). Works with negative values. """ def __init__(self, parent=None): super(EdgeMouseArea, self).__init__(parent) self._curveScale = 0.7 self._thickness = 2.0 self._containsMouse = False self._path = None # type: QPainterPath self.setAcceptHoverEvents(True) self.setAcceptedMouseButtons(Qt.AllButtons) def contains(self, point): return self._path.contains(point) def hoverEnterEvent(self, evt): self.setContainsMouse(True) super(EdgeMouseArea, self).hoverEnterEvent(evt) def hoverLeaveEvent(self, evt): self.setContainsMouse(False) super(EdgeMouseArea, self).hoverLeaveEvent(evt) def geometryChanged(self, newGeometry, oldGeometry): super(EdgeMouseArea, self).geometryChanged(newGeometry, oldGeometry) self.updateShape() def mousePressEvent(self, evt): if not self.acceptedMouseButtons() & evt.button(): evt.setAccepted(False) return e = MouseEvent(evt) self.pressed.emit(e) e.deleteLater() def mouseReleaseEvent(self, evt): e = MouseEvent(evt) self.released.emit(e) e.deleteLater() def updateShape(self): p1 = QPointF(0, 0) p2 = QPointF(self.width(), self.height()) ctrlPt = QPointF(abs(self.width() * self.curveScale), 0) path = QPainterPath(p1) path.cubicTo(p1 + ctrlPt, p2 - ctrlPt, p2) # Compute offset on x and y axis halfThickness = self._thickness / 2.0 v = QVector2D(p2 - p1).normalized() offset = QPointF(halfThickness * -v.y(), halfThickness * v.x()) self._path = QPainterPath(path.toReversed()) self._path.translate(-offset) path.translate(offset) self._path.connectPath(path) def getThickness(self): return self._thickness def setThickness(self, value): if self._thickness == value: return self._thickness = value self.thicknessChanged.emit() self.updateShape() def getCurveScale(self): return self._curveScale def setCurveScale(self, value): if self.curveScale == value: return self._curveScale = value self.curveScaleChanged.emit() self.updateShape() def getContainsMouse(self): return self._containsMouse def setContainsMouse(self, value): if self._containsMouse == value: return self._containsMouse = value self.containsMouseChanged.emit() thicknessChanged = Signal() thickness = Property(float, getThickness, setThickness, notify=thicknessChanged) curveScaleChanged = Signal() curveScale = Property(float, getCurveScale, setCurveScale, notify=curveScaleChanged) containsMouseChanged = Signal() containsMouse = Property(float, getContainsMouse, notify=containsMouseChanged) acceptedButtons = Property( int, lambda self: super(EdgeMouseArea, self).acceptedMouseButtons, lambda self, value: super(EdgeMouseArea, self).setAcceptedMouseButtons( value)) pressed = Signal(MouseEvent) released = Signal(MouseEvent)