Example #1
0
    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)
Example #2
0
    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)
Example #3
0
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)