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
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()
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)
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)
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)
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
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
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)
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)
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))
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]
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) )
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()
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()
def make_pen(color, width): p = QPen(color, width) p.setCosmetic(True) return p
def pen(color): pen = QPen(color, 1) pen.setCosmetic(True) return pen
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()
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()
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):
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)
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()
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()
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 """ 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()
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()
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()
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()