Beispiel #1
0
class ColorTransferFunctionIntervalView(QGraphicsRectItem):
    def __init__(self,
                 viewer: ColorTransferFunctionViewer,
                 begin_point: ColorTransferFunctionPoint,
                 end_point: ColorTransferFunctionPoint,
                 parent: QGraphicsItem = None):
        super().__init__(parent)

        self.viewer = viewer
        self._begin_point = None
        self._end_point = None
        self.chart = self.viewer.chart

        self.brush_gradient = QLinearGradient()
        self.brush_gradient.setStart(QPointF(0, 0))
        self.brush_gradient.setFinalStop(QPointF(1, 0))
        self.brush_gradient.setCoordinateMode(QGradient.ObjectMode)

        self.setPen(QColor('#404040'))

        self.begin_point = begin_point
        self.end_point = end_point

    @property
    def begin_point(self):
        return self._begin_point

    @begin_point.setter
    def begin_point(self, value):
        if self._begin_point != value:
            self._begin_point = value
            self._begin_point.x_changed.connect(self._on_point_x_changed)
            self._begin_point.color_array_changed.connect(
                self._on_begin_point_color_array_changed)
            self._update_begin_brush()

    @property
    def end_point(self):
        return self._end_point

    @end_point.setter
    def end_point(self, value):
        if self._end_point != value:
            self._end_point = value
            self._end_point.x_changed.connect(self._on_point_x_changed)
            self._end_point.color_array_changed.connect(
                self._on_end_point_color_array_changed)
            self._update_end_brush()

    def _on_point_x_changed(self, x: float):
        self.update()

    def _on_begin_point_color_array_changed(self, color_array: np.ndarray):
        self._update_begin_brush()

    def _on_end_point_color_array_changed(self, color_array: np.ndarray):
        self._update_end_brush()

    def _update_begin_brush(self):
        self.brush_gradient.setColorAt(0, self.begin_point.color)
        self.setBrush(self.brush_gradient)

    def _update_end_brush(self):
        self.brush_gradient.setColorAt(1, self.end_point.color)
        self.setBrush(self.brush_gradient)

    def update(self, rect: QRectF = QRectF()):
        super().update(rect)

        top_left_interval_pos = self.chart.mapToPosition(
            QPointF(self.begin_point.x, 1))
        bottom_right_interval_pos = self.chart.mapToPosition(
            QPointF(self.end_point.x, 0))
        self.setRect(QRectF(top_left_interval_pos, bottom_right_interval_pos))

    def __lt__(self, other):
        return self.begin_point.x < other.begin_point.x
Beispiel #2
0
class SwitchPrivate(QObject):
    def __init__(self, q, parent=None, leftText='ON', rightText='OFF'):
        QObject.__init__(self, parent=parent)
        self.leftText = leftText
        self.rightText = rightText
        self.mPointer = q
        self.mPosition = 0.0
        self.mGradient = QLinearGradient()
        self.mGradient.setSpread(QGradient.PadSpread)

        self.animation = QPropertyAnimation(self)
        self.animation.setTargetObject(self)
        self.animation.setPropertyName(b'position')
        self.animation.setStartValue(0.0)
        self.animation.setEndValue(1.0)
        self.animation.setDuration(200)
        self.animation.setEasingCurve(QEasingCurve.InOutExpo)

        self.animation.finished.connect(self.mPointer.update)

    @Property(float)
    def position(self):
        return self.mPosition

    @position.setter
    def position(self, value):
        self.mPosition = value
        self.mPointer.update()

    def draw(self, painter):
        r = self.mPointer.rect()
        margin = r.height() / 10
        shadow = self.mPointer.palette().color(QPalette.Dark)
        light = self.mPointer.palette().color(QPalette.Light)
        button = self.mPointer.palette().color(QPalette.Button)
        painter.setPen(Qt.NoPen)

        self.mGradient.setColorAt(0, shadow.darker(130))
        self.mGradient.setColorAt(1, light.darker(130))
        self.mGradient.setStart(0, r.height())
        self.mGradient.setFinalStop(0, 0)
        painter.setBrush(self.mGradient)
        painter.drawRoundedRect(r, r.height() / 2, r.height() / 2)

        self.mGradient.setColorAt(0, shadow.darker(140))
        self.mGradient.setColorAt(1, light.darker(160))
        self.mGradient.setStart(0, 0)
        self.mGradient.setFinalStop(0, r.height())
        painter.setBrush(self.mGradient)
        painter.drawRoundedRect(r.adjusted(margin, margin, -margin, -margin),
                                r.height() / 2,
                                r.height() / 2)

        self.mGradient.setColorAt(0, button.darker(130))
        self.mGradient.setColorAt(1, button)

        painter.setBrush(self.mGradient)

        x = r.height() / 2.0 + self.mPosition * (r.width() - r.height())
        painter.drawEllipse(QPointF(x,
                                    r.height() / 2),
                            r.height() / 2 - margin,
                            r.height() / 2 - margin)

        text = self.leftText if bool(self.mPosition) else self.rightText
        painter.setPen(QColor(255, 255, 255))
        font = QFont('Decorative', 10, QFont.Bold)
        fm = QFontMetrics(font)
        painter.setFont(font)
        textWidth = fm.width(text)
        textHeight = painter.font().pointSize()
        xpoint = r.width() - x - textWidth + 10 if bool(
            self.mPosition) else r.width() - x - 12
        painter.drawText(QPointF(xpoint,
                                 r.height() / 2 + textHeight / 2), text)

    @Slot(bool, name='animate')
    def animate(self, checked):
        self.animation.setDirection(QPropertyAnimation.Forward if checked else
                                    QPropertyAnimation.Backward)
        self.animation.start()
Beispiel #3
0
    xaxis.grid().setPen(QPen(QColor(140, 140, 140), 1, Qt.DotLine))
    yaxis.grid().setPen(QPen(QColor(140, 140, 140), 1, Qt.DotLine))
    xaxis.grid().setSubGridPen(QPen(QColor(80, 80, 80), 1, Qt.DotLine))
    yaxis.grid().setSubGridPen(QPen(QColor(80, 80, 80), 1, Qt.DotLine))
    xaxis.grid().setSubGridVisible(True)
    yaxis.grid().setSubGridVisible(True)
    xaxis.grid().setZeroLinePen(Qt.NoPen)
    yaxis.grid().setZeroLinePen(Qt.NoPen)

    lineEnd = QCPLineEnding.esSpikeArrow
    lineEnd2 = QCPLineEnding(QCPLineEnding.esSpikeArrow)
    xaxis.setUpperEnding(lineEnd2)
    yaxis.setUpperEnding(lineEnd2)

    plotGradient = QLinearGradient()
    plotGradient.setStart(0, 0)
    plotGradient.setFinalStop(0, 350)
    plotGradient.setColorAt(0, QColor(80, 80, 80))
    plotGradient.setColorAt(1, QColor(50, 50, 50))
    customPlot.setBackground(plotGradient)

    axisRectGradient = QLinearGradient()
    axisRectGradient.setStart(0, 0)
    axisRectGradient.setFinalStop(0, 350)
    axisRectGradient.setColorAt(0, QColor(80, 80, 80))
    axisRectGradient.setColorAt(1, QColor(30, 30, 30))
    customPlot.axisRect().setBackground(axisRectGradient)

    font = QtGui.QFont()
    font.setPointSize(12)
    color = QColor(Qt.white)
class GradientWidget(QLabel):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.gradient = QLinearGradient(0, 0, 0, self.height())
        self.labels = {}
        self.margin = 10
        self._barThickness = 20
        self._labelMargin = 2

        self._maxLabelWidth = None
        self._maxLabelHeight = None

        self._orientation = 'Vertical'
        self.setStyleSheet("background-color: rgba(255,0,255,0)")
        self.setAttribute(Qt.WA_NoSystemBackground)

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.HighQualityAntialiasing)

        # determine max width/height of all labels
        if self._maxLabelWidth is None or self._maxLabelHeight is None:
            self._maxLabelWidth = 0
            self._maxLabelHeight = 0
            for k in self.labels.values():
                b = painter.boundingRect(
                    QRectF(0, 0, 0, 0),
                    int(Qt.AlignLeft) | int(Qt.AlignVCenter), str(k))
                self._maxLabelWidth = max(self._maxLabelWidth, b.width())
                self._maxLabelHeight = max(self._maxLabelHeight, b.height())

        barRect = self.rect()

        if self._orientation == 'Vertical':
            # translate Y axis
            matrix = QMatrix()
            matrix.translate(0, self.height() - self.margin)
            matrix.scale(1, -1)
            painter.setMatrix(matrix)

            self.gradient.setFinalStop(0, self.height() - self.margin)
            barRect.setWidth(self._barThickness)
            barRect.setHeight(barRect.height() - 2 * self.margin)
            painter.fillRect(barRect, self.gradient)

            # restore normal coordinates
            painter.scale(1, -1)

            self.setMinimumWidth(self._barThickness + self._labelMargin +
                                 self._maxLabelWidth)

        elif self._orientation == 'Horizontal':
            self.margin = self._maxLabelWidth / 2 + self._labelMargin
            barRect.setHeight(self._barThickness)
            barRect.setLeft(
                self.margin
            )  # reduces width by margin (as opposed to shifting)

            # Reduce the width by another margin to pull off the right hand side
            barRect.setWidth(barRect.width() - self.margin)

            painter.fillRect(barRect, self.gradient)

            line_step = barRect.width() / 20
            pos = barRect.left()
            while pos <= barRect.right():
                painter.drawLine(pos,
                                 2 * (barRect.bottom() - barRect.top()) / 3,
                                 pos, barRect.bottom())
                pos += line_step

            self.setMinimumHeight(self._maxLabelHeight + self._barThickness +
                                  self._labelMargin)

        for pos, label in self.labels.items():
            # Figure coordinate position. 1=height-margin for vertical, or width-margin for horizontal
            if self._orientation == 'Vertical':
                lpos = -1 * ((self.height() - (2 * self.margin)) * pos)
                painter.drawText(self._barThickness + self._labelMargin,
                                 (.5 * self._maxLabelHeight) + lpos, label)
            elif self._orientation == 'Horizontal':
                text_rect = painter.boundingRect(QRectF(0, 0, 0, 0),
                                                 int(Qt.AlignLeft), str(label))
                lpos = ((self.width() - (2 * self.margin)) * pos
                        )  # Center position
                lleft = lpos - text_rect.width() / 2
                painter.drawText(lleft + self.margin, self.height() - 1, label)

    def setGradient(self, g):
        self.gradient = g
        self.gradient.setCoordinateMode(QGradient.ObjectMode)

        # Make sure we go end-to-end
        self.gradient.setFinalStop(1, 0)
        self.gradient.setStart(0, 0)

        self.repaint()

    def setLabels(self, l):
        self.labels = l
        # recalculate self.labelWidth on next paint
        self._maxLabelWidth = None
        self._maxLabelHeight = None
        self.repaint()

    def setOrientation(self, orientation):
        if not orientation in ('Horizontal', 'Vertical'):
            raise TypeError(
                "Orientation must be one of 'Horizontal' or 'Vertical'")

        self._orientation = orientation
        self.repaint()