예제 #1
0
        def generate_pens(basecolor):
            pen = QPen(basecolor, 1)
            pen.setCosmetic(True)

            shadow_pen = QPen(pen.color().lighter(160), 2.5)
            shadow_pen.setCosmetic(True)
            return pen, shadow_pen
예제 #2
0
        def generate_pens(basecolor):
            pen = QPen(basecolor, 1)
            pen.setCosmetic(True)

            shadow_pen = QPen(pen.color().lighter(160), 2.5)
            shadow_pen.setCosmetic(True)
            return pen, shadow_pen
def make_pen(brush=Qt.black, width=1, style=Qt.SolidLine,
             cap_style=Qt.SquareCap, join_style=Qt.BevelJoin,
             cosmetic=False):
    pen = QPen(brush)
    pen.setWidth(width)
    pen.setStyle(style)
    pen.setCapStyle(cap_style)
    pen.setJoinStyle(join_style)
    pen.setCosmetic(cosmetic)
    return pen
예제 #4
0
 def paint(self, painter, option, widget=None):
     painter.save()
     palette = self.palette()
     border = palette.brush(QPalette.Mid)
     pen = QPen(border, 1)
     pen.setCosmetic(True)
     painter.setPen(pen)
     painter.setBrush(palette.brush(QPalette.Window))
     brect = self.boundingRect()
     painter.drawRoundedRect(brect, 4, 4)
     painter.restore()
예제 #5
0
 def paint(self, painter, option, widget=None):
     painter.save()
     palette = self.palette()
     border = palette.brush(QPalette.Mid)
     pen = QPen(border, 1)
     pen.setCosmetic(True)
     painter.setPen(pen)
     painter.setBrush(palette.brush(QPalette.Window))
     brect = self.boundingRect()
     painter.drawRoundedRect(brect, 4, 4)
     painter.restore()
예제 #6
0
def make_pen(brush=Qt.black,
             width=1,
             style=Qt.SolidLine,
             cap_style=Qt.SquareCap,
             join_style=Qt.BevelJoin,
             cosmetic=False):
    pen = QPen(brush)
    pen.setWidth(width)
    pen.setStyle(style)
    pen.setCapStyle(cap_style)
    pen.setJoinStyle(join_style)
    pen.setCosmetic(cosmetic)
    return pen
    def __init__(self, id_pair, painter_path, initial_pen=None):
        super(SingleEdgeItem, self).__init__()
        self.parent = None  # Should be initialized with set_parent()
        self.id_pair = id_pair

        if not initial_pen:
            initial_pen = QPen()
            initial_pen.setCosmetic(True)
            initial_pen.setCapStyle(Qt.RoundCap)
            initial_pen.setColor(Qt.white)
            initial_pen.setWidth(3)

        self.setPen(initial_pen)
        self.setPath(painter_path)
예제 #8
0
    def __init__(self, id_pair, painter_path, initial_pen=None):
        super( SingleEdgeItem, self ).__init__()
        self.parent = None # Should be initialized with set_parent()
        self.id_pair = id_pair

        if not initial_pen:
            initial_pen = QPen()
            initial_pen.setCosmetic(True)
            initial_pen.setCapStyle(Qt.RoundCap)
            initial_pen.setColor(Qt.white)
            initial_pen.setWidth(3)

        self.setPen(initial_pen)
        self.setPath(painter_path)
예제 #9
0
    def _setup_plot(self):
        target = self.target_index
        selected = self.selected_classifiers
        curves = [self.plot_curves(target, clf_idx) for clf_idx in selected]

        for curve in curves:
            self.plot.addItem(curve.curve_item)

        if self.display_convex_hull:
            hull = convex_hull([c.curve.hull for c in curves])
            self.plot.plot(hull[0], hull[1], pen="y", antialias=True)

        pen = QPen(QColor(100, 100, 100, 100), 1, Qt.DashLine)
        pen.setCosmetic(True)
        self.plot.plot([0, 1], [0, 1], pen=pen, antialias=True)
예제 #10
0
    def __init__(self, size=None, offset=None, pen=None, brush=None):
        super().__init__(size, offset)

        self.layout.setContentsMargins(5, 5, 5, 5)
        self.layout.setVerticalSpacing(0)
        self.layout.setHorizontalSpacing(15)
        self.layout.setColumnAlignment(1, Qt.AlignLeft | Qt.AlignVCenter)

        if pen is None:
            pen = QPen(QColor(196, 197, 193, 200), 1)
            pen.setCosmetic(True)
        self.__pen = pen

        if brush is None:
            brush = QBrush(QColor(232, 232, 232, 100))
        self.__brush = brush
예제 #11
0
    def __init__(self, size=None, offset=None, pen=None, brush=None):
        super().__init__(size, offset)

        self.layout.setContentsMargins(5, 5, 5, 5)
        self.layout.setVerticalSpacing(0)
        self.layout.setHorizontalSpacing(15)
        self.layout.setColumnAlignment(1, Qt.AlignLeft | Qt.AlignVCenter)

        if pen is None:
            pen = QPen(QColor(196, 197, 193, 200), 1)
            pen.setCosmetic(True)
        self.__pen = pen

        if brush is None:
            brush = QBrush(QColor(232, 232, 232, 100))
        self.__brush = brush
예제 #12
0
def update_pen(pen, brush=None, width=None, style=None,
               cap_style=None, join_style=None,
               cosmetic=None):
    pen = QPen(pen)
    if brush is not None:
        pen.setBrush(QBrush(brush))
    if width is not None:
        pen.setWidth(width)
    if style is not None:
        pen.setStyle(style)
    if cap_style is not None:
        pen.setCapStyle(cap_style)
    if join_style is not None:
        pen.setJoinStyle(join_style)
    if cosmetic is not None:
        pen.setCosmetic(cosmetic)
    return pen
예제 #13
0
    def __updateStyleState(self):
        """
        Update the arrows' brush, pen, ... based on it's state
        """
        if self.isSelected():
            color = self.__color.darker(150)
            pen = QPen(QColor(96, 158, 215), Qt.DashDotLine)
            pen.setWidthF(1.25)
            pen.setCosmetic(True)
            self.__shadow.setColor(pen.color().darker(150))
        else:
            color = self.__color
            pen = QPen(Qt.NoPen)
            self.__shadow.setColor(QColor(63, 63, 63, 180))

        self.__arrowItem.setBrush(color)
        self.__arrowItem.setPen(pen)
예제 #14
0
    def __updateStyleState(self):
        """
        Update the arrows' brush, pen, ... based on it's state
        """
        if self.isSelected():
            color = self.__color.darker(150)
            pen = QPen(QColor(96, 158, 215), Qt.DashDotLine)
            pen.setWidthF(1.25)
            pen.setCosmetic(True)
            self.__shadow.setColor(pen.color().darker(150))
        else:
            color = self.__color
            pen = QPen(Qt.NoPen)
            self.__shadow.setColor(QColor(63, 63, 63, 180))

        self.__arrowItem.setBrush(color)
        self.__arrowItem.setPen(pen)
예제 #15
0
 def finalizeImage(self, painter, imageid, image_transform, size=None):
     caps = self.caps
     params = self.parameters
     if params.draw_line:
         pt1, pt2 = self.pts
         painter.save()
         painter.setWorldTransform(image_transform)
         pen = QPen()
         pen.setCosmetic(True)
         pen.setColor(params.line_color)
         pen.setWidth(params.line_width)
         painter.setPen(pen)
         painter.drawLine(pt1, pt2)
         painter.restore()
     del self.direction
     del self.pts
     del self.current_image
     return self.parameters.drawScaleBar(painter, caps, self.unit, size)
예제 #16
0
    def paint(self, painter, option, widget=None):
        """
        Paint a single line of the slice intersection marker.
        """
        width = self._parent._width
        height = self._parent._height
        thickness = self._parent.PEN_THICKNESS

        # Our pen thickness is consistent across zoom levels because the pen is "cosmetic"
        # However, that doesn't ensure a consistent-size dash pattern.
        # Determine the inverse scaling factor from scene to view to set a consistent dash pattern at all scales.
        view = self.scene().views()[0]
        inverted_transform, has_inverse = view.transform().inverted()
        dash_length = 4 / inverted_transform.m11()
        dash_length = max(0.5, dash_length)

        # Draw the line with two pens to get a black-and-white dashed line.
        #pen_white = QPen( Qt.white, thickness )
        pen_white = QPen(self._parent._cropColor, thickness)
        pen_white.setDashPattern([dash_length, dash_length])
        pen_white.setCosmetic(True)

        pen_black = QPen(Qt.black, thickness)
        pen_black.setDashPattern([dash_length, dash_length])
        pen_black.setCosmetic(True)
        pen_black.setDashOffset(dash_length)

        with painter_context(painter):
            t = painter.transform()
            painter.setTransform(self.scene().data2scene * t)

            # Draw the line with two pens to get a black-and-white dashed line.
            for pen in [pen_white, pen_black]:
                painter.setPen(pen)

                if self._direction == 'horizontal':
                    painter.drawLine(QPointF(0.0, self.position),
                                     QPointF(width, self.position))
                else:
                    painter.drawLine(QPointF(self.position, 0.0),
                                     QPointF(self.position, height))
예제 #17
0
    def plot_curves(self, target, clf_idx):
        if (target, clf_idx) not in self._curve_data:
            curve = LiftCurve_from_results(self.results, clf_idx, target)
            color = self.colors[clf_idx]
            pen = QPen(color, 1)
            pen.setCosmetic(True)
            shadow_pen = QPen(pen.color().lighter(160), 2.5)
            shadow_pen.setCosmetic(True)
            item = pg.PlotDataItem(
                curve.points[0], curve.points[1],
                pen=pen, shadowPen=shadow_pen,
                symbol="+", symbolSize=3, symbolPen=shadow_pen,
                antialias=True
            )
            hull_item = pg.PlotDataItem(
                curve.hull[0], curve.hull[1],
                pen=pen,  antialias=True
            )
            self._curve_data[target, clf_idx] = \
                PlotCurve(curve, item, hull_item)

        return self._curve_data[target, clf_idx]
예제 #18
0
    def paint(self, painter, option, widget=None):
        """
        Paint a single line of the slice intersection marker.
        """
        width = self._parent._width
        height = self._parent._height
        thickness = self._parent.PEN_THICKNESS

        # Our pen thickness is consistent across zoom levels because the pen is "cosmetic"
        # However, that doesn't ensure a consistent-size dash pattern.
        # Determine the inverse scaling factor from scene to view to set a consistent dash pattern at all scales.
        view = self.scene().views()[0]
        inverted_transform, has_inverse = view.transform().inverted()
        dash_length = 4 / inverted_transform.m11()
        dash_length = max( 0.5, dash_length )

        # Draw the line with two pens to get a black-and-white dashed line.
        #pen_white = QPen( Qt.white, thickness )
        pen_white = QPen( self._parent._cropColor, thickness )
        pen_white.setDashPattern([dash_length, dash_length])
        pen_white.setCosmetic(True)

        pen_black = QPen( Qt.black, thickness )
        pen_black.setDashPattern([dash_length, dash_length])
        pen_black.setCosmetic(True)
        pen_black.setDashOffset(dash_length)

        with painter_context(painter):
            t = painter.transform()
            painter.setTransform(self.scene().data2scene * t)

            # Draw the line with two pens to get a black-and-white dashed line.
            for pen in [pen_white, pen_black]:
                painter.setPen( pen )
    
                if self._direction == 'horizontal':
                    painter.drawLine( QPointF(0.0, self.position), QPointF(width, self.position) )
                else:
                    painter.drawLine( QPointF(self.position, 0.0), QPointF(self.position, height) )
예제 #19
0
    def _setup_plot(self):
        """Setup the plot with new curve data."""
        assert self.data is not None

        legend = self.graph.plotItem.addLegend(offset=(-30, 30))

        data, domain = self.data, self.data.domain
        if is_discrete(domain.class_var):
            class_col_data, _ = data.get_column_view(domain.class_var)

            group_indices = [
                np.flatnonzero(class_col_data == i)
                for i in range(len(domain.class_var.values))
            ]
        else:
            group_indices = [np.arange(len(data))]

        X = np.arange(1, len(domain.attributes) + 1)
        groups = []

        for i, indices in enumerate(group_indices):
            if self.classes:
                color = self.class_colors[i]
            else:
                color = QColor(Qt.darkGray)
            group_data = data[indices, :]
            plot_x, plot_y, connect = disconnected_curve_data(group_data.X,
                                                              x=X)

            color.setAlpha(200)
            lightcolor = QColor(color.lighter(factor=150))
            lightcolor.setAlpha(150)
            pen = QPen(color, 2)
            pen.setCosmetic(True)

            lightpen = QPen(lightcolor, 1)
            lightpen.setCosmetic(True)
            hoverpen = QPen(pen)
            hoverpen.setWidth(2)

            curve = pg.PlotCurveItem(
                x=plot_x,
                y=plot_y,
                connect=connect,
                pen=lightpen,
                symbolSize=2,
                antialias=True,
            )
            self.graph.addItem(curve)

            hovercurves = []
            for index, profile in zip(indices, group_data.X):
                hcurve = HoverCurve(x=X,
                                    y=profile,
                                    pen=hoverpen,
                                    antialias=True)
                hcurve.setToolTip('{}'.format(index))
                hcurve._data_index = index
                hovercurves.append(hcurve)
                self.graph.addItem(hcurve)

            mean = np.nanmean(group_data.X, axis=0)

            meancurve = pg.PlotDataItem(x=X,
                                        y=mean,
                                        pen=pen,
                                        size=5,
                                        symbol="o",
                                        pxMode=True,
                                        symbolSize=5,
                                        antialias=True)
            hoverpen = QPen(hoverpen)
            hoverpen.setWidth(5)

            hc = HoverCurve(x=X, y=mean, pen=hoverpen, antialias=True)
            hc.setFlag(QGraphicsItem.ItemIsSelectable, False)
            self.graph.addItem(hc)

            self.graph.addItem(meancurve)
            legend.addItem(meancurve, "  {}".format(self.classes[i]))
            q1, q2, q3 = np.nanpercentile(group_data.X, [25, 50, 75], axis=0)
            # TODO: implement and use a box plot item
            errorbar = pg.ErrorBarItem(x=X,
                                       y=mean,
                                       bottom=np.clip(mean - q1, 0, mean - q1),
                                       top=np.clip(q3 - mean, 0, q3 - mean),
                                       beam=0.5)
            self.graph.addItem(errorbar)
            groups.append(
                namespace(data=group_data,
                          indices=indices,
                          profiles=curve,
                          hovercurves=hovercurves,
                          mean=meancurve,
                          boxplot=errorbar))

        self.__groups = groups
        self.__update_visibility()
        self.__update_tooltips()
예제 #20
0
class SliceIntersectionMarker(QGraphicsItem) :
    """
    Marks a line within a ImageView2D/ImageScene2D.  
    Used within a VolumeEditor to show the current slicing position.
    """
    thick_width = 2
    thin_width = 0.5
    _diameter = 4

    def boundingRect(self):
        # Return an empty rect to indicate 'no content'
        # This 'item' is merely a parent node for child items
        return QRectF()

    def __init__(self, scene, axis, posModel):
        """
        scene: Must be an ImageScene2D instance.  We manipulate the scene.allow_brushing flag.
        """
        QGraphicsItem.__init__(self, scene=scene)
        self.setFlag(QGraphicsItem.ItemHasNoContents);
        
        self.axis = axis
        self.posModel = posModel
        
        self._width = 0
        self._height = 0

        self.thick_penX = QPen(Qt.red, self.thick_width)
        self.thick_penX.setCosmetic(True)

        self.thick_penY = QPen(Qt.green, self.thick_width)
        self.thick_penY.setCosmetic(True)

        self.thin_penX = QPen(Qt.red, self.thin_width)
        self.thin_penX.setCosmetic(True)

        self.thin_penY = QPen(Qt.green, self.thin_width)
        self.thin_penY.setCosmetic(True)

        self.x = 0
        self.y = 0

        # These child items do most of the work.
        self._horizontal_marker = SliceMarkerLine(self, 'horizontal')
        self._vertical_marker = SliceMarkerLine(self, 'vertical')

    #be careful: QGraphicsItem has a shape() method, which
    #we cannot override, therefore we choose this name
    @property
    def dataShape(self):
        return (self._width, self._height)
    @dataShape.setter
    def dataShape(self, shape2D):
        self._width = shape2D[0]
        self._height = shape2D[1]

    def setPosition(self, x, y):
        self.x = x
        self.y = y
        self._horizontal_marker.prepareGeometryChange()
        self._vertical_marker.prepareGeometryChange()
        self.update()

    def _get_diameter(self):
        return self._diameter

    def _set_diameter(self, value):
        self._diameter = value

    diameter = property(_get_diameter, _set_diameter)

    def setPositionX(self, x):
        self.setPosition(x, self.y)

    def setPositionY(self, y):
        self.setPosition(self.x, y)

    def setColor(self, colorX, colorY):
        self.thick_penX = QPen(colorX, self.thick_width)
        self.thick_penX.setCosmetic(True)
        self.thick_penY = QPen(colorY, self.thick_width)
        self.thick_penY.setCosmetic(True)

        self.thin_penX = QPen(colorX, self.thin_width)
        self.thin_penX.setCosmetic(True)
        self.thin_penY = QPen(colorY, self.thin_width)
        self.thin_penY.setCosmetic(True)

        self.update()

    def paint(self, painter, option, widget=None):
        pass # No content.

    def paint_line(self, painter, direction):
        """
        Paint a single line of the slice intersection marker.
        """
        if not self.isVisible:
            return

        painter.save()
        t = painter.transform()
        painter.setTransform(self.scene().data2scene * t )

        # Thin line directly over intersection
        if direction == 'horizontal':
            painter.setPen(self.thin_penY)
            painter.drawLine(QPointF(0.0,self.y), QPointF(self._width, self.y))
        else:
            painter.setPen(self.thin_penX)
            painter.drawLine(QPointF(self.x, 0), QPointF(self.x, self._height))

        radius = self.diameter / 2 + 1

        # Thick line elsewhere
        if direction == 'horizontal':
            painter.setPen(self.thick_penY)
            painter.drawLine(QPointF(0.0, self.y), QPointF(self.x - radius, self.y))
            painter.drawLine(QPointF(self.x + radius, self.y), QPointF(self._width, self.y))
        else:
            painter.setPen(self.thick_penX)
            painter.drawLine(QPointF(self.x, 0), QPointF(self.x, self.y - radius))
            painter.drawLine(QPointF(self.x, self.y + radius), QPointF(self.x, self._height))

        painter.restore()
예제 #21
0
 def make_pen(color, width):
     p = QPen(color, width)
     p.setCosmetic(True)
     return p
예제 #22
0
파일: owpaintdata.py 프로젝트: r0k3/orange3
 def pen(color):
     pen = QPen(color, 1)
     pen.setCosmetic(True)
     return pen
예제 #23
0
    def _setup_plot(self):
        """Setup the plot with new curve data."""
        assert self.data is not None
        self.graph.clear()

        data, domain = self.data, self.data.domain
        var = domain[self.group_var]
        class_col_data, _ = data.get_column_view(var)
        group_indices = [np.flatnonzero(class_col_data == i)
                         for i in range(len(self.classes))]

        self.graph.getAxis('bottom').setTicks([
            [(i+1, str(a)) for i, a in enumerate(self.graph_variables)]
        ])

        X = np.arange(1, len(self.graph_variables)+1)
        groups = []

        for i, indices in enumerate(group_indices):
            if len(indices) == 0:
                groups.append(None)
            else:
                if self.classes:
                    color = self.class_colors[i]
                else:
                    color = QColor(Qt.darkGray)
                group_data = data[indices, self.graph_variables]
                plot_x, plot_y, connect = disconnected_curve_data(group_data.X, x=X)

                color.setAlpha(200)
                lightcolor = QColor(color.lighter(factor=150))
                lightcolor.setAlpha(150)
                pen = QPen(color, 2)
                pen.setCosmetic(True)

                lightpen = QPen(lightcolor, 1)
                lightpen.setCosmetic(True)

                curve = pg.PlotCurveItem(
                    x=plot_x, y=plot_y, connect=connect,
                    pen=lightpen, symbolSize=2, antialias=True,
                )
                self.graph.addItem(curve)

                mean = np.nanmean(group_data.X, axis=0)

                meancurve = pg.PlotDataItem(
                    x=X, y=mean, pen=pen, size=5, symbol="o", pxMode=True,
                    symbolSize=5, antialias=True
                )
                self.graph.addItem(meancurve)

                q1, q2, q3 = np.nanpercentile(group_data.X, [25, 50, 75], axis=0)
                # TODO: implement and use a box plot item
                errorbar = pg.ErrorBarItem(
                    x=X, y=mean,
                    bottom=np.clip(mean - q1, 0, mean - q1),
                    top=np.clip(q3 - mean, 0, q3 - mean),
                    beam=0.5
                )
                self.graph.addItem(errorbar)
                groups.append(
                    namespace(
                        data=group_data, indices=indices,
                        profiles=curve, mean=meancurve,
                        boxplot=errorbar)
                )

        self.__groups = groups
        self.__update_visibility()
예제 #24
0
class CrossHairCursor(QGraphicsItem) :
    """
    A 2D cross-hair cursor centered around a point (x,y) on the scene.
    A cross hair cursor usually follows the mouse cursor and has a color
    and marks the size of the current brush.   
    """
    modeYPosition  = 0
    modeXPosition  = 1
    modeXYPosition = 2
    
    def boundingRect(self):
        return QRectF(0,0, self.width, self.height)
    
    def __init__(self, scene=None):
        QGraphicsItem.__init__(self, scene=scene)
        
        self.width = 0
        self.height = 0
        
        self.penDotted = QPen(Qt.red, 2, Qt.DotLine, Qt.RoundCap, Qt.RoundJoin)
        self.penDotted.setCosmetic(True)
        
        self.penSolid = QPen(Qt.red, 2)
        self.penSolid.setCosmetic(True)
        
        self.x = 0
        self.y = 0
        self.brushSize = 0
        
        self.mode = self.modeXYPosition
    
    @property
    def shape(self):
        return (self.width, self.height)
    @shape.setter
    def shape(self, shape2D):
        self.width  = shape2D[0]
        self.height = shape2D[1]
    
    def setColor(self, color):
        self.penDotted = QPen(color, 2, Qt.DotLine, Qt.RoundCap, Qt.RoundJoin)
        self.penDotted.setCosmetic(True)
        self.penSolid  = QPen(color, 2)
        self.penSolid.setCosmetic(True)
        self.update()
    
    def showXPosition(self, x, y):
        """only mark the x position by displaying a line f(y) = x"""
        self.setVisible(True)
        self.mode = self.modeXPosition
        self.setPos(x, y - int(y))
        
    def showYPosition(self, y, x):
        """only mark the y position by displaying a line f(x) = y"""
        self.setVisible(True)
        self.mode = self.modeYPosition
        self.setPos(x - int(x), y)
        
    def showXYPosition(self, x,y):
        """mark the (x,y) position by displaying a cross hair cursor
           including a circle indicating the current brush size"""
        self.setVisible(True)
        self.mode = self.modeXYPosition
        #add 0.5 on each value to make crosshair snap to center of a pixel
        self.setPos(x+0.5,y+0.5)
    
    def paint(self, painter, option, widget=None):
        painter.setPen(self.penDotted)
        
        if self.mode == self.modeXPosition:
            painter.drawLine(QPointF(self.x +0.5, 0), QPointF(self.x +0.5, self.height))
        elif self.mode == self.modeYPosition:
            painter.drawLine(QPointF(0, self.y), QPointF(self.width, self.y))
        else:
            painter.drawLine(QPointF(self.x -0.5*self.brushSize -3 ,self.y), QPointF(self.x -0.5*self.brushSize, self.y))
            painter.drawLine(QPointF(self.x+0.5*self.brushSize, self.y), QPointF(self.x+0.5*self.brushSize +3, self.y))

            painter.drawLine(QPointF(self.x, self.y-0.5*self.brushSize - 3), QPointF(self.x, self.y-0.5*self.brushSize))
            painter.drawLine(QPointF(self.x, self.y+0.5*self.brushSize), QPointF(self.x, self.y+0.5*self.brushSize + 3))

            painter.setPen(self.penSolid)
            painter.drawEllipse(QPointF(self.x, self.y), 0.5*self.brushSize, 0.5*self.brushSize)
        
    def setPos(self, x, y):
        self.x = x
        self.y = y
        self.update()
        
    def setBrushSize(self, size):
        self.brushSize = size
        self.update()
예제 #25
0
class CrossHairCursor(QGraphicsItem):
    """
    A 2D cross-hair cursor centered around a point (x,y) on the scene.
    A cross hair cursor usually follows the mouse cursor and has a color
    and marks the size of the current brush.
    """
    modeYPosition = 0
    modeXPosition = 1
    modeXYPosition = 2

    def boundingRect(self):
        return self.scene().data2scene.mapRect(
            QRectF(0, 0, self._width, self._height))

    def __init__(self, scene):
        QGraphicsItem.__init__(self, scene=scene)

        self._width = 0
        self._height = 0

        self.penDotted = QPen(Qt.red, 2, Qt.DotLine, Qt.RoundCap, Qt.RoundJoin)
        self.penDotted.setCosmetic(True)

        self.penSolid = QPen(Qt.red, 2)
        self.penSolid.setCosmetic(True)

        self.x = 0
        self.y = 0
        self.brushSize = 0

        self.mode = self.modeXYPosition
        self._enabled = True

    @property
    def enabled(self):
        return self._enabled

    @enabled.setter
    def enabled(self, v):
        if not v:
            self.setVisible(False)
        self._enabled = v

    def setVisible(self, visible):
        # TODO: though the crosshair is hidden, its position is still
        # updated. instead of just hiding it, we should
        # not instantiate it in the first place.
        if self._enabled:
            super(CrossHairCursor, self).setVisible(visible)

    #be careful: QGraphicsItem has a shape() method, which
    #we cannot override, therefore we choose this name
    @property
    def dataShape(self):
        return (self._width, self._height)

    @dataShape.setter
    def dataShape(self, shape2D):
        self._width = shape2D[0]
        self._height = shape2D[1]

    def setColor(self, color):
        self.penDotted = QPen(color, 2, Qt.DotLine, Qt.RoundCap, Qt.RoundJoin)
        self.penDotted.setCosmetic(True)
        self.penSolid = QPen(color, 2)
        self.penSolid.setCosmetic(True)
        self.update()

    def showXPosition(self, x, y):
        """only mark the x position by displaying a line f(y) = x"""
        self.setVisible(True)
        self.mode = self.modeXPosition
        self.setPos(x, y - int(y))

    def showYPosition(self, y, x):
        """only mark the y position by displaying a line f(x) = y"""
        self.setVisible(True)
        self.mode = self.modeYPosition
        self.setPos(x - int(x), y)

    def showXYPosition(self, x, y):
        """mark the (x,y) position by displaying a cross hair cursor
           including a circle indicating the current brush size"""
        self.setVisible(True)
        self.mode = self.modeXYPosition
        self.setPos(x, y)

    def paint(self, painter, option, widget=None):

        painter.save()
        painter.setTransform(self.scene().data2scene * painter.transform())

        painter.setPen(self.penDotted)

        if self.mode == self.modeXPosition:
            painter.drawLine(QPointF(self.x + 0.5, 0),
                             QPointF(self.x + 0.5, self._height))
        elif self.mode == self.modeYPosition:
            painter.drawLine(QPointF(0, self.y), QPointF(self.width, self.y))
        else:
            painter.drawLine(
                QPointF(self.x - 0.5 * self.brushSize - 3, self.y),
                QPointF(self.x - 0.5 * self.brushSize, self.y))
            painter.drawLine(
                QPointF(self.x + 0.5 * self.brushSize, self.y),
                QPointF(self.x + 0.5 * self.brushSize + 3, self.y))

            painter.drawLine(
                QPointF(self.x, self.y - 0.5 * self.brushSize - 3),
                QPointF(self.x, self.y - 0.5 * self.brushSize))
            painter.drawLine(
                QPointF(self.x, self.y + 0.5 * self.brushSize),
                QPointF(self.x, self.y + 0.5 * self.brushSize + 3))

            painter.setPen(self.penSolid)
            painter.drawEllipse(QPointF(self.x, self.y), 0.5 * self.brushSize,
                                0.5 * self.brushSize)

        painter.restore()

    def setPos(self, x, y):
        self.x = x
        self.y = y
        self.update()

    def setBrushSize(self, size):
        self.brushSize = size
        self.update()
class SliceIntersectionMarker(QGraphicsItem) :
    """
    Marks a line within a ImageView2D/ImageScene2D
    """
    
    def boundingRect(self):
        return QRectF(0,0, self.width, self.height)
    
    def __init__(self):
        QGraphicsItem.__init__(self)
        
        self.width = 0
        self.height = 0
              
        self.penX = QPen(Qt.red, 2)
        self.penX.setCosmetic(True)
        
        self.penY = QPen(Qt.green, 2)
        self.penY.setCosmetic(True)
        
        self.x = 0
        self.y = 0
        
        self.isVisible = False

    @property
    def shape(self):
        return (self.width, self.height)
    @shape.setter
    def shape(self, shape2D):
        self.width = shape2D[0]
        self.height = shape2D[1]

    def setPosition(self, x, y):
        self.x = x
        self.y = y
        self.update()
        
    def setPositionX(self, x):
        self.setPosition(x, self.y)
        
    def setPositionY(self, y):
        self.setPosition(self.x, y)  
   
    def setColor(self, colorX, colorY):
        self.penX = QPen(colorX, 2)
        self.penX.setCosmetic(True)
        self.penY = QPen(colorY, 2)
        self.penY.setCosmetic(True)
        self.update()
        
    def setVisibility(self, state):
        if state == True:
            self.isVisible = True
        else:
            self.isVisible = False
        self.update()
    
    def paint(self, painter, option, widget=None):
        if self.isVisible:
            painter.setPen(self.penY)
            painter.drawLine(QPointF(0.0,self.y), QPointF(self.width, self.y))
            
            painter.setPen(self.penX)
            painter.drawLine(QPointF(self.x, 0), QPointF(self.x, self.height))
class SliceIntersectionMarker(QGraphicsItem) :
    """
    Marks a line within a ImageView2D/ImageScene2D
    """
    thick_width = 2
    thin_width = 0.5
    _diameter = 4

    def boundingRect(self):
        return self.scene().data2scene.mapRect(QRectF(0,0, self._width, self._height));

    def __init__(self, scene):
        QGraphicsItem.__init__(self, scene=scene)

        self._width = 0
        self._height = 0

        self.thick_penX = QPen(Qt.red, self.thick_width)
        self.thick_penX.setCosmetic(True)

        self.thick_penY = QPen(Qt.green, self.thick_width)
        self.thick_penY.setCosmetic(True)

        self.thin_penX = QPen(Qt.red, self.thin_width)
        self.thin_penX.setCosmetic(True)

        self.thin_penY = QPen(Qt.green, self.thin_width)
        self.thin_penY.setCosmetic(True)

        self.x = 0
        self.y = 0

        self.isVisible = True

    #be careful: QGraphicsItem has a shape() method, which
    #we cannot override, therefore we choose this name
    @property
    def dataShape(self):
        return (self._width, self._height)
    @dataShape.setter
    def dataShape(self, shape2D):
        self._width = shape2D[0]
        self._height = shape2D[1]

    def setPosition(self, x, y):
        self.x = x
        self.y = y
        self.update()


    def _get_diameter(self):
        return self._diameter

    def _set_diameter(self, value):
        self._diameter = value

    diameter = property(_get_diameter, _set_diameter)

    def setPositionX(self, x):
        self.setPosition(x, self.y)

    def setPositionY(self, y):
        self.setPosition(self.x, y)

    def setColor(self, colorX, colorY):
        self.thick_penX = QPen(colorX, self.thick_width)
        self.thick_penX.setCosmetic(True)
        self.thick_penY = QPen(colorY, self.thick_width)
        self.thick_penY.setCosmetic(True)

        self.thin_penX = QPen(colorX, self.thin_width)
        self.thin_penX.setCosmetic(True)
        self.thin_penY = QPen(colorY, self.thin_width)
        self.thin_penY.setCosmetic(True)

        self.update()

    def setVisibility(self, state):
        if state == True:
            self.isVisible = True
        else:
            self.isVisible = False
        self.update()

    def paint(self, painter, option, widget=None):
        if self.isVisible:
            painter.save()
            t = painter.transform()
            painter.setTransform(self.scene().data2scene  * t )

            painter.setPen(self.thin_penY)
            painter.drawLine(QPointF(0.0,self.y), QPointF(self._width, self.y))

            painter.setPen(self.thin_penX)
            painter.drawLine(QPointF(self.x, 0), QPointF(self.x, self._height))

            radius = self.diameter / 2 + 1

            painter.setPen(self.thick_penY)
            painter.drawLine(QPointF(0.0, self.y), QPointF(self.x - radius, self.y))
            painter.drawLine(QPointF(self.x + radius, self.y), QPointF(self._width, self.y))

            painter.setPen(self.thick_penX)
            painter.drawLine(QPointF(self.x, 0), QPointF(self.x, self.y - radius))
            painter.drawLine(QPointF(self.x, self.y + radius), QPointF(self.x, self._height))


            painter.restore()
if __name__ == "__main__":
    import time
    import numpy as np
    from PyQt4.QtGui import QApplication, QGraphicsView, QGraphicsScene, QTransform

    app = QApplication([])

    import h5py
    with h5py.File('/magnetic/data/multicut-testdata/2d/256/Superpixels.h5',
                   'r') as superpixels_f:
        labels_img = superpixels_f['data'][:]
        labels_img = labels_img[..., 0]  # drop channel

    default_pen = QPen()
    default_pen.setCosmetic(True)
    default_pen.setCapStyle(Qt.RoundCap)
    default_pen.setColor(Qt.blue)
    default_pen.setWidth(3)

    # Changes to this pen table will be detected automatically in the QGraphicsItem
    pen_table = SignalingDefaultDict(parent=None,
                                     default_factory=lambda: default_pen)

    start = time.time()
    path_items = generate_path_items_for_labels(pen_table, labels_img, None)
    print "generate took {}".format(time.time() - start)  # 52 ms

    edges_item = SegmentationEdgesItem(path_items, pen_table)

    def assign_random_color(id_pair, buttons):
예제 #29
0
    return path

if __name__ == "__main__":
    import time
    import numpy as np
    from PyQt4.QtGui import QApplication, QGraphicsView, QGraphicsScene, QTransform

    app = QApplication([])

    import h5py
    with h5py.File('/magnetic/data/multicut-testdata/2d/256/Superpixels.h5', 'r') as superpixels_f:
        labels_img = superpixels_f['data'][:]
        labels_img = labels_img[...,0] # drop channel

    default_pen = QPen()
    default_pen.setCosmetic(True)
    default_pen.setCapStyle(Qt.RoundCap)
    default_pen.setColor(Qt.blue)
    default_pen.setWidth(3)

    # Changes to this pen table will be detected automatically in the QGraphicsItem
    pen_table = SignalingDefaultDict(parent=None, default_factory=lambda:default_pen)

    start = time.time()
    path_items = generate_path_items_for_labels(pen_table, labels_img, None)
    print "generate took {}".format(time.time() - start) # 52 ms

    edges_item = SegmentationEdgesItem(path_items, pen_table)
    
    def assign_random_color( id_pair):
        print "handling click: {}".format(id_pair)
예제 #30
0
    def _setup_plot(self):
        """Setup the plot with new curve data."""
        assert self.data is not None

        legend = self.graph.plotItem.addLegend(offset=(-30, 30))

        data, domain = self.data, self.data.domain
        if is_discrete(domain.class_var):
            class_col_data, _ = data.get_column_view(domain.class_var)

            group_indices = [np.flatnonzero(class_col_data == i)
                             for i in range(len(domain.class_var.values))]
        else:
            group_indices = [np.arange(len(data))]

        X = np.arange(1, len(domain.attributes)+1)
        groups = []

        for i, indices in enumerate(group_indices):
            if self.classes:
                color = self.class_colors[i]
            else:
                color = QColor(Qt.darkGray)
            group_data = data[indices, :]
            plot_x, plot_y, connect = disconnected_curve_data(group_data.X, x=X)

            color.setAlpha(200)
            lightcolor = QColor(color.lighter(factor=150))
            lightcolor.setAlpha(150)
            pen = QPen(color, 2)
            pen.setCosmetic(True)

            lightpen = QPen(lightcolor, 1)
            lightpen.setCosmetic(True)
            hoverpen = QPen(pen)
            hoverpen.setWidth(2)

            curve = pg.PlotCurveItem(
                x=plot_x, y=plot_y, connect=connect,
                pen=lightpen, symbolSize=2, antialias=True,
            )
            self.graph.addItem(curve)

            hovercurves = []
            for index, profile in zip(indices, group_data.X):
                hcurve = HoverCurve(x=X, y=profile, pen=hoverpen,
                                    antialias=True)
                hcurve.setToolTip('{}'.format(index))
                hcurve._data_index = index
                hovercurves.append(hcurve)
                self.graph.addItem(hcurve)

            mean = np.nanmean(group_data.X, axis=0)

            meancurve = pg.PlotDataItem(
                x=X, y=mean, pen=pen, size=5, symbol="o", pxMode=True,
                symbolSize=5, antialias=True
            )
            hoverpen = QPen(hoverpen)
            hoverpen.setWidth(5)

            hc = HoverCurve(x=X, y=mean, pen=hoverpen, antialias=True)
            hc.setFlag(QGraphicsItem.ItemIsSelectable, False)
            self.graph.addItem(hc)

            self.graph.addItem(meancurve)
            legend.addItem(meancurve, "  {}".format(self.classes[i]))
            q1, q2, q3 = np.nanpercentile(group_data.X, [25, 50, 75], axis=0)
            # TODO: implement and use a box plot item
            errorbar = pg.ErrorBarItem(
                x=X, y=mean,
                bottom=np.clip(mean - q1, 0, mean - q1),
                top=np.clip(q3 - mean, 0, q3 - mean),
                beam=0.5
            )
            self.graph.addItem(errorbar)
            groups.append(
                namespace(
                    data=group_data, indices=indices, profiles=curve,
                    hovercurves=hovercurves, mean=meancurve, boxplot=errorbar)
            )

        self.__groups = groups
        self.__update_visibility()
        self.__update_tooltips()
예제 #31
0
class SliceIntersectionMarker(QGraphicsItem):
    """
    Marks a line within a ImageView2D/ImageScene2D.  
    Used within a VolumeEditor to show the current slicing position.
    """
    thick_width = 2
    thin_width = 0.5
    _diameter = 4

    def boundingRect(self):
        # Return an empty rect to indicate 'no content'
        # This 'item' is merely a parent node for child items
        return QRectF()

    def __init__(self, scene, axis, posModel):
        """
        scene: Must be an ImageScene2D instance.  We manipulate the scene.allow_brushing flag.
        """
        QGraphicsItem.__init__(self, scene=scene)
        self.setFlag(QGraphicsItem.ItemHasNoContents)

        self.axis = axis
        self.posModel = posModel

        self._width = 0
        self._height = 0

        self.thick_penX = QPen(Qt.red, self.thick_width)
        self.thick_penX.setCosmetic(True)

        self.thick_penY = QPen(Qt.green, self.thick_width)
        self.thick_penY.setCosmetic(True)

        self.thin_penX = QPen(Qt.red, self.thin_width)
        self.thin_penX.setCosmetic(True)

        self.thin_penY = QPen(Qt.green, self.thin_width)
        self.thin_penY.setCosmetic(True)

        self.x = 0
        self.y = 0

        # These child items do most of the work.
        self._horizontal_marker = SliceMarkerLine(self, 'horizontal')
        self._vertical_marker = SliceMarkerLine(self, 'vertical')

    #be careful: QGraphicsItem has a shape() method, which
    #we cannot override, therefore we choose this name
    @property
    def dataShape(self):
        return (self._width, self._height)

    @dataShape.setter
    def dataShape(self, shape2D):
        self._width = shape2D[0]
        self._height = shape2D[1]

    def setPosition(self, x, y):
        self.x = x
        self.y = y
        self._horizontal_marker.prepareGeometryChange()
        self._vertical_marker.prepareGeometryChange()
        self.update()

    def _get_diameter(self):
        return self._diameter

    def _set_diameter(self, value):
        self._diameter = value

    diameter = property(_get_diameter, _set_diameter)

    def setPositionX(self, x):
        self.setPosition(x, self.y)

    def setPositionY(self, y):
        self.setPosition(self.x, y)

    def setColor(self, colorX, colorY):
        self.thick_penX = QPen(colorX, self.thick_width)
        self.thick_penX.setCosmetic(True)
        self.thick_penY = QPen(colorY, self.thick_width)
        self.thick_penY.setCosmetic(True)

        self.thin_penX = QPen(colorX, self.thin_width)
        self.thin_penX.setCosmetic(True)
        self.thin_penY = QPen(colorY, self.thin_width)
        self.thin_penY.setCosmetic(True)

        self.update()

    def paint(self, painter, option, widget=None):
        pass  # No content.

    def paint_line(self, painter, direction):
        """
        Paint a single line of the slice intersection marker.
        """
        if not self.isVisible:
            return

        painter.save()
        t = painter.transform()
        painter.setTransform(self.scene().data2scene * t)

        # Thin line directly over intersection
        if direction == 'horizontal':
            painter.setPen(self.thin_penY)
            painter.drawLine(QPointF(0.0, self.y),
                             QPointF(self._width, self.y))
        else:
            painter.setPen(self.thin_penX)
            painter.drawLine(QPointF(self.x, 0), QPointF(self.x, self._height))

        radius = self.diameter / 2 + 1

        # Thick line elsewhere
        if direction == 'horizontal':
            painter.setPen(self.thick_penY)
            painter.drawLine(QPointF(0.0, self.y),
                             QPointF(self.x - radius, self.y))
            painter.drawLine(QPointF(self.x + radius, self.y),
                             QPointF(self._width, self.y))
        else:
            painter.setPen(self.thick_penX)
            painter.drawLine(QPointF(self.x, 0),
                             QPointF(self.x, self.y - radius))
            painter.drawLine(QPointF(self.x, self.y + radius),
                             QPointF(self.x, self._height))

        painter.restore()
예제 #32
0
 def make_pen(color, width):
     p = QPen(color, width)
     p.setCosmetic(True)
     return p
예제 #33
0
class CrossHairCursor(QGraphicsItem) :
    """
    A 2D cross-hair cursor centered around a point (x,y) on the scene.
    A cross hair cursor usually follows the mouse cursor and has a color
    and marks the size of the current brush.
    """
    modeYPosition  = 0
    modeXPosition  = 1
    modeXYPosition = 2

    def boundingRect(self):
        return self.scene().data2scene.mapRect(QRectF(0,0, self._width, self._height))

    def __init__(self, scene):
        QGraphicsItem.__init__(self, scene=scene)

        self._width = 0
        self._height = 0

        self.penDotted = QPen(Qt.red, 2, Qt.DotLine, Qt.RoundCap, Qt.RoundJoin)
        self.penDotted.setCosmetic(True)

        self.penSolid = QPen(Qt.red, 2)
        self.penSolid.setCosmetic(True)

        self.x = 0
        self.y = 0
        self.brushSize = 0

        self.mode = self.modeXYPosition
        self._enabled = True

    @property
    def enabled(self):
        return self._enabled

    @enabled.setter
    def enabled(self, v):
        if not v:
            self.setVisible(False)
        self._enabled = v

    def setVisible(self, visible):
        # TODO: though the crosshair is hidden, its position is still
        # updated. instead of just hiding it, we should
        # not instantiate it in the first place.
        if self._enabled:
            super(CrossHairCursor, self).setVisible(visible)

    #be careful: QGraphicsItem has a shape() method, which
    #we cannot override, therefore we choose this name
    @property
    def dataShape(self):
        return (self._width, self._height)

    @dataShape.setter
    def dataShape(self, shape2D):
        self._width  = shape2D[0]
        self._height = shape2D[1]

    def setColor(self, color):
        self.penDotted = QPen(color, 2, Qt.DotLine, Qt.RoundCap, Qt.RoundJoin)
        self.penDotted.setCosmetic(True)
        self.penSolid  = QPen(color, 2)
        self.penSolid.setCosmetic(True)
        self.update()

    def showXPosition(self, x, y):
        """only mark the x position by displaying a line f(y) = x"""
        self.setVisible(True)
        self.mode = self.modeXPosition
        self.setPos(x, y - int(y))

    def showYPosition(self, y, x):
        """only mark the y position by displaying a line f(x) = y"""
        self.setVisible(True)
        self.mode = self.modeYPosition
        self.setPos(x - int(x), y)

    def showXYPosition(self, x,y):
        """mark the (x,y) position by displaying a cross hair cursor
           including a circle indicating the current brush size"""
        self.setVisible(True)
        self.mode = self.modeXYPosition
        self.setPos(x,y)

    def paint(self, painter, option, widget=None):

        painter.save()
        painter.setTransform(self.scene().data2scene  * painter.transform() )

        painter.setPen(self.penDotted)

        if self.mode == self.modeXPosition:
            painter.drawLine(QPointF(self.x +0.5, 0), QPointF(self.x +0.5, self._height))
        elif self.mode == self.modeYPosition:
            painter.drawLine(QPointF(0, self.y), QPointF(self.width, self.y))
        else:
            painter.drawLine(QPointF(self.x -0.5*self.brushSize -3 ,self.y), QPointF(self.x -0.5*self.brushSize, self.y))
            painter.drawLine(QPointF(self.x+0.5*self.brushSize, self.y), QPointF(self.x+0.5*self.brushSize +3, self.y))

            painter.drawLine(QPointF(self.x, self.y-0.5*self.brushSize - 3), QPointF(self.x, self.y-0.5*self.brushSize))
            painter.drawLine(QPointF(self.x, self.y+0.5*self.brushSize), QPointF(self.x, self.y+0.5*self.brushSize + 3))

            painter.setPen(self.penSolid)
            painter.drawEllipse(QPointF(self.x, self.y), 0.5*self.brushSize, 0.5*self.brushSize)

        painter.restore()

    def setPos(self, x, y):
        self.x = x
        self.y = y
        self.update()

    def setBrushSize(self, size):
        self.brushSize = size
        self.update()
예제 #34
0
class SliceIntersectionMarker(QGraphicsItem):
    """
    Marks a line within a ImageView2D/ImageScene2D
    """
    thick_width = 2
    thin_width = 0.5
    _diameter = 4

    def boundingRect(self):
        return self.scene().data2scene.mapRect(
            QRectF(0, 0, self._width, self._height))

    def __init__(self, scene):
        QGraphicsItem.__init__(self, scene=scene)

        self._width = 0
        self._height = 0

        self.thick_penX = QPen(Qt.red, self.thick_width)
        self.thick_penX.setCosmetic(True)

        self.thick_penY = QPen(Qt.green, self.thick_width)
        self.thick_penY.setCosmetic(True)

        self.thin_penX = QPen(Qt.red, self.thin_width)
        self.thin_penX.setCosmetic(True)

        self.thin_penY = QPen(Qt.green, self.thin_width)
        self.thin_penY.setCosmetic(True)

        self.x = 0
        self.y = 0

        self.isVisible = True

    #be careful: QGraphicsItem has a shape() method, which
    #we cannot override, therefore we choose this name
    @property
    def dataShape(self):
        return (self._width, self._height)

    @dataShape.setter
    def dataShape(self, shape2D):
        self._width = shape2D[0]
        self._height = shape2D[1]

    def setPosition(self, x, y):
        self.x = x
        self.y = y
        self.update()

    def _get_diameter(self):
        return self._diameter

    def _set_diameter(self, value):
        self._diameter = value

    diameter = property(_get_diameter, _set_diameter)

    def setPositionX(self, x):
        self.setPosition(x, self.y)

    def setPositionY(self, y):
        self.setPosition(self.x, y)

    def setColor(self, colorX, colorY):
        self.thick_penX = QPen(colorX, self.thick_width)
        self.thick_penX.setCosmetic(True)
        self.thick_penY = QPen(colorY, self.thick_width)
        self.thick_penY.setCosmetic(True)

        self.thin_penX = QPen(colorX, self.thin_width)
        self.thin_penX.setCosmetic(True)
        self.thin_penY = QPen(colorY, self.thin_width)
        self.thin_penY.setCosmetic(True)

        self.update()

    def setVisibility(self, state):
        if state == True:
            self.isVisible = True
        else:
            self.isVisible = False
        self.update()

    def paint(self, painter, option, widget=None):
        if self.isVisible:
            painter.save()
            t = painter.transform()
            painter.setTransform(self.scene().data2scene * t)

            painter.setPen(self.thin_penY)
            painter.drawLine(QPointF(0.0, self.y),
                             QPointF(self._width, self.y))

            painter.setPen(self.thin_penX)
            painter.drawLine(QPointF(self.x, 0), QPointF(self.x, self._height))

            radius = self.diameter / 2 + 1

            painter.setPen(self.thick_penY)
            painter.drawLine(QPointF(0.0, self.y),
                             QPointF(self.x - radius, self.y))
            painter.drawLine(QPointF(self.x + radius, self.y),
                             QPointF(self._width, self.y))

            painter.setPen(self.thick_penX)
            painter.drawLine(QPointF(self.x, 0),
                             QPointF(self.x, self.y - radius))
            painter.drawLine(QPointF(self.x, self.y + radius),
                             QPointF(self.x, self._height))

            painter.restore()
예제 #35
0
    def _setup_plot(self):
        target = self.target_index
        selected = self.selected_classifiers

        curves = [self.plot_curves(target, i) for i in selected]
        selected = [self.curve_data(target, i) for i in selected]

        if self.roc_averaging == OWROCAnalysis.Merge:
            for curve in curves:
                graphics = curve.merge()
                curve = graphics.curve
                self.plot.addItem(graphics.curve_item)

                if self.display_convex_curve:
                    self.plot.addItem(graphics.hull_item)

                if self.display_def_threshold:
                    points = curve.points
                    ind = numpy.argmin(numpy.abs(points.thresholds - 0.5))
                    item = pg.TextItem(text="{:.3f}".format(
                        points.thresholds[ind]), )
                    item.setPos(points.fpr[ind], points.tpr[ind])
                    self.plot.addItem(item)

            hull_curves = [curve.merged.hull for curve in selected]
            if hull_curves:
                self._rocch = convex_hull(hull_curves)
                iso_pen = QPen(QColor(Qt.black), 1)
                iso_pen.setCosmetic(True)
                self._perf_line = InfiniteLine(pen=iso_pen, antialias=True)
                self.plot.addItem(self._perf_line)

        elif self.roc_averaging == OWROCAnalysis.Vertical:
            for curve in curves:
                graphics = curve.avg_vertical()

                self.plot.addItem(graphics.curve_item)
                self.plot.addItem(graphics.confint_item)

            hull_curves = [curve.avg_vertical.hull for curve in selected]

        elif self.roc_averaging == OWROCAnalysis.Threshold:
            for curve in curves:
                graphics = curve.avg_threshold()
                self.plot.addItem(graphics.curve_item)
                self.plot.addItem(graphics.confint_item)

            hull_curves = [curve.avg_threshold.hull for curve in selected]

        elif self.roc_averaging == OWROCAnalysis.NoAveraging:
            for curve in curves:
                graphics = curve.folds()
                for fold in graphics:
                    self.plot.addItem(fold.curve_item)
                    if self.display_convex_curve:
                        self.plot.addItem(fold.hull_item)
            hull_curves = [
                fold.hull for curve in selected for fold in curve.folds
            ]

        if self.display_convex_hull and hull_curves:
            hull = convex_hull(hull_curves)
            hull_pen = QPen(QColor(200, 200, 200, 100), 2)
            hull_pen.setCosmetic(True)
            item = self.plot.plot(hull.fpr,
                                  hull.tpr,
                                  pen=hull_pen,
                                  brush=QBrush(QColor(200, 200, 200, 50)),
                                  fillLevel=0)
            item.setZValue(-10000)

        pen = QPen(QColor(100, 100, 100, 100), 1, Qt.DashLine)
        pen.setCosmetic(True)
        self.plot.plot([0, 1], [0, 1], pen=pen, antialias=True)

        if self.roc_averaging == OWROCAnalysis.Merge:
            self._update_perf_line()
예제 #36
0
 def pen(color):
     pen = QPen(color, 1)
     pen.setCosmetic(True)
     return pen
예제 #37
0
    def _setup_plot(self):
        target = self.target_index
        selected = self.selected_classifiers

        curves = [self.plot_curves(target, i) for i in selected]
        selected = [self.curve_data(target, i) for i in selected]

        if self.roc_averaging == OWROCAnalysis.Merge:
            for curve in curves:
                graphics = curve.merge()
                curve = graphics.curve
                self.plot.addItem(graphics.curve_item)

                if self.display_convex_curve:
                    self.plot.addItem(graphics.hull_item)

                if self.display_def_threshold:
                    points = curve.points
                    ind = numpy.argmin(numpy.abs(points.thresholds - 0.5))
                    item = pg.TextItem(
                        text="{:.3f}".format(points.thresholds[ind]),
                    )
                    item.setPos(points.fpr[ind], points.tpr[ind])
                    self.plot.addItem(item)

            hull_curves = [curve.merged.hull for curve in selected]
            if hull_curves:
                self._rocch = convex_hull(hull_curves)
                iso_pen = QPen(QColor(Qt.black), 1)
                iso_pen.setCosmetic(True)
                self._perf_line = InfiniteLine(pen=iso_pen, antialias=True)
                self.plot.addItem(self._perf_line)

        elif self.roc_averaging == OWROCAnalysis.Vertical:
            for curve in curves:
                graphics = curve.avg_vertical()

                self.plot.addItem(graphics.curve_item)
                self.plot.addItem(graphics.confint_item)

            hull_curves = [curve.avg_vertical.hull for curve in selected]

        elif self.roc_averaging == OWROCAnalysis.Threshold:
            for curve in curves:
                graphics = curve.avg_threshold()
                self.plot.addItem(graphics.curve_item)
                self.plot.addItem(graphics.confint_item)

            hull_curves = [curve.avg_threshold.hull for curve in selected]

        elif self.roc_averaging == OWROCAnalysis.NoAveraging:
            for curve in curves:
                graphics = curve.folds()
                for fold in graphics:
                    self.plot.addItem(fold.curve_item)
                    if self.display_convex_curve:
                        self.plot.addItem(fold.hull_item)
            hull_curves = [fold.hull for curve in selected for fold in curve.folds]

        if self.display_convex_hull and hull_curves:
            hull = convex_hull(hull_curves)
            hull_pen = QPen(QColor(200, 200, 200, 100), 2)
            hull_pen.setCosmetic(True)
            item = self.plot.plot(
                hull.fpr, hull.tpr,
                pen=hull_pen,
                brush=QBrush(QColor(200, 200, 200, 50)),
                fillLevel=0)
            item.setZValue(-10000)

        pen = QPen(QColor(100, 100, 100, 100), 1, Qt.DashLine)
        pen.setCosmetic(True)
        self.plot.plot([0, 1], [0, 1], pen=pen, antialias=True)

        if self.roc_averaging == OWROCAnalysis.Merge:
            self._update_perf_line()
예제 #38
0
class Theme(object):
    # enum PortType
    THEME_PORT_SQUARE = 0
    THEME_PORT_POLYGON = 1

    # enum List
    THEME_MODERN_DARK = 0
    THEME_MODERN_DARK_TINY = 1
    THEME_MODERN_DARK_TEXT = 2
    THEME_MODERN_LIGHT = 3
    THEME_CLASSIC_DARK = 4
    THEME_PROTOCLASSIC_DARK = 5
    THEME_NEOCLASSIC_DARK = 6
    THEME_OOSTUDIO = 7
    THEME_MAX = 8

    # enum BackgroundType
    THEME_BG_SOLID = 0
    THEME_BG_GRADIENT = 1

    def __init__(self, idx):
        object.__init__(self)

        self.idx = idx

        # Default theme settings

        # Canvas
        self.canvas_bg = QColor(0, 0, 0)

        # Boxes
        self.box_pen = QPen(QColor(143 - 70, 143 - 70, 143 - 70), 1,
                            Qt.SolidLine)
        self.box_pen_sel = QPen(QColor(143, 143, 143), 1, Qt.CustomDashLine,
                                Qt.RoundCap)
        self.box_pen_sel.setDashPattern([3, 4])
        self.box_bg_1 = QColor(30, 34, 36)
        self.box_bg_2 = QColor(30, 34, 36)
        self.box_shadow = QColor(89, 89, 89, 180)
        self.box_hover = QColor(255, 255, 255, 60)
        self.box_header_pixmap = None
        self.box_header_height = 19
        self.box_header_spacing = 0
        self.box_rounding = 0.0
        self.box_bottom_space = 3

        self.box_text = QPen(QColor(255, 255, 255), 0)
        self.box_text_sel = self.box_text
        self.box_font_name = "Sans"
        self.box_font_size = 9
        self.box_font_state = QFont.Normal

        self.box_bg_type = self.THEME_BG_GRADIENT
        self.box_use_icon = False

        # Ports
        self.port_text = QPen(QColor(250, 250, 250, 150), 0)
        self.port_hover = QColor(255, 255, 255, 150)
        self.port_bg_pixmap = None
        self.port_font_name = "Sans"
        self.port_font_size = 8
        self.port_font_state = QFont.Normal
        self.port_mode = self.THEME_PORT_SQUARE

        self.port_audio_jack_bg = hsvAdjusted(QColor(41, 61, 99),
                                              saturation=120)
        self.port_audio_jack_bg_sel = QColor(255, 0, 0)
        self.port_midi_jack_bg = hsvAdjusted(QColor(120, 15, 16),
                                             saturation=150)
        self.port_midi_jack_bg_sel = QColor(255, 0, 0)
        self.port_midi_a2j_bg = hsvAdjusted(QColor(101, 47, 17),
                                            saturation=150)
        self.port_midi_a2j_bg_sel = QColor(255, 0, 0)
        self.port_midi_alsa_bg = hsvAdjusted(QColor(63, 112, 19),
                                             saturation=120)
        self.port_midi_alsa_bg_sel = QColor(255, 0, 0)

        port_pen = QPen(QColor(255, 255, 255, 50), 1)
        self.port_audio_jack_pen_sel = self.port_audio_jack_pen = QPen(
            hsvAdjustedRel(self.port_audio_jack_bg.lighter(180),
                           saturation=-60), 1)
        self.port_midi_jack_pen_sel = self.port_midi_jack_pen = QPen(
            hsvAdjustedRel(self.port_midi_jack_bg.lighter(180),
                           saturation=-60), 1)
        self.port_midi_a2j_pen_sel = self.port_midi_a2j_pen = QPen(
            hsvAdjustedRel(self.port_midi_a2j_bg.lighter(180), saturation=-60),
            1)
        self.port_midi_alsa_pen_sel = self.port_midi_alsa_pen = QPen(
            hsvAdjustedRel(self.port_midi_alsa_bg.lighter(180),
                           saturation=-60), 1)

        self.port_audio_jack_text = self.port_audio_jack_pen_sel
        self.port_audio_jack_text_sel = self.port_audio_jack_pen_sel
        self.port_midi_jack_text = self.port_midi_jack_pen_sel
        self.port_midi_jack_text_sel = self.port_midi_jack_pen_sel
        self.port_midi_a2j_text = self.port_midi_a2j_pen_sel
        self.port_midi_a2j_text_sel = self.port_midi_a2j_pen_sel
        self.port_midi_alsa_text = self.port_midi_alsa_pen_sel
        self.port_midi_alsa_text_sel = self.port_midi_alsa_pen_sel

        self.port_text_padding = 0
        self.port_offset = 0
        self.port_spacing = 1
        self.port_spacingT = 0
        self.port_rounding = 0.0
        self.port_inglow_alpha = 0
        self.port_inglow_size = 0
        self.port_side_min_space = 3

        # Lines
        self.line_audio_jack = QColor(53, 78, 116)
        self.line_audio_jack_sel = QColor(255, 0, 0)
        self.line_audio_jack_glow = QColor(255, 0, 0)
        self.line_midi_jack = QColor(139, 32, 32)
        self.line_midi_jack_sel = QColor(255, 0, 0)
        self.line_midi_jack_glow = QColor(255, 0, 0)
        self.line_midi_a2j = QColor(120, 65, 33)
        self.line_midi_a2j_sel = QColor(255, 0, 0)
        self.line_midi_a2j_glow = QColor(255, 0, 0)
        self.line_midi_alsa = QColor(81, 130, 36)
        self.line_midi_alsa_sel = QColor(255, 0, 0)
        self.line_midi_alsa_glow = QColor(255, 0, 0)

        self.rubberband_pen = QPen(QColor(147, 151, 143), 1, Qt.SolidLine)
        self.rubberband_brush = QColor(35, 61, 99, 100)

        if idx == self.THEME_MODERN_DARK:
            # Canvas
            self.canvas_bg = QColor(0, 0, 0)

            # Boxes
            self.box_pen = QPen(QColor(76, 77, 78), 1, Qt.SolidLine)
            self.box_pen_sel = QPen(QColor(206, 207, 208), 1, Qt.DashLine)
            self.box_bg_1 = QColor(32, 34, 35)
            self.box_bg_2 = QColor(43, 47, 48)
            self.box_shadow = QColor(89, 89, 89, 180)
            self.box_hover = QColor(255, 255, 255, 60)
            self.box_header_pixmap = None
            self.box_header_height = 24
            self.box_header_spacing = 0
            self.box_rounding = 3.0
            self.box_bottom_space = 3

            self.box_text = QPen(QColor(240, 240, 240), 0)
            self.box_text_sel = self.box_text
            self.box_font_name = "Deja Vu Sans"
            self.box_font_size = 8
            self.box_font_state = QFont.Bold

            self.box_bg_type = self.THEME_BG_GRADIENT
            self.box_use_icon = True

            # Ports
            self.port_text = QPen(QColor(250, 250, 250, 180), 0)
            self.port_hover = QColor(255, 255, 255, 80)
            self.port_bg_pixmap = None
            self.port_font_name = "Deja Vu Sans"
            self.port_font_size = 8
            self.port_font_state = QFont.Normal
            self.port_mode = self.THEME_PORT_POLYGON

            self.port_audio_jack_pen = QPen(QColor(63, 90, 126), 1)
            self.port_audio_jack_pen_sel = QPen(
                QColor(63 + 30, 90 + 30, 126 + 30), 1)
            self.port_midi_jack_pen = QPen(QColor(159, 44, 42), 1)
            self.port_midi_jack_pen_sel = QPen(
                QColor(159 + 30, 44 + 30, 42 + 30), 1)
            self.port_midi_a2j_pen = QPen(QColor(137, 76, 43), 1)
            self.port_midi_a2j_pen_sel = QPen(
                QColor(137 + 30, 76 + 30, 43 + 30), 1)
            self.port_midi_alsa_pen = QPen(QColor(93, 141, 46), 1)
            self.port_midi_alsa_pen_sel = QPen(
                QColor(93 + 30, 141 + 30, 46 + 30), 1)

            self.port_audio_jack_bg = QColor(35, 61, 99)
            self.port_audio_jack_bg_sel = QColor(35 + 50, 61 + 50, 99 + 50)
            self.port_midi_jack_bg = QColor(120, 15, 16)
            self.port_midi_jack_bg_sel = QColor(120 + 50, 15 + 50, 16 + 50)
            self.port_midi_a2j_bg = QColor(101, 47, 16)
            self.port_midi_a2j_bg_sel = QColor(101 + 50, 47 + 50, 16 + 50)
            self.port_midi_alsa_bg = QColor(64, 112, 18)
            self.port_midi_alsa_bg_sel = QColor(64 + 50, 112 + 50, 18 + 50)

            self.port_audio_jack_text = self.port_text
            self.port_audio_jack_text_sel = self.port_text
            self.port_midi_jack_text = self.port_text
            self.port_midi_jack_text_sel = self.port_text
            self.port_midi_a2j_text = self.port_text
            self.port_midi_a2j_text_sel = self.port_text
            self.port_midi_alsa_text = self.port_text
            self.port_midi_alsa_text_sel = self.port_text

            self.port_text_padding = 1
            self.port_offset = 0
            self.port_spacing = 3
            self.port_spacingT = 2
            self.port_rounding = 0.0

            # To not scale some line widths
            self.box_pen.setCosmetic(True)
            self.box_pen_sel.setCosmetic(True)
            self.port_audio_jack_pen.setCosmetic(True)
            self.port_audio_jack_pen_sel.setCosmetic(True)
            self.port_midi_jack_pen.setCosmetic(True)
            self.port_midi_jack_pen_sel.setCosmetic(True)
            self.port_midi_a2j_pen.setCosmetic(True)
            self.port_midi_a2j_pen_sel.setCosmetic(True)
            self.port_midi_alsa_pen.setCosmetic(True)
            self.port_midi_alsa_pen_sel.setCosmetic(True)

            # Lines
            self.line_audio_jack = QColor(63, 90, 126)
            self.line_audio_jack_sel = QColor(63 + 90, 90 + 90, 126 + 90)
            self.line_audio_jack_glow = QColor(100, 100, 200)
            self.line_midi_jack = QColor(159, 44, 42)
            self.line_midi_jack_sel = QColor(159 + 90, 44 + 90, 42 + 90)
            self.line_midi_jack_glow = QColor(200, 100, 100)
            self.line_midi_a2j = QColor(137, 76, 43)
            self.line_midi_a2j_sel = QColor(137 + 90, 76 + 90, 43 + 90)
            self.line_midi_a2j_glow = QColor(166, 133, 133)
            self.line_midi_alsa = QColor(93, 141, 46)
            self.line_midi_alsa_sel = QColor(93 + 90, 141 + 90, 46 + 90)
            self.line_midi_alsa_glow = QColor(100, 200, 100)

            self.rubberband_pen = QPen(QColor(206, 207, 208), 1, Qt.SolidLine)
            self.rubberband_brush = QColor(76, 77, 78, 100)

        elif idx == self.THEME_MODERN_DARK_TINY:
            # Canvas
            self.canvas_bg = QColor(0, 0, 0)

            # Boxes
            self.box_pen = QPen(QColor(76, 77, 78), 1, Qt.SolidLine)
            self.box_pen_sel = QPen(QColor(206, 207, 208), 1, Qt.DashLine)
            self.box_bg_1 = QColor(32, 34, 35)
            self.box_bg_2 = QColor(43, 47, 48)
            self.box_shadow = QColor(89, 89, 89, 180)
            self.box_hover = QColor(255, 255, 255, 60)
            self.box_header_pixmap = None
            self.box_header_height = 14
            self.box_header_spacing = 0
            self.box_rounding = 2.0
            self.box_bottom_space = 2

            self.box_text = QPen(QColor(240, 240, 240), 0)
            self.box_text_sel = self.box_text
            self.box_font_name = "Deja Vu Sans"
            self.box_font_size = 7
            self.box_font_state = QFont.Bold

            self.box_bg_type = self.THEME_BG_GRADIENT
            self.box_use_icon = False

            # Ports
            self.port_text = QPen(QColor(250, 250, 250, 220), 0)
            self.port_hover = QColor(255, 255, 255, 80)
            self.port_bg_pixmap = None
            self.port_font_name = "Deja Vu Sans"
            self.port_font_size = 6
            self.port_font_state = QFont.Normal
            self.port_mode = self.THEME_PORT_POLYGON

            self.port_audio_jack_pen = QPen(QColor(63, 90, 126), 1)
            self.port_audio_jack_pen_sel = QPen(
                QColor(63 + 30, 90 + 30, 126 + 30), 1)
            self.port_midi_jack_pen = QPen(QColor(159, 44, 42), 1)
            self.port_midi_jack_pen_sel = QPen(
                QColor(159 + 30, 44 + 30, 42 + 30), 1)
            self.port_midi_a2j_pen = QPen(QColor(137, 76, 43), 1)
            self.port_midi_a2j_pen_sel = QPen(
                QColor(137 + 30, 76 + 30, 43 + 30), 1)
            self.port_midi_alsa_pen = QPen(QColor(93, 141, 46), 1)
            self.port_midi_alsa_pen_sel = QPen(
                QColor(93 + 30, 141 + 30, 46 + 30), 1)

            self.port_audio_jack_bg = QColor(35, 61, 99)
            self.port_audio_jack_bg_sel = QColor(35 + 50, 61 + 50, 99 + 50)
            self.port_midi_jack_bg = QColor(120, 15, 16)
            self.port_midi_jack_bg_sel = QColor(120 + 50, 15 + 50, 16 + 50)
            self.port_midi_a2j_bg = QColor(101, 47, 16)
            self.port_midi_a2j_bg_sel = QColor(101 + 50, 47 + 50, 16 + 50)
            self.port_midi_alsa_bg = QColor(64, 112, 18)
            self.port_midi_alsa_bg_sel = QColor(64 + 50, 112 + 50, 18 + 50)

            self.port_audio_jack_text = self.port_text
            self.port_audio_jack_text_sel = self.port_text
            self.port_midi_jack_text = self.port_text
            self.port_midi_jack_text_sel = self.port_text
            self.port_midi_a2j_text = self.port_text
            self.port_midi_a2j_text_sel = self.port_text
            self.port_midi_alsa_text = self.port_text
            self.port_midi_alsa_text_sel = self.port_text

            self.port_text_padding = 1
            self.port_offset = 0
            self.port_spacing = -1
            self.port_spacingT = 2
            self.port_rounding = 0.0

            # To not scale some line widths
            self.box_pen.setCosmetic(True)
            self.box_pen_sel.setCosmetic(True)
            self.port_audio_jack_pen.setCosmetic(True)
            self.port_audio_jack_pen_sel.setCosmetic(True)
            self.port_midi_jack_pen.setCosmetic(True)
            self.port_midi_jack_pen_sel.setCosmetic(True)
            self.port_midi_a2j_pen.setCosmetic(True)
            self.port_midi_a2j_pen_sel.setCosmetic(True)
            self.port_midi_alsa_pen.setCosmetic(True)
            self.port_midi_alsa_pen_sel.setCosmetic(True)

            # Lines
            self.line_audio_jack = QColor(63, 90, 126)
            self.line_audio_jack_sel = QColor(63 + 90, 90 + 90, 126 + 90)
            self.line_audio_jack_glow = QColor(100, 100, 200)
            self.line_midi_jack = QColor(159, 44, 42)
            self.line_midi_jack_sel = QColor(159 + 90, 44 + 90, 42 + 90)
            self.line_midi_jack_glow = QColor(200, 100, 100)
            self.line_midi_a2j = QColor(137, 76, 43)
            self.line_midi_a2j_sel = QColor(137 + 90, 76 + 90, 43 + 90)
            self.line_midi_a2j_glow = QColor(166, 133, 133)
            self.line_midi_alsa = QColor(93, 141, 46)
            self.line_midi_alsa_sel = QColor(93 + 90, 141 + 90, 46 + 90)
            self.line_midi_alsa_glow = QColor(100, 200, 100)

            self.rubberband_pen = QPen(QColor(206, 207, 208), 1, Qt.SolidLine)
            self.rubberband_brush = QColor(76, 77, 78, 100)

        if idx == self.THEME_MODERN_DARK_TEXT:
            # Canvas
            self.canvas_bg = QColor(0, 0, 0)

            # Boxes
            self.box_pen = QPen(QColor(76, 77, 78), 1, Qt.SolidLine)
            self.box_pen_sel = QPen(QColor(206, 207, 208), 1, Qt.DashLine)
            self.box_bg_1 = QColor(15, 15, 15)
            self.box_bg_2 = self.box_bg_1
            self.box_shadow = QColor(89, 89, 89, 180)
            self.box_hover = QColor(255, 255, 255, 60)
            self.box_header_pixmap = None
            self.box_header_height = 14
            self.box_header_spacing = 0
            self.box_rounding = 3.0
            self.box_bottom_space = 3

            self.box_text = QPen(QColor(240, 240, 240), 0)
            self.box_text_sel = self.box_text
            self.box_font_name = "Deja Vu Sans"
            self.box_font_size = 7
            self.box_font_state = QFont.Bold

            self.box_bg_type = self.THEME_BG_SOLID
            self.box_use_icon = False

            # Ports
            self.port_text = QPen(QColor(250, 250, 250, 180), 1)
            self.port_hover = QColor(255, 255, 255, 40)
            self.port_bg_pixmap = None
            self.port_font_name = "Deja Vu Sans"
            self.port_font_size = 6
            self.port_font_state = QFont.Normal
            self.port_mode = self.THEME_PORT_SQUARE

            self.port_audio_jack_pen = Qt.NoPen
            self.port_audio_jack_pen_sel = Qt.NoPen
            self.port_midi_jack_pen = Qt.NoPen
            self.port_midi_jack_pen_sel = Qt.NoPen
            self.port_midi_a2j_pen = Qt.NoPen
            self.port_midi_a2j_pen_sel = Qt.NoPen
            self.port_midi_alsa_pen = Qt.NoPen
            self.port_midi_alsa_pen_sel = Qt.NoPen

            self.port_audio_jack_bg = QColor(0, 0, 0, 0)
            self.port_midi_jack_bg = QColor(0, 0, 0, 0)
            self.port_midi_a2j_bg = QColor(0, 0, 0, 0)
            self.port_midi_alsa_bg = QColor(0, 0, 0, 0)
            self.port_audio_jack_bg_sel = QColor(60, 71, 99)
            self.port_midi_jack_bg_sel = QColor(120, 70, 70)
            self.port_midi_a2j_bg_sel = QColor(120, 80, 60)
            self.port_midi_alsa_bg_sel = QColor(64, 112, 48)

            self.port_audio_jack_text = QPen(
                hsvAdjusted(QColor(63, 90, 126), value=255), 1)
            self.port_midi_jack_text = QPen(
                hsvAdjusted(QColor(159, 44, 42), value=255), 1)
            self.port_midi_a2j_text = QPen(
                hsvAdjusted(QColor(137, 76, 43), value=255), 1)
            self.port_midi_alsa_text = QPen(
                hsvAdjusted(QColor(93, 141, 46), value=255), 1)
            self.port_audio_jack_text_sel = QPen(
                self.port_audio_jack_text.color().lighter(130), 1)
            self.port_midi_jack_text_sel = QPen(
                self.port_midi_jack_text.color().lighter(150), 1)
            self.port_midi_a2j_text_sel = QPen(
                self.port_midi_a2j_text.color().lighter(150), 1)
            self.port_midi_alsa_text_sel = QPen(
                self.port_midi_alsa_text.color().lighter(150), 1)

            self.port_text_padding = 0
            self.port_offset = 0
            self.port_spacing = 0
            self.port_spacingT = 2
            self.port_rounding = 6.0

            # Lines
            self.line_audio_jack = QColor(63, 90, 126)
            self.line_audio_jack_sel = QColor(63 + 90, 90 + 90, 126 + 90)
            self.line_audio_jack_glow = QColor(100, 100, 200)
            self.line_midi_jack = QColor(159, 44, 42)
            self.line_midi_jack_sel = QColor(159 + 90, 44 + 90, 42 + 90)
            self.line_midi_jack_glow = QColor(200, 100, 100)
            self.line_midi_a2j = QColor(137, 76, 43)
            self.line_midi_a2j_sel = QColor(137 + 90, 76 + 90, 43 + 90)
            self.line_midi_a2j_glow = QColor(166, 133, 133)
            self.line_midi_alsa = QColor(93, 141, 46)
            self.line_midi_alsa_sel = QColor(93 + 90, 141 + 90, 46 + 90)
            self.line_midi_alsa_glow = QColor(100, 200, 100)

            self.rubberband_pen = QPen(QColor(206, 207, 208), 1, Qt.SolidLine)
            self.rubberband_brush = QColor(76, 77, 78, 100)

        elif idx == self.THEME_MODERN_LIGHT:
            # Canvas
            self.canvas_bg = QColor(248, 249, 250)

            # Boxes
            self.box_pen = QPen(QColor(0, 0, 0, 60), 1, Qt.SolidLine)
            self.box_pen_sel = QPen(QColor(1, 2, 3), 2, Qt.DashLine)
            self.box_bg_1 = QColor(220, 220, 220)
            self.box_bg_2 = self.box_bg_1.darker(120)
            self.box_shadow = QColor(1, 1, 1, 100)
            self.box_hover = QColor(0, 0, 0, 60)
            self.box_header_pixmap = None
            self.box_header_height = 24
            self.box_header_spacing = 0
            self.box_rounding = 3.0
            self.box_bottom_space = 3

            self.box_text = QPen(QColor(1, 1, 1), 0)
            self.box_text_sel = self.box_text
            self.box_font_name = "Ubuntu"
            self.box_font_size = 10
            self.box_font_state = QFont.Bold

            self.box_bg_type = self.THEME_BG_GRADIENT
            self.box_use_icon = True

            # Ports
            self.port_text = QPen(QColor(255, 255, 255, 220), 1)
            self.port_hover = QColor(0, 0, 0, 255)
            self.port_bg_pixmap = None
            self.port_font_name = "Ubuntu"
            self.port_font_size = 9
            self.port_font_state = QFont.Bold
            self.port_mode = self.THEME_PORT_POLYGON

            # Port colors
            port_audio_jack_color = QColor.fromHsv(240, 214, 181)
            port_midi_jack_color = QColor.fromHsv(0, 214, 130)
            port_midi_a2j_color = QColor.fromHsv(22, 214, 102)
            port_midi_alsa_color = QColor.fromHsv(91, 214, 112)

            port_lineW = 1
            port_pen_shade = 130
            self.port_audio_jack_pen = QPen(
                port_audio_jack_color.darker(port_pen_shade), port_lineW)
            self.port_midi_jack_pen = QPen(
                port_midi_jack_color.darker(port_pen_shade), port_lineW)
            self.port_midi_a2j_pen = QPen(
                port_midi_a2j_color.darker(port_pen_shade), port_lineW)
            self.port_midi_alsa_pen = QPen(
                port_midi_alsa_color.darker(port_pen_shade), port_lineW)
            port_selW = 1.5
            self.port_audio_jack_pen_sel = QPen(
                port_audio_jack_color.lighter(port_pen_shade), port_selW)
            self.port_midi_jack_pen_sel = QPen(
                port_midi_jack_color.lighter(port_pen_shade), port_selW)
            self.port_midi_a2j_pen_sel = QPen(
                port_midi_a2j_color.lighter(port_pen_shade), port_selW)
            self.port_midi_alsa_pen_sel = QPen(
                port_midi_alsa_color.lighter(port_pen_shade), port_selW)

            port_bg_shade = 170
            self.port_audio_jack_bg = port_audio_jack_color
            self.port_midi_jack_bg = port_midi_jack_color
            self.port_midi_a2j_bg = port_midi_a2j_color
            self.port_midi_alsa_bg = port_midi_alsa_color
            self.port_audio_jack_bg_sel = hsvAdjustedRel(
                self.port_audio_jack_bg, saturation=-80).lighter(130)
            self.port_midi_jack_bg_sel = hsvAdjustedRel(
                self.port_midi_jack_bg, saturation=-80).lighter(130)
            self.port_midi_a2j_bg_sel = hsvAdjustedRel(
                self.port_midi_a2j_bg, saturation=-80).lighter(130)
            self.port_midi_alsa_bg_sel = hsvAdjustedRel(
                self.port_midi_alsa_bg, saturation=-80).lighter(130)

            self.port_audio_jack_text = QPen(
                hsvAdjustedRel(port_audio_jack_color,
                               hue=-30,
                               saturation=-70,
                               value=70), 1)
            self.port_midi_jack_text = QPen(
                hsvAdjustedRel(port_midi_jack_color,
                               hue=10,
                               saturation=-70,
                               value=70), 1)
            self.port_midi_a2j_text = QPen(
                hsvAdjustedRel(port_midi_a2j_color,
                               hue=8,
                               saturation=-70,
                               value=70), 1)
            self.port_midi_alsa_text = QPen(
                hsvAdjustedRel(port_midi_alsa_color,
                               hue=-8,
                               saturation=-70,
                               value=70), 1)
            self.port_audio_jack_text_sel = self.port_text
            self.port_midi_jack_text_sel = self.port_text
            self.port_midi_a2j_text_sel = self.port_text
            self.port_midi_alsa_text_sel = self.port_text

            self.port_text_padding = 0.5
            self.port_offset = 0
            self.port_spacing = 2
            self.port_spacingT = 1
            self.port_rounding = 0.0

            # To not scale some line widths
            self.box_pen.setCosmetic(True)
            self.box_pen_sel.setCosmetic(True)
            self.port_audio_jack_pen.setCosmetic(True)
            self.port_audio_jack_pen_sel.setCosmetic(True)
            self.port_midi_jack_pen.setCosmetic(True)
            self.port_midi_jack_pen_sel.setCosmetic(True)
            self.port_midi_a2j_pen.setCosmetic(True)
            self.port_midi_a2j_pen_sel.setCosmetic(True)
            self.port_midi_alsa_pen.setCosmetic(True)
            self.port_midi_alsa_pen_sel.setCosmetic(True)

            # Lines
            self.line_audio_jack = QColor(63, 90, 126)
            self.line_audio_jack_sel = QColor(63 + 63, 90 + 90, 126 + 90)
            self.line_audio_jack_glow = QColor(100, 100, 200)
            self.line_midi_jack = QColor(159, 44, 42)
            self.line_midi_jack_sel = QColor(159 + 44, 44 + 90, 42 + 90)
            self.line_midi_jack_glow = QColor(200, 100, 100)
            self.line_midi_a2j = QColor(137, 43, 43)
            self.line_midi_a2j_sel = QColor(137 + 90, 76 + 90, 43 + 90)
            self.line_midi_a2j_glow = QColor(166, 133, 133)
            self.line_midi_alsa = QColor(93, 141, 46)
            self.line_midi_alsa_sel = QColor(93 + 90, 141 + 90, 46 + 90)
            self.line_midi_alsa_glow = QColor(100, 200, 100)

            self.rubberband_pen = QPen(QColor(76, 77, 78, 130), 1,
                                       Qt.SolidLine)
            self.rubberband_brush = QColor(76, 77, 78, 100)

        elif idx == self.THEME_CLASSIC_DARK:
            # Canvas
            self.canvas_bg = QColor(0, 0, 0)

            # Boxes
            self.box_pen = QPen(QColor(143 - 70, 143 - 70, 143 - 70), 2,
                                Qt.SolidLine)
            self.box_pen_sel = QPen(QColor(143, 143, 143), 2,
                                    Qt.CustomDashLine, Qt.RoundCap)
            self.box_pen_sel.setDashPattern([1.5, 3])
            self.box_bg_1 = QColor(30, 34, 36)
            self.box_bg_2 = QColor(30, 34, 36)
            self.box_shadow = QColor(89, 89, 89, 180)
            self.box_hover = QColor(255, 255, 255, 60)
            self.box_header_pixmap = None
            self.box_header_height = 19
            self.box_header_spacing = 0
            self.box_rounding = 0
            self.box_bottom_space = 3

            self.box_text = QPen(QColor(255, 255, 255), 0)
            self.box_text_sel = self.box_text
            self.box_font_name = "Sans"
            self.box_font_size = 9
            self.box_font_state = QFont.Normal

            self.box_bg_type = self.THEME_BG_GRADIENT
            self.box_use_icon = False

            # Ports
            self.port_text = QPen(QColor(250, 250, 250), 0)
            self.port_hover = QColor(255, 255, 255, 80)
            self.port_bg_pixmap = None
            self.port_font_name = "Sans"
            self.port_font_size = 8
            self.port_font_state = QFont.Normal
            self.port_mode = self.THEME_PORT_SQUARE

            port_pen = Qt.NoPen
            self.port_audio_jack_pen = port_pen
            self.port_midi_jack_pen = port_pen
            self.port_midi_a2j_pen = port_pen
            self.port_midi_alsa_pen = port_pen
            self.port_audio_jack_pen_sel = port_pen
            self.port_midi_jack_pen_sel = port_pen
            self.port_midi_a2j_pen_sel = port_pen
            self.port_midi_alsa_pen_sel = port_pen

            self.port_audio_jack_bg = QColor(35, 61, 99)
            self.port_midi_jack_bg = QColor(120, 15, 16)
            self.port_midi_a2j_bg = QColor(101, 47, 17)
            self.port_midi_alsa_bg = QColor(63, 112, 19)
            self.port_audio_jack_bg_sel = hsvAdjustedRel(
                self.port_audio_jack_bg.lighter(150), saturation=-60)
            self.port_midi_jack_bg_sel = hsvAdjustedRel(
                self.port_midi_jack_bg.lighter(150), saturation=-60)
            self.port_midi_a2j_bg_sel = hsvAdjustedRel(
                self.port_midi_a2j_bg.lighter(150), saturation=-60)
            self.port_midi_alsa_bg_sel = hsvAdjustedRel(
                self.port_midi_alsa_bg.lighter(150), saturation=-60)

            self.port_audio_jack_text = self.port_text
            self.port_audio_jack_text_sel = self.port_text
            self.port_midi_jack_text = self.port_text
            self.port_midi_jack_text_sel = self.port_text
            self.port_midi_a2j_text = self.port_text
            self.port_midi_a2j_text_sel = self.port_text
            self.port_midi_alsa_text = self.port_text
            self.port_midi_alsa_text_sel = self.port_text

            self.port_text_padding = 0
            self.port_offset = 0
            self.port_spacing = 1
            self.port_spacingT = 0
            self.port_rounding = 0

            # Lines
            self.line_audio_jack = QColor(53, 78, 116)
            self.line_audio_jack_sel = self.line_audio_jack.lighter(200)
            self.line_audio_jack_glow = self.line_audio_jack.lighter(180)
            self.line_midi_jack = QColor(139, 32, 32)
            self.line_midi_jack_sel = self.line_midi_jack.lighter(200)
            self.line_midi_jack_glow = self.line_midi_jack.lighter(180)
            self.line_midi_a2j = QColor(120, 65, 33)
            self.line_midi_a2j_sel = self.line_midi_a2j.lighter(200)
            self.line_midi_a2j_glow = self.line_midi_a2j.lighter(180)
            self.line_midi_alsa = QColor(81, 130, 36)
            self.line_midi_alsa_sel = self.line_midi_alsa.lighter(200)
            self.line_midi_alsa_glow = self.line_midi_alsa.lighter(180)

            self.rubberband_pen = QPen(QColor.fromHsv(191, 100, 120, 170), 2,
                                       Qt.SolidLine)
            self.rubberband_brush = QColor.fromHsv(191, 100, 99, 100)

        elif idx == self.THEME_PROTOCLASSIC_DARK:
            # Canvas
            self.canvas_bg = QColor(0, 0, 0)

            # Boxes
            self.box_bg_1 = QColor(30, 41, 58)
            self.box_bg_2 = QColor(30, 41, 58)
            self.box_shadow = QColor(89, 89, 89, 180)
            self.box_hover = hsvAdjusted(self.box_bg_1,
                                         value=255,
                                         saturation=80)
            self.box_pen = QPen(
                hsvAdjusted(self.box_bg_1, value=180, saturation=60), 1,
                Qt.SolidLine)
            self.box_pen_sel = QPen(self.box_pen)
            self.box_pen_sel.setDashPattern([3, 4])
            self.box_header_pixmap = None
            self.box_header_height = 19
            self.box_header_spacing = 0
            self.box_rounding = 0.0
            self.box_bottom_space = 2

            self.box_text = QPen(
                hsvAdjusted(self.box_bg_1, value=255, saturation=60), 1,
                Qt.SolidLine)
            self.box_text_sel = QPen(
                hsvAdjusted(self.box_bg_1, value=255, saturation=30), 1)
            self.box_font_name = "Dejavu Sans"
            self.box_font_size = 8
            self.box_font_state = QFont.Normal

            self.box_bg_type = self.THEME_BG_GRADIENT
            self.box_use_icon = False

            # Ports
            self.port_text = QPen(QColor(255, 255, 255), 1)
            self.port_hover = QColor(255, 255, 255, 150)
            self.port_bg_pixmap = None
            self.port_font_name = "Dejavu Sans"
            self.port_font_size = 6
            self.port_font_state = QFont.Normal
            self.port_mode = self.THEME_PORT_SQUARE

            self.port_audio_jack_bg = QColor(63, 88, 133)
            self.port_midi_jack_bg = hsvAdjusted(QColor(120, 15, 16),
                                                 saturation=150)
            self.port_midi_a2j_bg = hsvAdjusted(QColor(101, 47, 17),
                                                saturation=150)
            self.port_midi_alsa_bg = hsvAdjusted(QColor(44, 141, 92),
                                                 saturation=150,
                                                 value=120)
            self.port_audio_jack_bg_sel = hsvAdjusted(
                self.port_audio_jack_bg.lighter(140), saturation=80)
            self.port_midi_jack_bg_sel = hsvAdjusted(
                self.port_midi_jack_bg.lighter(140), saturation=80)
            self.port_midi_a2j_bg_sel = hsvAdjusted(
                self.port_midi_a2j_bg.lighter(140), saturation=80)
            self.port_midi_alsa_bg_sel = hsvAdjusted(
                self.port_midi_alsa_bg.lighter(140), saturation=80)

            port_pen = QPen(QColor(255, 255, 255, 50), 1)
            self.port_audio_jack_pen_sel = self.port_audio_jack_pen = QPen(
                hsvAdjusted(self.port_audio_jack_bg.lighter(140),
                            saturation=80), 1)
            self.port_midi_jack_pen_sel = self.port_midi_jack_pen = QPen(
                hsvAdjusted(self.port_midi_jack_bg.lighter(140),
                            saturation=80), 1)
            self.port_midi_a2j_pen_sel = self.port_midi_a2j_pen = QPen(
                hsvAdjusted(self.port_midi_a2j_bg.lighter(140), saturation=80),
                1)
            self.port_midi_alsa_pen_sel = self.port_midi_alsa_pen = QPen(
                hsvAdjusted(self.port_midi_alsa_bg.lighter(140),
                            saturation=80), 1)

            self.port_audio_jack_text = QPen(
                hsvAdjusted(self.port_audio_jack_bg, saturation=40, value=255),
                1)
            self.port_midi_jack_text = QPen(
                hsvAdjusted(self.port_midi_jack_bg, saturation=40, value=255),
                1)
            self.port_midi_a2j_text = QPen(
                hsvAdjusted(self.port_midi_a2j_bg, saturation=40, value=255),
                1)
            self.port_midi_alsa_text = QPen(
                hsvAdjusted(self.port_midi_alsa_bg, saturation=40, value=255),
                1)
            self.port_audio_jack_text_sel = self.port_text
            self.port_midi_jack_text_sel = self.port_text
            self.port_midi_a2j_text_sel = self.port_text
            self.port_midi_alsa_text_sel = self.port_text

            self.port_text_padding = 1.5
            self.port_offset = 0
            self.port_spacing = 1
            self.port_spacingT = 0
            self.port_rounding = 0.0
            self.port_inglow_alpha = 0
            self.port_inglow_size = 0

            # Lines
            self.line_audio_jack = self.port_audio_jack_bg
            self.line_audio_jack_sel = self.port_audio_jack_bg_sel
            self.line_audio_jack_glow = self.port_audio_jack_bg_sel
            self.line_midi_jack = self.port_midi_jack_bg
            self.line_midi_jack_sel = self.port_midi_jack_bg_sel
            self.line_midi_jack_glow = self.port_midi_jack_bg_sel
            self.line_midi_a2j = self.port_midi_a2j_bg
            self.line_midi_a2j_sel = self.port_midi_a2j_bg_sel
            self.line_midi_a2j_glow = self.port_midi_a2j_bg_sel
            self.line_midi_alsa = self.port_midi_alsa_bg
            self.line_midi_alsa_sel = self.port_midi_alsa_bg_sel
            self.line_midi_alsa_glow = self.port_midi_alsa_bg_sel

            self.rubberband_pen = QPen(self.box_pen)
            self.rubberband_pen.setDashPattern([3, 4])
            self.rubberband_brush = QColor(0, 0, 0, 0)

        elif idx == self.THEME_NEOCLASSIC_DARK:
            # Canvas
            self.canvas_bg = QColor(0, 0, 0)

            # Boxes
            self.box_pen = QPen(QColor(143 - 70, 143 - 70, 143 - 70), 2,
                                Qt.SolidLine)
            self.box_pen_sel = QPen(QColor(143, 143, 143), 2,
                                    Qt.CustomDashLine, Qt.RoundCap)
            self.box_pen_sel.setDashPattern([1.5, 3])
            self.box_bg_1 = QColor(30, 34, 36)
            self.box_bg_2 = QColor(30, 34, 36)
            self.box_shadow = QColor(89, 89, 89, 180)
            self.box_hover = QColor(255, 255, 255, 60)
            self.box_header_pixmap = None
            self.box_header_height = 19
            self.box_header_spacing = 0
            self.box_rounding = 4.0
            self.box_bottom_space = 6

            self.box_text = QPen(QColor(255, 255, 255), 0)
            self.box_text_sel = self.box_text
            self.box_font_name = "Sans"
            self.box_font_size = 8
            self.box_font_state = QFont.Normal

            self.box_bg_type = self.THEME_BG_GRADIENT
            self.box_use_icon = False

            # Ports
            self.port_text = QPen(QColor(250, 250, 250), 0)
            self.port_hover = QColor(255, 255, 255, 80)
            self.port_bg_pixmap = None
            self.port_font_name = "Sans"
            self.port_font_size = 8
            self.port_font_state = QFont.Normal
            self.port_mode = self.THEME_PORT_SQUARE

            port_dash = [4, 3]
            self.port_audio_jack_pen = QPen(QColor(55, 91, 149), 1)
            self.port_midi_jack_pen = QPen(QColor(150, 25, 26), 1)
            self.port_midi_a2j_pen = QPen(QColor(141, 67, 27), 1)
            self.port_midi_alsa_pen = QPen(QColor(83, 152, 29), 1)
            self.port_audio_jack_pen_sel = QPen(
                hsvAdjustedRel(QColor(55, 91, 149), saturation=-80, value=80),
                1)
            self.port_midi_jack_pen_sel = QPen(
                hsvAdjustedRel(QColor(150, 25, 26), saturation=-80, value=80),
                1)
            self.port_midi_a2j_pen_sel = QPen(
                hsvAdjustedRel(QColor(141, 67, 27), saturation=-80, value=80),
                1)
            self.port_midi_alsa_pen_sel = QPen(
                hsvAdjustedRel(QColor(83, 152, 29), saturation=-80, value=80),
                1)
            self.port_audio_jack_pen_sel.setDashPattern(port_dash)
            self.port_midi_jack_pen_sel.setDashPattern(port_dash)
            self.port_midi_a2j_pen_sel.setDashPattern(port_dash)
            self.port_midi_alsa_pen_sel.setDashPattern(port_dash)

            self.port_audio_jack_bg = QColor(35, 61, 99)
            self.port_midi_jack_bg = QColor(120, 15, 16)
            self.port_midi_a2j_bg = QColor(101, 47, 17)
            self.port_midi_alsa_bg = QColor(63, 112, 19)
            self.port_audio_jack_bg_sel = self.port_audio_jack_bg.darker(130)
            self.port_midi_jack_bg_sel = self.port_midi_jack_bg.darker(130)
            self.port_midi_a2j_bg_sel = self.port_midi_a2j_bg.darker(130)
            self.port_midi_alsa_bg_sel = self.port_midi_alsa_bg.darker(130)

            self.port_audio_jack_text = self.port_text
            self.port_audio_jack_text_sel = self.port_text
            self.port_midi_jack_text = self.port_text
            self.port_midi_jack_text_sel = self.port_text
            self.port_midi_a2j_text = self.port_text
            self.port_midi_a2j_text_sel = self.port_text
            self.port_midi_alsa_text = self.port_text
            self.port_midi_alsa_text_sel = self.port_text

            self.port_text_padding = 1
            self.port_offset = 0
            self.port_spacing = 1
            self.port_spacingT = 0
            self.port_rounding = 4.0

            # Lines
            self.line_audio_jack = QColor(53, 78, 116)
            self.line_audio_jack_sel = self.line_audio_jack.lighter(200)
            self.line_audio_jack_glow = self.line_audio_jack.lighter(180)
            self.line_midi_jack = QColor(139, 32, 32)
            self.line_midi_jack_sel = self.line_midi_jack.lighter(200)
            self.line_midi_jack_glow = self.line_midi_jack.lighter(180)
            self.line_midi_a2j = QColor(120, 65, 33)
            self.line_midi_a2j_sel = self.line_midi_a2j.lighter(200)
            self.line_midi_a2j_glow = self.line_midi_a2j.lighter(180)
            self.line_midi_alsa = QColor(81, 130, 36)
            self.line_midi_alsa_sel = self.line_midi_alsa.lighter(200)
            self.line_midi_alsa_glow = self.line_midi_alsa.lighter(180)

            self.rubberband_pen = QPen(QColor.fromHsv(191, 100, 120, 170), 2,
                                       Qt.SolidLine)
            self.rubberband_brush = QColor.fromHsv(191, 100, 99, 100)

        elif idx == self.THEME_OOSTUDIO:
            # Canvas
            self.canvas_bg = QColor(11, 11, 11)

            # Boxes
            self.box_pen = QPen(QColor(76, 77, 78), 1, Qt.SolidLine)
            self.box_pen_sel = QPen(QColor(189, 122, 214), 1, Qt.DashLine)
            self.box_bg_1 = QColor(46, 46, 46)
            self.box_bg_2 = QColor(23, 23, 23)
            self.box_shadow = QColor(89, 89, 89, 180)
            self.box_hover = QColor(255, 255, 255, 60)
            self.box_header_pixmap = QPixmap(
                ":/bitmaps/canvas/frame_node_header.png")
            self.box_header_height = 22
            self.box_header_spacing = 6
            self.box_rounding = 3.0
            self.box_bottom_space = 4

            self.box_text = QPen(QColor(144, 144, 144), 0)
            self.box_text_sel = QPen(QColor(189, 122, 214), 0)
            self.box_font_name = "Deja Vu Sans"
            self.box_font_size = 8
            self.box_font_state = QFont.Bold

            self.box_bg_type = self.THEME_BG_SOLID
            self.box_use_icon = False

            # Ports
            normalPortBG = QColor(46, 46, 46)
            selPortBG = QColor(23, 23, 23)

            self.port_text = QPen(QColor(155, 155, 155), 0)
            self.port_hover = QColor(255, 255, 255, 80)
            self.port_bg_pixmap = QPixmap(":/bitmaps/canvas/frame_port_bg.png")
            self.port_font_name = "Deja Vu Sans"
            self.port_font_size = 8
            self.port_font_state = QFont.Normal
            self.port_mode = self.THEME_PORT_SQUARE

            self.port_audio_jack_pen = QPen(selPortBG, 2)
            self.port_audio_jack_pen_sel = QPen(QColor(1, 230, 238), 1)
            self.port_midi_jack_pen = QPen(selPortBG, 2)
            self.port_midi_jack_pen_sel = QPen(QColor(252, 118, 118), 1)
            self.port_midi_a2j_pen = QPen(selPortBG, 2)
            self.port_midi_a2j_pen_sel = QPen(QColor(137, 76, 43), 1)
            self.port_midi_alsa_pen = QPen(selPortBG, 2)
            self.port_midi_alsa_pen_sel = QPen(QColor(129, 244, 118), 0)

            self.port_audio_jack_bg = normalPortBG
            self.port_audio_jack_bg_sel = selPortBG
            self.port_midi_jack_bg = normalPortBG
            self.port_midi_jack_bg_sel = selPortBG
            self.port_midi_a2j_bg = normalPortBG
            self.port_midi_a2j_bg_sel = selPortBG
            self.port_midi_alsa_bg = normalPortBG
            self.port_midi_alsa_bg_sel = selPortBG

            self.port_audio_jack_text = self.port_text
            self.port_audio_jack_text_sel = self.port_audio_jack_pen_sel
            self.port_midi_jack_text = self.port_text
            self.port_midi_jack_text_sel = self.port_midi_jack_pen_sel
            self.port_midi_a2j_text = self.port_text
            self.port_midi_a2j_text_sel = self.port_midi_a2j_pen_sel
            self.port_midi_alsa_text = self.port_text
            self.port_midi_alsa_text_sel = self.port_midi_alsa_pen_sel

            # missing, ports 2
            self.port_text_padding = 3
            self.port_offset = -1
            self.port_spacing = 3
            self.port_spacingT = 0
            self.port_rounding = 3.0

            # Lines
            self.line_audio_jack = QColor(64, 64, 64)
            self.line_audio_jack_sel = QColor(1, 230, 238)
            self.line_audio_jack_glow = QColor(100, 200, 100)
            self.line_midi_jack = QColor(64, 64, 64)
            self.line_midi_jack_sel = QColor(252, 118, 118)
            self.line_midi_jack_glow = QColor(200, 100, 100)
            self.line_midi_a2j = QColor(64, 64, 64)
            self.line_midi_a2j_sel = QColor(137 + 90, 76 + 90, 43 + 90)
            self.line_midi_a2j_glow = QColor(166, 133, 133)
            self.line_midi_alsa = QColor(64, 64, 64)
            self.line_midi_alsa_sel = QColor(129, 244, 118)
            self.line_midi_alsa_glow = QColor(100, 200, 100)

            self.rubberband_pen = QPen(QColor(1, 230, 238), 2, Qt.SolidLine)
            self.rubberband_brush = QColor(90, 90, 90, 100)

        # Font-dependant port height
        port_font = QFont(self.port_font_name, self.port_font_size,
                          self.port_font_state)
        self.port_height = QFontMetrics(
            port_font).height() + 2 * self.port_text_padding
    def _setup_plot(self):
        """Setup the plot with new curve data."""
        assert self.data is not None
        self.graph.clear()

        data, domain = self.data, self.data.domain
        var = domain[self.group_var]
        class_col_data, _ = data.get_column_view(var)
        group_indices = [
            np.flatnonzero(class_col_data == i)
            for i in range(len(self.classes))
        ]

        self.graph.getAxis('bottom').setTicks([[
            (i + 1, str(a)) for i, a in enumerate(self.graph_variables)
        ]])

        X = np.arange(1, len(self.graph_variables) + 1)
        groups = []

        for i, indices in enumerate(group_indices):
            if len(indices) == 0:
                groups.append(None)
            else:
                if self.classes:
                    color = self.class_colors[i]
                else:
                    color = QColor(Qt.darkGray)
                group_data = data[indices, self.graph_variables]
                plot_x, plot_y, connect = disconnected_curve_data(group_data.X,
                                                                  x=X)

                color.setAlpha(200)
                lightcolor = QColor(color.lighter(factor=150))
                lightcolor.setAlpha(150)
                pen = QPen(color, 2)
                pen.setCosmetic(True)

                lightpen = QPen(lightcolor, 1)
                lightpen.setCosmetic(True)

                curve = pg.PlotCurveItem(
                    x=plot_x,
                    y=plot_y,
                    connect=connect,
                    pen=lightpen,
                    symbolSize=2,
                    antialias=True,
                )
                self.graph.addItem(curve)

                mean = np.nanmean(group_data.X, axis=0)

                meancurve = pg.PlotDataItem(x=X,
                                            y=mean,
                                            pen=pen,
                                            size=5,
                                            symbol="o",
                                            pxMode=True,
                                            symbolSize=5,
                                            antialias=True)
                self.graph.addItem(meancurve)

                q1, q2, q3 = np.nanpercentile(group_data.X, [25, 50, 75],
                                              axis=0)
                # TODO: implement and use a box plot item
                errorbar = pg.ErrorBarItem(x=X,
                                           y=mean,
                                           bottom=np.clip(
                                               mean - q1, 0, mean - q1),
                                           top=np.clip(q3 - mean, 0,
                                                       q3 - mean),
                                           beam=0.5)
                self.graph.addItem(errorbar)
                groups.append(
                    namespace(data=group_data,
                              indices=indices,
                              profiles=curve,
                              mean=meancurve,
                              boxplot=errorbar))

        self.__groups = groups
        self.__update_visibility()