def kresliPolozku(self, painter, size, angle, nazov, color): col1 = QColor(color) col2 = QColor(color) col3 = QColor(color) col1 = col1.lighter(105) col2 = col1.darker(140) col3 = col3.darker() gradient = QRadialGradient(QPointF(size.width() / 2, size.height() / 2), size.width() / 2 - 20) gradient.setColorAt(0.0, col1) gradient.setColorAt(0.6, col2) gradient.setColorAt(1.0, col3) painter.setPen(Qt.NoPen) painter.setBrush(gradient) painter.drawPie(QRect(20, 20, size.width() - 40, size.height() - 40), self.__startAngle, angle) self.__startAngle = self.__startAngle + angle
def __updatePen(self): self.prepareGeometryChange() self.__boundingRect = None if self.__dynamic: if self.__dynamicEnabled: color = QColor(0, 150, 0, 150) else: color = QColor(150, 0, 0, 150) normal = QPen(QBrush(color), 2.0) hover = QPen(QBrush(color.darker(120)), 2.1) else: normal = QPen(QBrush(QColor("#9CACB4")), 2.0) hover = QPen(QBrush(QColor("#7D7D7D")), 2.1) if self.__state & LinkItem.Active: pen_style = Qt.SolidLine else: pen_style = Qt.DashLine normal.setStyle(pen_style) hover.setStyle(pen_style) if self.hover: pen = hover else: pen = normal self.curveItem.setPen(pen)
def drawData(self, painter, size, angle, dataname, color): """ Draw data @param painter: @type painter: @param size: @type size: @param angle: @type angle: @param dataname: @type dataname: @param color: @type color: """ col1 = QColor(color) col2 = QColor(color) col3 = QColor(color) col1 = col1.lighter(105) col2 = col1.darker(140) col3 = col3.darker() gradient = QRadialGradient( QPointF(size.width() / 2, size.height() / 2), size.width() / 2 - 20) gradient.setColorAt(0.0, col1) gradient.setColorAt(0.6, col2) gradient.setColorAt(1.0, col3) painter.setPen(Qt.NoPen) painter.setBrush(gradient) painter.drawPie(QRect(20, 20, size.width() - 40, size.height() - 40), self.__startAngle, angle) self.__startAngle = self.__startAngle + angle
def __updatePen(self): self.prepareGeometryChange() if self.__dynamic: if self.__dynamicEnabled: color = QColor(0, 150, 0, 150) else: color = QColor(150, 0, 0, 150) normal = QPen(QBrush(color), 2.0) hover = QPen(QBrush(color.darker(120)), 2.1) else: normal = QPen(QBrush(QColor("#9CACB4")), 2.0) hover = QPen(QBrush(QColor("#7D7D7D")), 2.1) self.curveItem.setCurvePenSet(normal, hover)
def updateColor(self, item): pixmap = QPixmap(16, 16) color = QColor() if item: color = item.backgroundColor() if not color.isValid(): color = self.palette().base().color() painter = QPainter(pixmap) painter.fillRect(0, 0, 16, 16, color) lighter = color.lighter() painter.setPen(lighter) # light frame painter.drawPolyline(QPoint(0, 15), QPoint(0, 0), QPoint(15, 0)) painter.setPen(color.darker()) # dark frame painter.drawPolyline(QPoint(1, 15), QPoint(15, 15), QPoint(15, 1)) painter.end() self.colorAction.setIcon(QIcon(pixmap))
def paintEvent(self, event): """Adapted from http://doc.qt.io/qt-5/qtwidgets-widgets-analogclock-example.html""" HOURHAND = QPolygon([QPoint(7, 8), QPoint(-7, 8), QPoint(0, -55)]) MINUTEHAND = QPolygon([QPoint(7, 8), QPoint(-7, 8), QPoint(0, -87)]) HOURCOLOR = QColor(Qt.black) MINUTECOLOR = QColor(0x11, 0x11, 0x11, 0xAA) painter = QPainter(self) painter.setRenderHint(QPainter.Antialiasing) painter.translate(self.width() / 2, self.height() / 2) SIDE = 200 side = min(self.width(), self.height()) painter.scale(side / SIDE, side / SIDE) # Background (night/day) if self._time_to is not None: time = self._time_to.time() hour_offset = time.hour() + time.minute() / 60 DAY, NIGHT = QColor(Qt.white), QColor('#5555ff') if 7 <= hour_offset <= 19: background = DAY elif 6 <= hour_offset <= 7: palette = GradientPaletteGenerator(NIGHT, DAY) background = palette[(hour_offset - 6) / (7 - 6)] elif 19 <= hour_offset <= 20: palette = GradientPaletteGenerator(DAY, NIGHT) background = palette[(hour_offset - 19) / (20 - 19)] else: assert hour_offset < 7 or hour_offset > 20 background = NIGHT painter.setBrush(QBrush(background)) painter.setPen(HOURCOLOR) painter.drawEllipse(-SIDE / 2, -SIDE / 2, SIDE, SIDE) # Minute tickmarks painter.save() painter.setPen(MINUTECOLOR) for j in range(60): painter.drawLine(94, 0, 97, 0) painter.rotate(6) painter.restore() # Hour tickmarks painter.save() painter.setPen(HOURCOLOR) for _ in range(12): painter.drawLine(88, 0, 98, 0) painter.rotate(30) painter.restore() # Hour span if self._time_from is not None: time_from = self._time_from.time() time_to = self._time_to.time() if time_from.secsTo( time_to) / 3600 > .2: # Don't draw really small intervals hour_from = (time_from.hour() + time_from.minute() / 60) % 12 - 3 hour_to = (time_to.hour() + time_to.minute() / 60) % 12 - 3 startAngle = -hour_to * 30 * 16 spanAngle = -hour_from * 30 * 16 - startAngle color = QColor(0xFF, 0xFF, 0, 0xAA) painter.save() painter.setBrush(QBrush(color, Qt.DiagCrossPattern)) painter.setPen(color.darker(180)) painter.drawPie(-SIDE / 2, -SIDE / 2, SIDE, SIDE, startAngle, spanAngle) painter.restore() # Hour and minute hand if self._time_to is not None: time = self._time_to.time() painter.setPen(Qt.NoPen) painter.save() painter.setBrush(HOURCOLOR) painter.rotate(30 * (time.hour() + time.minute() / 60)) painter.drawConvexPolygon(HOURHAND) painter.restore() painter.save() painter.setBrush(MINUTECOLOR) painter.rotate(6 * (time.minute() + time.second() / 60)) painter.drawConvexPolygon(MINUTEHAND) painter.restore()
def paintEvent(self, event): """Adapted from http://doc.qt.io/qt-5/qtwidgets-widgets-analogclock-example.html""" HOURHAND = QPolygon([QPoint(7, 8), QPoint(-7, 8), QPoint(0, -55)]) MINUTEHAND = QPolygon([QPoint(7, 8), QPoint(-7, 8), QPoint(0, -87)]) HOURCOLOR = QColor(Qt.black) MINUTECOLOR = QColor(0x11, 0x11, 0x11, 0xAA) painter = QPainter(self) painter.setRenderHint(QPainter.Antialiasing) painter.translate(self.width() / 2, self.height() / 2) SIDE = 200 side = min(self.width(), self.height()) painter.scale(side / SIDE, side / SIDE) # Background (night/day) if self._time_to is not None: time = self._time_to.time() hour_offset = time.hour() + time.minute() / 60 DAY, NIGHT = QColor(Qt.white), QColor('#5555ff') if 7 <= hour_offset <= 19: background = DAY elif 6 <= hour_offset <= 7: palette = GradientPaletteGenerator(NIGHT, DAY) background = palette[(hour_offset - 6) / (7 - 6)] elif 19 <= hour_offset <= 20: palette = GradientPaletteGenerator(DAY, NIGHT) background = palette[(hour_offset - 19) / (20 - 19)] else: assert hour_offset < 7 or hour_offset > 20 background = NIGHT painter.setBrush(QBrush(background)) painter.setPen(HOURCOLOR) painter.drawEllipse(-SIDE / 2, -SIDE / 2, SIDE, SIDE) # Minute tickmarks painter.save() painter.setPen(MINUTECOLOR) for j in range(60): painter.drawLine(94, 0, 97, 0) painter.rotate(6) painter.restore() # Hour tickmarks painter.save() painter.setPen(HOURCOLOR) for _ in range(12): painter.drawLine(88, 0, 98, 0) painter.rotate(30) painter.restore() # Hour span if self._time_from is not None: time_from = self._time_from.time() time_to = self._time_to.time() if time_from.secsTo(time_to) / 3600 > .2: # Don't draw really small intervals hour_from = (time_from.hour() + time_from.minute() / 60) % 12 - 3 hour_to = (time_to.hour() + time_to.minute() / 60) % 12 - 3 startAngle = -hour_to * 30 * 16 spanAngle = -hour_from * 30 * 16 - startAngle color = QColor(0xFF, 0xFF, 0, 0xAA) painter.save() painter.setBrush(QBrush(color, Qt.DiagCrossPattern)) painter.setPen(color.darker(180)) painter.drawPie(-SIDE / 2, -SIDE / 2, SIDE, SIDE, startAngle, spanAngle) painter.restore() # Hour and minute hand if self._time_to is not None: time = self._time_to.time() painter.setPen(Qt.NoPen) painter.save() painter.setBrush(HOURCOLOR) painter.rotate(30 * (time.hour() + time.minute() / 60)) painter.drawConvexPolygon(HOURHAND) painter.restore() painter.save() painter.setBrush(MINUTECOLOR) painter.rotate(6 * (time.minute() + time.second() / 60)) painter.drawConvexPolygon(MINUTEHAND) painter.restore()
class DialNotch(QGraphicsItem): """ DialNotch """ def __init__(self): super(DialNotch, self).__init__() self.setAcceptHoverEvents(True) # Colors self.color = QColor(125, 125, 125, 255) self.normalBorderColor = QColor( 255, 255, 255, 30 ) self.selectedBorderColor = QColor( 255, 191, 0, 102 ) self.textColor = QColor( 30, 30, 30, 255 ) self.shadowColor = QColor(0, 0, 0, 75) self.selectedShadowColor = QColor( 100, 100, 100, 255 ) # Settings self.width, self.height = 12, 12 self.highlighted = False # Painter Definitions self.pen = QPen() self.pen.setWidth(1) self.pen.setColor(self.normalBorderColor) gradient = QRadialGradient(self.boundingRect().center() + QPointF(0, 1), self.width / 2.0) gradient.setColorAt(0, self.color) gradient.setColorAt(0.5, self.color) gradient.setColorAt(1, self.color.darker(120)) self.brush = QBrush(gradient) gradient = QRadialGradient(self.boundingRect().center() + QPointF(0, 1), self.width / 2.0) gradient.setColorAt(0, self.color.lighter(110)) gradient.setColorAt(0.5, self.color.lighter(110)) gradient.setColorAt(1, self.color.darker(120).lighter(110)) self.highlightBrush = QBrush(gradient) # Other self.tracking = False self.angle = None def boundingRect(self): """ Overrides QGraphicsItem's boundingRect() virtual public function and returns a valid bounding rect based on calculated width and height. """ return QRectF(0, 0, self.width, self.height) def paint(self, painter, option, widget): """ Overrides QGraphicsItem's paint() virtual public function. """ painter.setPen(self.pen) painter.setBrush(self.brush) if self.highlighted: painter.setBrush(self.highlightBrush) painter.drawEllipse(self.boundingRect()) def highlight(self, value): self.highlighted = value self.update() def hoverEnterEvent(self, event): self.highlight(True) def hoverLeaveEvent(self, event): self.highlight(False) def mousePressEvent(self, event): self.tracking = True parent = self.parentItem() parent.dragPoint = event.pos() parent.dragAngle = parent.angle def mouseMoveEvent(self, event): if self.tracking: parent = self.parentItem() d = event.scenePos() - parent.boundingRect().center() if self.angle: a = self.angle - math.degrees(math.atan2(-d.y(),d.x())) else: a = math.degrees(math.atan2(-d.y(),d.x())) self.angle = a parent.angle = parent.dragAngle - a parent.updateNotch() def mouseReleaseEvent(self, event): self.tracking = False parent = self.parentItem() parent.dragPoint = None parent.dragAngle = 0 self.angle = None
class CustomButton(QPushButton): def __init__(self,parent = None): super(CustomButton,self).__init__(parent) self.hovered = False self.pressed = False self.pressedIcon = QIcon() self.color = QColor(Qt.gray) self.opacity = 1.0 # self.setAutoFillBackground(True) # self.setStyleSheet("#Check {background-color: rgb(255, 255, 255);}"); def setEnterCursorType(self, Type): self.cursorType = Type def setColor(self,color): self.color = color def setOpacitys(self,opacity): self.opacity = opacity # self.setOpacity(0.5) def enterEvent(self,event): self.hovered = True self.repaint() QPushButton.enterEvent(self,event) def leaveEvent(self,event): self.hovered = False self.repaint() self.setCursor(QCursor(Qt.ArrowCursor)) QPushButton.leaveEvent(self,event) def mousePressEvent(self, event): self.pressed = True self.repaint() QPushButton.mousePressEvent(self,event) def mouseReleaseEvent(self, event): self.pressed = False self.repaint() QPushButton.mouseReleaseEvent(self,event) def paintEvent(self,event): painter = QPainter(self) btnRect = self.geometry() iconRect = self.iconSize() color = QColor(Qt.black) if self.hovered: color = self.color if self.pressed: color = self.color.darker(120) painter.setPen(QPen(QColor(Qt.lightGray),2)) outline = QPainterPath() outline.addRoundedRect(0, 0, btnRect.width(), btnRect.height(), 0, 0) painter.setOpacity(1) painter.drawPath(outline) painter.setBrush(QBrush(color)) painter.setOpacity(self.opacity) painter_path = QPainterPath() painter_path.addRoundedRect(1, 1, btnRect.width() - 2, btnRect.height() - 2, 0, 0) if self.hovered: painter.setClipPath(painter_path) painter.drawRoundedRect(1, 1, btnRect.width() - 2, btnRect.height() - 2, 0, 0) painter.setOpacity(1) iconPos,textPos = self.calIconTextPos(btnRect, iconRect) # 重画文本 if not self.text().isNull(): painter.setFont(self.font()) painter.setPen(QPen(QColor(Qt.black),2)) painter.drawText(textPos.x(), textPos.y(), textPos.width(), textPos.height(), Qt.AlignCenter, self.text()) # 重画图标 if not self.icon().isNull(): painter.drawPixmap(iconPos, QPixmap(self.icon().pixmap(self.iconSize()))) # 计算图标和文本大小位置 def calIconTextPos(self,btnSize,iconSize): if self.text().isNull(): iconWidth = iconSize.width()*3/5 iconHeight = iconSize.height()*3/5 else: iconWidth = iconSize.width() iconHeight = iconSize.height() - 50 iconX = (btnSize.width()-iconWidth)/2 iconY = (btnSize.height()-iconHeight)/2 iconPos = QRect() iconPos.setX(iconX) iconPos.setY(iconY) iconPos.setWidth(iconWidth) iconPos.setHeight(iconHeight) textPos = QRect() if not self.text().isNull(): textPos.setX(iconX) textPos.setY(btnSize.height()- 50) textPos.setWidth(iconWidth) textPos.setHeight(50) return (iconPos,textPos)
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
class MenuButton(QPushButton): def __init__(self,parent = None): super(MenuButton,self).__init__(parent) self.setStyleSheet("QMenu{background:purple;}" "QMenu{border:1px solid lightgray;}" "QMenu{border-color:green;}" "QMenu::item{padding:0px 40px 0px 20px;}" "QMenu::item{height:30px;}" "QMenu::item{color:blue;}" "QMenu::item{background:white;}" "QMenu::item{margin:1px 0px 0px 0px;}" "QMenu::item:selected:enabled{background:lightgray;}" "QMenu::item:selected:enabled{color:white;}" "QMenu::item:selected:!enabled{background:transparent;}" "QMenu::separator{height:50px;}" "QMenu::separator{width:1px;}" "QMenu::separator{background:white;}" "QMenu::separator{margin:1px 1px 1px 1px;}" "QMenu#menu{background:white;}" "QMenu#menu{border:1px solid lightgray;}" "QMenu#menu::item{padding:0px 40px 0px 30px;}" "QMenu#menu::item{height:25px;}" "QMenu#menu::item:selected:enabled{background:lightgray;}" "QMenu#menu::item:selected:enabled{color:white;}" "QMenu#menu::item:selected:!enabled{background:transparent;}" "QMenu#menu::separator{height:1px;}" "QMenu#menu::separator{background:lightgray;}" "QMenu#menu::separator{margin:2px 0px 2px 0px;}" "QMenu#menu::indicator {padding:10px;}" ) self.hovered = False self.pressed = False self.pressedIcon = QIcon() self.color = QColor(Qt.gray) self.opacity = 1.0 self.count = 0 self.vmInfo = {} # self.setAutoFillBackground(True) # self.setStyleSheet("#Check {background-color: rgb(255, 255, 255);}"); #self.createContextMenu() def setVMInfo(self, vmInfo): self.vmInfo = vmInfo def getVMInfo(self): return self.vmInfo def setStatus(self,status): self.status = status def getStatus(self): return self.status def createContextMenu(self): ''''' 创建右键菜单 ''' # 必须将ContextMenuPolicy设置为Qt.CustomContextMenu # 否则无法使用customContextMenuRequested信号 self.setContextMenuPolicy(Qt.CustomContextMenu) self.customContextMenuRequested.connect(self.showContextMenu) # 创建QMenu self.contextMenu = QMenu(self) self.actionA = self.contextMenu.addAction(QIcon("images/0.png"),u'| 动作A') self.actionB = self.contextMenu.addAction(QIcon("images/0.png"),u'| 动作B') self.actionC = self.contextMenu.addAction(QIcon("images/0.png"),u'| 动作C') #添加二级菜单 self.second = self.contextMenu.addMenu(QIcon("images/0.png"),u"| 二级菜单") self.actionD = self.second.addAction(QIcon("images/0.png"),u'| 动作A') self.actionE = self.second.addAction(QIcon("images/0.png"),u'| 动作B') self.actionF = self.second.addAction(QIcon("images/0.png"),u'| 动作C') # 将动作与处理函数相关联 # 这里为了简单,将所有action与同一个处理函数相关联, # 当然也可以将他们分别与不同函数关联,实现不同的功能 self.actionA.triggered.connect(self.actionHandler) self.actionB.triggered.connect(self.actionHandler) self.actionC.triggered.connect(self.actionHandler) self.actionD.triggered.connect(self.actionHandler) self.actionE.triggered.connect(self.actionHandler) self.actionF.triggered.connect(self.actionHandler) def showContextMenu(self, pos): ''''' 右键点击时调用的函数 ''' self.count+=1 # 菜单显示前,将它移动到鼠标点击的位置 self.contextMenu.exec_(QCursor.pos()) #在鼠标位置显示 #self.contextMenu.show() print self.count def actionHandler(self): ''''' 菜单中的具体action调用的函数 ''' if self.count%3==1: self.setText(u"first") elif self.count%3==2: self.setText(u"second") elif self.count%3==0: self.setText(u"third") def setEnterCursorType(self, Type): self.cursorType = Type def setColor(self,color): self.color = color def setOpacitys(self,opacity): self.opacity = opacity # self.setOpacity(0.5) def enterEvent(self,event): self.hovered = True self.repaint() QPushButton.enterEvent(self,event) def leaveEvent(self,event): self.hovered = False self.repaint() self.setCursor(QCursor(Qt.ArrowCursor)) QPushButton.leaveEvent(self,event) def mousePressEvent(self, event): self.pressed = True self.repaint() QPushButton.mousePressEvent(self,event) def mouseReleaseEvent(self, event): self.pressed = False self.repaint() QPushButton.mouseReleaseEvent(self,event) def paintEvent(self,event): return painter = QPainter(self) btnRect = self.geometry() iconRect = self.iconSize() color = QColor(Qt.black) if self.hovered: color = self.color if self.pressed: color = self.color.darker(120) painter.setPen(QPen(QColor(Qt.lightGray),2)) outline = QPainterPath() outline.addRoundedRect(0, 0, btnRect.width(), btnRect.height(), 0, 0) painter.setOpacity(1) painter.drawPath(outline) painter.setBrush(QBrush(color)) painter.setOpacity(self.opacity) painter_path = QPainterPath() painter_path.addRoundedRect(1, 1, btnRect.width() - 2, btnRect.height() - 2, 0, 0) if self.hovered: painter.setClipPath(painter_path) painter.drawRoundedRect(1, 1, btnRect.width() - 2, btnRect.height() - 2, 0, 0) painter.setOpacity(1) iconPos,textPos = self.calIconTextPos(btnRect, iconRect) # 重画文本 if not self.text().isNull(): painter.setFont(self.font()) painter.setPen(QPen(QColor(Qt.black),2)) painter.drawText(textPos.x(), textPos.y(), textPos.width(), textPos.height(), Qt.AlignCenter, self.text()) # 重画图标 if not self.icon().isNull(): painter.drawPixmap(iconPos, QPixmap(self.icon().pixmap(self.iconSize()))) # 计算图标和文本大小位置 def calIconTextPos(self,btnSize,iconSize): if self.text().isNull(): iconWidth = iconSize.width()*3/5 iconHeight = iconSize.height()*3/5 else: iconWidth = iconSize.width() iconHeight = iconSize.height() - 50 iconX = (btnSize.width()-iconWidth)/2 iconY = (btnSize.height()-iconHeight)/2 iconPos = QRect() iconPos.setX(iconX) iconPos.setY(iconY) iconPos.setWidth(iconWidth) iconPos.setHeight(iconHeight) textPos = QRect() if not self.text().isNull(): textPos.setX(iconX) textPos.setY(btnSize.height()- 50) textPos.setWidth(iconWidth) textPos.setHeight(50) return (iconPos,textPos)
class XGanttViewItem(QGraphicsRectItem): def __init__(self, treeItem): super(XGanttViewItem, self).__init__() # define custom properties self._color = QColor(255, 255, 255, 200) self._alternateColor = QColor(230, 230, 230, 200) self._highlightColor = QColor(255, 255, 0, 200) self._alternateHighlightColor = self._highlightColor.darker(110) self._textColor = QColor('black') self._borderColor = QColor(50, 50, 50) self._progressColor = QColor(200, 200, 250) self._alternateProgressColor = QColor(180, 180, 230) self._showProgress = True self._padding = 1 self._borderRadius = 5 self._percentComplete = 0 self._text = '' self._syncing = False self._treeItem = weakref.ref(treeItem) self._scrollBar = '' self._locked = False # setup standard properties self.setPrivelages() effect = QGraphicsDropShadowEffect() effect.setXOffset(0) effect.setYOffset(0) effect.setColor(QColor(40, 40, 40, 100)) effect.setBlurRadius(10) self.setAcceptHoverEvents(True) self.setGraphicsEffect(effect) # need this flag for Qt 4.6+ try: self.setFlag(self.ItemSendsGeometryChanges) except AttributeError: pass def alternateColor(self): """ Returns the alternate color for this widget. :return <QColor> """ return self._alternateColor def alternateHighlightColor(self): """ Returns the alternate selection color for this item. :return <QColor> """ return self._alternateHighlightColor def alternateProgressColor(self): """ Returns the alternate progress color that will be used when drawing a progress bar for this item. :return <QColor> """ return self._alternateProgressColor def borderColor(self): """ Returns the border color that will be used when drawing this item. :return <QColor> """ return self._borderColor def borderRadius(self): """ Returns the border radius for this item. :return <int> """ return self._borderRadius def color(self): """ Returns the color for this widget. :return <QColor> """ return self._color def highlightColor(self): """ Returns the primary color used for highlighting this view item. :return <QColor> """ return self._highlightColor def isSyncing(self): """ Return whether or not this item is syncing. :return <bool> """ return self._syncing def disableMovement(self): self.setFlag(self.ItemIsMovable, False) def itemChange(self, change, value): """ Overloads the base QGraphicsItem itemChange method to block user ability to move along the y-axis. :param change <int> :param value <variant> :return <variant> """ # only operate when it is a visible, geometric change if (not (self.isVisible() and change == self.ItemPositionChange)): return super(XGanttViewItem, self).itemChange(change, value) if (self.isSyncing()): return super(XGanttViewItem, self).itemChange(change, value) scene = self.scene() # only operate when we have a scene if (not scene): return super(XNode, self).itemChange(change, value) point = value.toPointF() point.setY(self.pos().y()) # create the return value new_value = qt.wrapVariant(point) # call the base method to operate on the new point return super(XGanttViewItem, self).itemChange(change, new_value) def itemStyle(self): """ Returns the style that this item will be rendered as. :return <XGanttWidgetItem.ItemStyle> """ item = self.treeItem() if (item): return item.itemStyle() return 0 def mouseReleaseEvent(self, event): """ Overloads the mouse release event to apply the current changes. :param event | <QEvent> """ super(XGanttViewItem, self).mouseReleaseEvent(event) # force the x position to snap to the nearest date scene = self.scene() if (scene): gantt = scene.ganttWidget() curr_x = self.pos().x() + gantt.cellWidth() / 2.0 new_x = curr_x - curr_x % gantt.cellWidth() self.setPos(new_x, self.pos().y()) dstart = self.scene().dateAt(self.pos().x()) dend = self.scene().dateAt(self.pos().x() + self.rect().width()) dend = dend.addDays(-1) item = self._treeItem() if (item): item.viewChanged(dstart, dend) def padding(self): """ Returns the top and bottom padding for this item. :return <int> """ return self._padding def paint(self, painter, option, widget): """ Paints this item to the system. :param painter | <QPainter> option | <QStyleOptionGraphicItem> widget | <QWidget> """ style = self.itemStyle() ItemStyle = self.treeItem().ItemStyle if (style == ItemStyle.Group): #self.paintGroup( painter ) self.paintNormal(painter) elif (style == ItemStyle.Milestone): self.paintMilestone(painter) else: self.paintNormal(painter) def paintGroup(self, painter): """ Paints this item as the group look. :param painter | <QPainter> """ # generate the rect rect = self.rect() padding = self.padding() gantt = self.scene().ganttWidget() cell_w = gantt.cellWidth() cell_h = gantt.cellHeight() x = 0 y = self.padding() w = rect.width() h = rect.height() - (padding + 1) # grab the color options color = self.color() alt_color = self.alternateColor() if (self.isSelected()): color = self.highlightColor() alt_color = self.alternateHighlightColor() # create the background brush gradient = QLinearGradient() gradient.setStart(0, 0) gradient.setFinalStop(0, h) gradient.setColorAt(0, color) gradient.setColorAt(0.8, alt_color) gradient.setColorAt(1, color) painter.setPen(self.borderColor()) painter.setBrush(QBrush(gradient)) pen = painter.pen() pen.setWidthF(0.5) painter.setPen(pen) painter.setRenderHint(painter.Antialiasing) path = QPainterPath() path.moveTo(x - cell_w / 4.0, y) path.lineTo(w + cell_w / 4.0, y) path.lineTo(w + cell_w / 4.0, y + h / 2.0) path.lineTo(w, h) path.lineTo(w - cell_w / 4.0, y + h / 2.0) path.lineTo(x + cell_w / 4.0, y + h / 2.0) path.lineTo(x, h) path.lineTo(x - cell_w / 4.0, y + h / 2.0) path.lineTo(x - cell_w / 4.0, y) painter.drawPath(path) # create the progress brush if (self.showProgress()): gradient = QLinearGradient() gradient.setStart(0, 0) gradient.setFinalStop(0, h) gradient.setColorAt(0, self.progressColor()) gradient.setColorAt(0.8, self.alternateProgressColor()) gradient.setColorAt(1, self.progressColor()) prog_w = (w - 4) * (self._percentComplete / 100.0) painter.setPen(Qt.NoPen) painter.setBrush(QBrush(gradient)) painter.drawRect(x, y, prog_w, y + h / 2.0) # draw the text on this item if (self.text()): painter.setPen(self.textColor()) painter.drawText(x, y, w, h, Qt.AlignTop, self.text()) def paintMilestone(self, painter): """ Paints this item as the milestone look. :param painter | <QPainter> """ # generate the rect rect = self.rect() padding = self.padding() gantt = self.scene().ganttWidget() cell_w = gantt.cellWidth() cell_h = gantt.cellHeight() x = rect.width() - cell_w y = self.padding() w = cell_w h = rect.height() - padding - 2 # grab the color options color = self.color() alt_color = self.alternateColor() if (self.isSelected()): color = self.highlightColor() alt_color = self.alternateHighlightColor() # create the background brush gradient = QLinearGradient() gradient.setStart(0, 0) gradient.setFinalStop(0, h) gradient.setColorAt(0, color) gradient.setColorAt(0.8, alt_color) gradient.setColorAt(1, color) painter.setPen(self.borderColor()) painter.setBrush(QBrush(gradient)) pen = painter.pen() pen.setWidthF(0.5) painter.setPen(pen) painter.setRenderHint(painter.Antialiasing) path = QPainterPath() path.moveTo(x - cell_w / 3.0, y + h / 2.0) path.lineTo(x, y) path.lineTo(x + cell_w / 3.0, y + h / 2.0) path.lineTo(x, y + h) path.lineTo(x - cell_w / 3.0, y + h / 2.0) painter.drawPath(path) def paintNormal(self, painter): """ Paints this item as the normal look. :param painter | <QPainter> """ # generate the rect rect = self.rect() x = 0 y = self.padding() #add scroll position to y #y = y+self._scrollBar.value() w = rect.width() h = rect.height() - (2 * self.padding()) - 1 radius = self.borderRadius() # grab the color options color = self.color() alt_color = self.alternateColor() if (self.isSelected()): color = self.highlightColor() alt_color = self.alternateHighlightColor() # create the background brush gradient = QLinearGradient() gradient.setStart(0, 0) gradient.setFinalStop(0, h) gradient.setColorAt(0, color) gradient.setColorAt(0.8, alt_color) gradient.setColorAt(1, color) painter.setPen(self.borderColor()) if (radius): painter.setRenderHint(painter.Antialiasing) pen = painter.pen() pen.setWidthF(0.5) painter.setPen(pen) painter.setBrush(QBrush(gradient)) painter.drawRoundedRect(x, y, w, h, radius, radius) # create the progress brush if (self.showProgress()): gradient = QLinearGradient() gradient.setStart(0, 0) gradient.setFinalStop(0, h) gradient.setColorAt(0, self.progressColor()) gradient.setColorAt(0.8, self.alternateProgressColor()) gradient.setColorAt(1, self.progressColor()) prog_w = (w - 4) * (self._percentComplete / 100.0) radius -= 2 painter.setPen(Qt.NoPen) painter.setBrush(QBrush(gradient)) painter.drawRoundedRect(x + 2, y + 2, prog_w, h - 4, radius, radius) # draw the text on this item if (self.text()): painter.setPen(self.textColor()) painter.drawText(x, y, w, h, Qt.AlignTop | Qt.AlignHCenter, self.text()) def percentComplete(self): """ Returns the percent complete that this item is in. :return <int> """ return self._percentComplete def progressColor(self): """ Returns the color that will be displayed with the progress bar for this widget. :return <QColor> """ return self._progressColor def setAlternateColor(self, color): """ Sets the alternate color for this widget to the inputed color. :param color | <QColor> """ self._alternateColor = QColor(color) def setAlternateProgressColor(self, color): """ Sets the alternate progress color that will be used when drawing a progress bar for this item. :return <QColor> """ self._alternateProgressColor = QColor(color) def setAlternateHighlightColor(self, color): """ Sets the alternate selection color for this item to the inputed color. :param color | <QColor> """ self._alternateHighlightColor = QColor(color) def setBorderRadius(self, radius): """ Sets the radius that will be used for this item to the inputed radius. :param radius | <int> """ self._borderRadius = radius def setColor(self, color): """ Sets the color for this widget. :param color | <QColor> || <str> """ self._color = QColor(color) self.setAlternateColor(self._color.darker(110)) def setHighlightColor(self, color): """ Sets the primary color used for highlighting this item. :param color | <QColor> """ self._highlightColor = QColor(color) self.setAlternateHighlightColor(self._highlightColor.darker(110)) def setPadding(self, padding): """ Sets the padding that will be used to pad the top and bottom for this item. :param padding | <int> """ self._padding = padding def setPercentComplete(self, percent): """ Sets the completion percentage for this item to the inputed amount. :param percent | <int> """ self._percentComplete = percent def setPrivelages(self): #iterate through fields and adjust edit flag #print ("Privelages: "+str(sharedDB.currentUser._idPrivileges)) if sharedDB.currentUser._idPrivileges > 1 or self._locked: self.setFlags(self.flags() ^ Qt.ItemIsEditable) self.setFlag(self.ItemIsMovable, False) self.setFlag(self.ItemIsSelectable, True) self.setFlag(self.ItemIsFocusable, True) else: flags = self.ItemIsMovable flags |= self.ItemIsSelectable flags |= self.ItemIsFocusable flags |= Qt.ItemIsEditable self.setFlags(flags) def setProgressColor(self, color): """ Sets the color that for the progress bar for this item. :param color | <QColor> """ self._progressColor = QColor(color) self.setAlternateProgressColor(self._progressColor.darker(110)) def setShowProgress(self, state): """ Sets whether or not the progress information should be displayed. :param state | <bool> """ self._showProgress = state def setSyncing(self, state): """ Sets whether or not this item is syncing. :param state | <bool> """ self._syncing = state def setText(self, text): """ Sets the text for this item. :param text | <str> """ self._text = text def setTextColor(self, color): """ Sets the color that will be used for this widget's text. :param color | <QColor> || <str> """ self._textColor = QColor(color) def showProgress(self): """ Returns whether or not the progress should be displayed for this item. :return <bool> """ return self._showProgress def text(self): """ Returns the text for this widget. :return <str> """ return self._text def textColor(self): """ Returns the text color that will be used for this item's text. :return <QColor> """ return self._textColor def treeItem(self): """ Returns the tree item that is linked with this view item. :return <XGanttWidgetItem> """ return self._treeItem() def contextMenuEvent(self, ev): #if typ == "phaseassignment": # statusMenu = menu.addMenu("TEST") #elif typ == "project": menu = QtGui.QMenu() if self.treeItem( )._dbEntry._type == "project" and sharedDB.currentUser._idPrivileges < 2: lockAction = QtGui.QAction('Locked', None) lockAction.triggered.connect(self.toggleLock) menu.addAction(lockAction) lockAction.setCheckable(True) lockAction.setChecked(self._locked) if self.treeItem( )._dbEntry._type == "phaseassignment" and sharedDB.currentUser._idPrivileges < 2: renameAction = QtGui.QAction('Rename', None) renameAction.triggered.connect(self.renameDialog) menu.addAction(renameAction) #statusAction.setData(dbentry.id()) #menu.addSeparator() menu.exec_(ev.screenPos()) def toggleLock(self): #print "Showing All Phases" self._locked = not self._locked self.setPrivelages() def renameDialog(self): dialog = QtGui.QInputDialog() text, ok = dialog.getText( dialog, ('Rename Phase: ' + self.treeItem()._dbEntry.name()), 'Enter new name: ' ) if ok and len(text): self.treeItem()._dbEntry.setName(text)
class MenuButton(QPushButton): def __init__(self, parent=None): super(MenuButton, self).__init__(parent) self.setStyleSheet( "QMenu{background:purple;}" "QMenu{border:1px solid lightgray;}" "QMenu{border-color:green;}" "QMenu::item{padding:0px 40px 0px 20px;}" "QMenu::item{height:30px;}" "QMenu::item{color:blue;}" "QMenu::item{background:white;}" "QMenu::item{margin:1px 0px 0px 0px;}" "QMenu::item:selected:enabled{background:lightgray;}" "QMenu::item:selected:enabled{color:white;}" "QMenu::item:selected:!enabled{background:transparent;}" "QMenu::separator{height:50px;}" "QMenu::separator{width:1px;}" "QMenu::separator{background:white;}" "QMenu::separator{margin:1px 1px 1px 1px;}" "QMenu#menu{background:white;}" "QMenu#menu{border:1px solid lightgray;}" "QMenu#menu::item{padding:0px 40px 0px 30px;}" "QMenu#menu::item{height:25px;}" "QMenu#menu::item:selected:enabled{background:lightgray;}" "QMenu#menu::item:selected:enabled{color:white;}" "QMenu#menu::item:selected:!enabled{background:transparent;}" "QMenu#menu::separator{height:1px;}" "QMenu#menu::separator{background:lightgray;}" "QMenu#menu::separator{margin:2px 0px 2px 0px;}" "QMenu#menu::indicator {padding:10px;}") self.hovered = False self.pressed = False self.pressedIcon = QIcon() self.color = QColor(Qt.gray) self.opacity = 1.0 self.count = 0 # self.setAutoFillBackground(True) # self.setStyleSheet("#Check {background-color: rgb(255, 255, 255);}"); self.createContextMenu() self.count = 0 def createContextMenu(self): ''' 创建右键菜单 ''' # 必须将ContextMenuPolicy设置为Qt.CustomContextMenu # 否则无法使用customContextMenuRequested信号 self.setContextMenuPolicy(Qt.CustomContextMenu) self.customContextMenuRequested.connect(self.showContextMenu) # 创建QMenu self.contextMenu = QMenu(self) self.actionA = self.contextMenu.addAction(QIcon("images/0.png"), u'| 动作A') self.actionB = self.contextMenu.addAction(QIcon("images/0.png"), u'| 动作B') self.actionC = self.contextMenu.addAction(QIcon("images/0.png"), u'| 动作C') #添加二级菜单 self.second = self.contextMenu.addMenu(QIcon("images/0.png"), u"| 二级菜单") self.actionD = self.second.addAction(QIcon("images/0.png"), u'| 动作A') self.actionE = self.second.addAction(QIcon("images/0.png"), u'| 动作B') self.actionF = self.second.addAction(QIcon("images/0.png"), u'| 动作C') # 将动作与处理函数相关联 # 这里为了简单,将所有action与同一个处理函数相关联, # 当然也可以将他们分别与不同函数关联,实现不同的功能 self.actionA.triggered.connect(self.actionHandler) self.actionB.triggered.connect(self.actionHandler) self.actionC.triggered.connect(self.actionHandler) self.actionD.triggered.connect(self.actionHandler) self.actionE.triggered.connect(self.actionHandler) self.actionF.triggered.connect(self.actionHandler) def showContextMenu(self, pos): ''' 右键点击时调用的函数 ''' self.count += 1 # 菜单显示前,将它移动到鼠标点击的位置 self.contextMenu.exec_(QCursor.pos()) # 在鼠标位置显示 # self.contextMenu.show() print self.count def actionHandler(self): ''' 菜单中的具体action调用的函数 ''' if self.count % 3 == 1: self.setText(u"first") elif self.count % 3 == 2: self.setText(u"second") elif self.count % 3 == 0: self.setText(u"third") def setEnterCursorType(self, Type): self.cursorType = Type def setColor(self, color): self.color = color def setOpacitys(self, opacity): self.opacity = opacity # self.setOpacity(0.5) def enterEvent(self, event): self.hovered = True self.repaint() QPushButton.enterEvent(self, event) def leaveEvent(self, event): self.hovered = False self.repaint() self.setCursor(QCursor(Qt.ArrowCursor)) QPushButton.leaveEvent(self, event) def mousePressEvent(self, event): self.pressed = True self.repaint() QPushButton.mousePressEvent(self, event) def mouseReleaseEvent(self, event): self.pressed = False self.repaint() QPushButton.mouseReleaseEvent(self, event) def paintEvent(self, event): painter = QPainter(self) btnRect = self.geometry() iconRect = self.iconSize() color = QColor(Qt.black) if self.hovered: color = self.color if self.pressed: color = self.color.darker(120) painter.setPen(QPen(QColor(Qt.lightGray), 2)) outline = QPainterPath() outline.addRoundedRect(0, 0, btnRect.width(), btnRect.height(), 0, 0) painter.setOpacity(1) painter.drawPath(outline) painter.setBrush(QBrush(color)) painter.setOpacity(self.opacity) painter_path = QPainterPath() painter_path.addRoundedRect(1, 1, btnRect.width() - 2, btnRect.height() - 2, 0, 0) if self.hovered: painter.setClipPath(painter_path) painter.drawRoundedRect(1, 1, btnRect.width() - 2, btnRect.height() - 2, 0, 0) painter.setOpacity(1) iconPos, textPos = self.calIconTextPos(btnRect, iconRect) # 重画文本 if not self.text().isNull(): painter.setFont(self.font()) painter.setPen(QPen(QColor(Qt.black), 2)) painter.drawText(textPos.x(), textPos.y(), textPos.width(), textPos.height(), Qt.AlignCenter, self.text()) # 重画图标 if not self.icon().isNull(): painter.drawPixmap(iconPos, QPixmap(self.icon().pixmap(self.iconSize()))) # 计算图标和文本大小位置 def calIconTextPos(self, btnSize, iconSize): if self.text().isNull(): iconWidth = iconSize.width() * 3 / 5 iconHeight = iconSize.height() * 3 / 5 else: iconWidth = iconSize.width() iconHeight = iconSize.height() - 50 iconX = (btnSize.width() - iconWidth) / 2 iconY = (btnSize.height() - iconHeight) / 2 iconPos = QRect() iconPos.setX(iconX) iconPos.setY(iconY) iconPos.setWidth(iconWidth) iconPos.setHeight(iconHeight) textPos = QRect() if not self.text().isNull(): textPos.setX(iconX) textPos.setY(btnSize.height() - 50) textPos.setWidth(iconWidth) textPos.setHeight(50) return (iconPos, textPos)
class ArrowAnnotation(Annotation): def __init__(self, parent=None, line=None, **kwargs): Annotation.__init__(self, parent, **kwargs) self.setFlag(QGraphicsItem.ItemIsMovable) self.setFlag(QGraphicsItem.ItemIsSelectable) self.setFocusPolicy(Qt.ClickFocus) if line is None: line = QLineF(0, 0, 20, 0) self.__line = line self.__color = QColor(Qt.red) self.__arrowItem = ArrowItem(self) self.__arrowItem.setLine(line) self.__arrowItem.setBrush(self.__color) self.__arrowItem.setPen(QPen(Qt.NoPen)) self.__arrowItem.setArrowStyle(ArrowItem.Concave) self.__arrowItem.setLineWidth(5) self.__shadow = QGraphicsDropShadowEffect( blurRadius=5, offset=QPointF(1.0, 2.0), ) self.__arrowItem.setGraphicsEffect(self.__shadow) self.__shadow.setEnabled(True) self.__autoAdjustGeometry = True def setAutoAdjustGeometry(self, autoAdjust): """ If set to `True` then the geometry will be adjusted whenever the arrow is changed with `setLine`. Otherwise the geometry of the item is only updated so the `line` lies within the `geometry()` rect (i.e. it only grows). True by default """ self.__autoAdjustGeometry = autoAdjust if autoAdjust: self.adjustGeometry() def autoAdjustGeometry(self): """ Should the geometry of the item be adjusted automatically when `setLine` is called. """ return self.__autoAdjustGeometry def setLine(self, line): """ Set the arrow base line (a `QLineF` in object coordinates). """ if self.__line != line: self.__line = line # local item coordinate system geom = self.geometry().translated(-self.pos()) if geom.isNull() and not line.isNull(): geom = QRectF(0, 0, 1, 1) arrow_shape = arrow_path_concave(line, self.lineWidth()) arrow_rect = arrow_shape.boundingRect() if not (geom.contains(arrow_rect)): geom = geom.united(arrow_rect) if self.__autoAdjustGeometry: # Shrink the geometry if required. geom = geom.intersected(arrow_rect) # topLeft can move changing the local coordinates. diff = geom.topLeft() line = QLineF(line.p1() - diff, line.p2() - diff) self.__arrowItem.setLine(line) self.__line = line # parent item coordinate system geom.translate(self.pos()) self.setGeometry(geom) def line(self): """ Return the arrow base line (`QLineF` in object coordinates). """ return QLineF(self.__line) def setColor(self, color): """ Set arrow brush color. """ if self.__color != color: self.__color = QColor(color) self.__updateBrush() def color(self): """ Return the arrow brush color. """ return QColor(self.__color) def setLineWidth(self, lineWidth): """ Set the arrow line width. """ self.__arrowItem.setLineWidth(lineWidth) def lineWidth(self): """ Return the arrow line width. """ return self.__arrowItem.lineWidth() def adjustGeometry(self): """ Adjust the widget geometry to exactly fit the arrow inside while preserving the arrow path scene geometry. """ # local system coordinate geom = self.geometry().translated(-self.pos()) line = self.__line arrow_rect = self.__arrowItem.shape().boundingRect() if geom.isNull() and not line.isNull(): geom = QRectF(0, 0, 1, 1) if not (geom.contains(arrow_rect)): geom = geom.united(arrow_rect) geom = geom.intersected(arrow_rect) diff = geom.topLeft() line = QLineF(line.p1() - diff, line.p2() - diff) geom.translate(self.pos()) self.setGeometry(geom) self.setLine(line) def shape(self): arrow_shape = self.__arrowItem.shape() return self.mapFromItem(self.__arrowItem, arrow_shape) def itemChange(self, change, value): if change == QGraphicsItem.ItemSelectedHasChanged: self.__updateBrush() return Annotation.itemChange(self, change, value) def __updateBrush(self): """ Update the arrow brush. """ if self.isSelected(): color = self.__color.darker(150) else: color = self.__color self.__arrowItem.setBrush(color)
class ArrowAnnotation(Annotation): def __init__(self, parent=None, line=None, **kwargs): Annotation.__init__(self, parent, **kwargs) self.setFlag(QGraphicsItem.ItemIsMovable) self.setFlag(QGraphicsItem.ItemIsSelectable) self.setFocusPolicy(Qt.ClickFocus) if line is None: line = QLineF(0, 0, 20, 0) self.__line = line self.__color = QColor(Qt.red) self.__arrowItem = ArrowItem(self) self.__arrowItem.setLine(line) self.__arrowItem.setBrush(self.__color) self.__arrowItem.setPen(QPen(Qt.NoPen)) self.__arrowItem.setArrowStyle(ArrowItem.Concave) self.__arrowItem.setLineWidth(5) self.__shadow = QGraphicsDropShadowEffect( blurRadius=5, offset=QPointF(1.0, 2.0), ) self.__arrowItem.setGraphicsEffect(self.__shadow) self.__shadow.setEnabled(True) self.__autoAdjustGeometry = True def setAutoAdjustGeometry(self, autoAdjust): """ If set to `True` then the geometry will be adjusted whenever the arrow is changed with `setLine`. Otherwise the geometry of the item is only updated so the `line` lies within the `geometry()` rect (i.e. it only grows). True by default """ self.__autoAdjustGeometry = autoAdjust if autoAdjust: self.adjustGeometry() def autoAdjustGeometry(self): """ Should the geometry of the item be adjusted automatically when `setLine` is called. """ return self.__autoAdjustGeometry def setLine(self, line): """ Set the arrow base line (a `QLineF` in object coordinates). """ if self.__line != line: self.__line = line # local item coordinate system geom = self.geometry().translated(-self.pos()) if geom.isNull() and not line.isNull(): geom = QRectF(0, 0, 1, 1) arrow_shape = arrow_path_concave(line, self.lineWidth()) arrow_rect = arrow_shape.boundingRect() if not (geom.contains(arrow_rect)): geom = geom.united(arrow_rect) if self.__autoAdjustGeometry: # Shrink the geometry if required. geom = geom.intersected(arrow_rect) # topLeft can move changing the local coordinates. diff = geom.topLeft() line = QLineF(line.p1() - diff, line.p2() - diff) self.__arrowItem.setLine(line) self.__line = line # parent item coordinate system geom.translate(self.pos()) self.setGeometry(geom) def line(self): """ Return the arrow base line (`QLineF` in object coordinates). """ return QLineF(self.__line) def setColor(self, color): """ Set arrow brush color. """ if self.__color != color: self.__color = QColor(color) self.__updateStyleState() def color(self): """ Return the arrow brush color. """ return QColor(self.__color) def setLineWidth(self, lineWidth): """ Set the arrow line width. """ self.__arrowItem.setLineWidth(lineWidth) def lineWidth(self): """ Return the arrow line width. """ return self.__arrowItem.lineWidth() def adjustGeometry(self): """ Adjust the widget geometry to exactly fit the arrow inside while preserving the arrow path scene geometry. """ # local system coordinate geom = self.geometry().translated(-self.pos()) line = self.__line arrow_rect = self.__arrowItem.shape().boundingRect() if geom.isNull() and not line.isNull(): geom = QRectF(0, 0, 1, 1) if not (geom.contains(arrow_rect)): geom = geom.united(arrow_rect) geom = geom.intersected(arrow_rect) diff = geom.topLeft() line = QLineF(line.p1() - diff, line.p2() - diff) geom.translate(self.pos()) self.setGeometry(geom) self.setLine(line) def shape(self): arrow_shape = self.__arrowItem.shape() return self.mapFromItem(self.__arrowItem, arrow_shape) def itemChange(self, change, value): if change == QGraphicsItem.ItemSelectedHasChanged: self.__updateStyleState() return Annotation.itemChange(self, change, value) 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)
class MenuButton(QPushButton): def __init__(self,parent = None): super(MenuButton,self).__init__(parent) self.setFlat(True) self.hovered = False self.pressed = False self.color = QColor(Qt.lightGray) def enterEvent(self,event): self.hovered = True self.repaint() QPushButton.enterEvent(self,event) def leaveEvent(self,event): self.hovered = False self.repaint() QPushButton.leaveEvent(self,event) def mousePressEvent(self, event): self.pressed = True self.repaint() QPushButton.mousePressEvent(self,event) def mouseReleaseEvent(self, event): self.pressed = False self.repaint() QPushButton.mouseReleaseEvent(self,event) def setColor(self,color): self.color = color def paintEvent(self,event): painter = QPainter(self) btnRect = self.geometry() color = QColor(Qt.black) if self.hovered: color = self.color if self.pressed: color = self.color.darker(120) painter.setBrush(QBrush(color)) painter_path = QPainterPath() painter_path.addRoundedRect(1, 1, btnRect.width() - 2, btnRect.height() - 2, 0, 0) if self.hovered: painter.setPen(QPen(color,2)) outline = QPainterPath() outline.addRoundedRect(0, 0, btnRect.width(), btnRect.height(), 0, 0) painter.setOpacity(1) painter.drawPath(outline) painter.setClipPath(painter_path) painter.drawRoundedRect(1, 1, btnRect.width() - 2, btnRect.height() - 2, 0, 0) iconWidth = self.iconSize().width()*3/5 iconHeight = self.iconSize().height()*3/5 iconX = (btnRect.width()-iconWidth)/2 iconY = (btnRect.height()-iconHeight)/2 if self.pressed: iconX += 2 iconY += 2 iconPos = QRect() iconPos.setX(iconX) iconPos.setY(iconY) iconPos.setWidth(iconWidth) iconPos.setHeight(iconHeight) painter.drawPixmap(iconPos, QPixmap(self.icon().pixmap(self.iconSize())))