示例#1
0
	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
示例#2
0
    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)
示例#3
0
    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)
示例#4
0
    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
示例#5
0
    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)
示例#6
0
    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)
示例#7
0
 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))
示例#8
0
    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()
示例#10
0
文件: widgets.py 项目: jsdir/giza
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)
示例#12
0
class Theme(object):
    # enum PortType
    THEME_PORT_SQUARE = 0
    THEME_PORT_POLYGON = 1

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

    # enum BackgroundType
    THEME_BG_SOLID = 0
    THEME_BG_GRADIENT = 1

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

        self.idx = idx

        # Default theme settings

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        # Font-dependant port height
        port_font = QFont(self.port_font_name, self.port_font_size,
                          self.port_font_state)
        self.port_height = QFontMetrics(
            port_font).height() + 2 * self.port_text_padding
示例#13
0
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)
示例#14
0
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)
示例#15
0
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)
示例#16
0
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)
示例#17
0
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())))