def _horizontalGradientHelper(cls, painter: QPainter, spanRect: QRect, rect: QRect, lightColored: bool): if lightColored: shadowGradient = QLinearGradient(rect.topLeft(), rect.bottomLeft()) shadowGradient.setColorAt(0, 0xf0f0f0) shadowGradient.setColorAt(1, 0xcfcfcf) painter.fillRect(rect, shadowGradient) return base = cls.baseColor(lightColored) highlight = cls.highlightColor(lightColored) shadow = cls.shadowColor(lightColored) grad = QLinearGradient(rect.topLeft(), rect.bottomLeft()) grad.setColorAt(0, highlight.lighter(120)) if rect.height() == cls.navigationWidgetHeight: grad.setColorAt(0.4, highlight) grad.setColorAt(0.401, base) grad.setColorAt(1, shadow) painter.fillRect(rect, grad) shadowGradient = QLinearGradient(spanRect.topLeft(), spanRect.topRight()) shadowGradient.setColorAt(0, QColor(0, 0, 0, 30)) lighterHighlight = highlight.lighter(130) lighterHighlight.setAlpha(100) shadowGradient.setColorAt(0.7, lighterHighlight) shadowGradient.setColorAt(1, QColor(0, 0, 0, 40)) painter.fillRect(rect, shadowGradient)
def verticalGradient(self, painter, spanRect, clipRect): key = 'fancy vertical gradient %d %d %d %d %d'%(spanRect.width(), spanRect.height(), clipRect.width(), clipRect.height(), self.baseColor.rgb()) pixmap = QPixmap() p = painter rect = QRect(clipRect) if self._usePixmapCache and not QPixmapCache.find(key, pixmap): pixmap = QPixmap(clipRect.size()) p = QPainter(pixmap) rect = QRect(0, 0, clipRect.width(), clipRect.height()) base = self.baseColor grad = QLinearGradient(QPointF(spanRect.topRight()), QPointF(spanRect.topLeft())) grad.setColorAt(0, self.highlightColor) grad.setColorAt(0.301, base) grad.setColorAt(1, self.shadowColor) p.fillRect(rect, grad) light = QColor(255, 255, 255, 80) p.setPen(light) p.drawLine(rect.topRight() - QPoint(1, 0), rect.bottomRight() - QPoint(1, 0)) if self._usePixmapCache and not QPixmapCache.find(key, pixmap): painter.drawPixmap(clipRect.topLeft(), pixmap) p.end() del p QPixmapCache.insert(key, pixmap)
def paintEvent( self, event ): """ Das automatisch ausgelöste paintEvent, das das Widget bei jeder Fensterveränderung neu zeichnet. """ if self.__maximum > 0: frameWidth = 1 separatorWidth = 1 # Damit der Rahmen nicht irgendwie abgeschnitten wird, muß das Quadrat entsprechend kleiner sein. squareSideLength = 10 framePen = QPen( frameWidth ) framePen.setColor( self.__colorFrame ) squareSideLengthPlus = squareSideLength + 2 * frameWidth painter = QPainter( self ) windowWidth = self.width() / min( self.__maximum, self.__columnMax ) windowHeight = self.__maximum / self.__columnMax windowHeight = math.ceil( windowHeight ) windowHeight = self.height() / windowHeight side = min( windowWidth, windowHeight ) painter.setRenderHint( QPainter.Antialiasing ) # Wenn das Widget disabled ist, muß ich den Alphakanal meiner Farben verändern. if ( not self.isEnabled() ): painter.setOpacity( .5 ) #painter.translate( float( windowWidth ), float( windowHeight ) ) painter.scale( side / squareSideLengthPlus, side / squareSideLengthPlus ) painter.setPen( framePen ) painter.setBrush( self.__colorEmpty ) painter.save() squareColumnIter = 0 squareLineIter = 0 squareCount = 0 for squareCount in range(self.__maximum): square = QRect( ( squareSideLength + separatorWidth ) * squareColumnIter + frameWidth * ( squareColumnIter + 1 ), ( squareSideLength + separatorWidth ) * squareLineIter + frameWidth * ( squareLineIter + 1 ), squareSideLength, squareSideLength ) painter.drawRect( square ) # Wir zeichnen die ausgekreuzten Quadrate if (self.__value > (self.__columnMax * squareLineIter + squareColumnIter)): painter.drawLine(square.bottomLeft(), square.topRight()) painter.drawLine(square.topLeft(), square.bottomRight()) squareColumnIter += 1 if ( squareColumnIter >= self.__columnMax ): squareColumnIter = 0 squareLineIter += 1 painter.restore()
def _drawStyledBar(self, painter, option): rect = option.rect key = "fancy styledbar %d %d %d" % (rect.width(), rect.height(), theme.baseColor.rgb()) pixmap = QPixmap() p = painter if theme.usePixmapCache() and not QPixmapCache.find(key, pixmap): pixmap = QPixmap(rect.size()) p = QPainter(pixmap) rect = QRect(0, 0, rect.width(), rect.height()) horizontal = option.state & QStyle.State_Horizontal offset = self.window().mapToGlobal( option.rect.topLeft()) - self.mapToGlobal(option.rect.topLeft()) gradientSpan = QRect(offset, self.window().size()) if horizontal: theme.horizontalGradient(p, gradientSpan, rect) else: theme.verticalGradient(p, gradientSpan, rect) painter.setPen(theme.borderColor) if horizontal: lighter = QColor(255, 255, 255, 40) if self._topBorder: p.drawLine(rect.topLeft(), rect.topRight()) p.setPen(lighter) p.drawLine(rect.topLeft() + QPoint(0, 1), rect.topRight() + QPoint(0, 1)) else: p.drawLine(rect.bottomLeft(), rect.bottomRight()) p.setPen(lighter) p.drawLine(rect.topLeft(), rect.topRight()) else: p.drawLine(rect.topLeft(), rect.bottomLeft()) p.drawLine(rect.topRight(), rect.bottomRight()) if theme.usePixmapCache() and not QPixmapCache.find(key, pixmap): painter.drawPixmap(rect.topLeft(), pixmap) p.end() del p QPixmapCache.insert(key, pixmap)
def _verticalGradientHelper(cls, painter: QPainter, spanRect: QRect, rect: QRect, lightColored): """ :type painter: QPainter :type spanRect: QRect :type rect: QRect :type lightColored: bool """ highlight = StyleHelper.highlightColor(lightColored) shadow = StyleHelper.shadowColor(lightColored) grad = QLinearGradient(spanRect.topRight(), spanRect.topLeft()) grad.setColorAt(0, highlight.lighter(117)) grad.setColorAt(1, shadow.darker(109)) painter.fillRect(rect, grad) light = QColor(255, 255, 255, 80) painter.setPen(light) painter.drawLine(rect.topRight() - QPoint(1, 0), rect.bottomRight() - QPoint(1, 0)) dark = QColor(0, 0, 0, 90) painter.setPen(dark) painter.drawLine(rect.topLeft(), rect.bottomLeft())
def __paintEventNoStyle(self): p = QPainter(self) opt = QStyleOptionToolButton() self.initStyleOption(opt) fm = QFontMetrics(opt.font) palette = opt.palette # highlight brush is used as the background for the icon and background # when the tab is expanded and as mouse hover color (lighter). brush_highlight = palette.highlight() if opt.state & QStyle.State_Sunken: # State 'down' pressed during a mouse press (slightly darker). background_brush = brush_darker(brush_highlight, 110) elif opt.state & QStyle.State_MouseOver: background_brush = brush_darker(brush_highlight, 95) elif opt.state & QStyle.State_On: background_brush = brush_highlight else: # The default button brush. background_brush = palette.button() rect = opt.rect icon = opt.icon icon_size = opt.iconSize # TODO: add shift for pressed as set by the style (PM_ButtonShift...) pm = None if not icon.isNull(): if opt.state & QStyle.State_Enabled: mode = QIcon.Normal else: mode = QIcon.Disabled pm = opt.icon.pixmap( rect.size().boundedTo(icon_size), mode, QIcon.On if opt.state & QStyle.State_On else QIcon.Off) icon_area_rect = QRect(rect) icon_area_rect.setRight(int(icon_area_rect.height() * 1.26)) text_rect = QRect(rect) text_rect.setLeft(icon_area_rect.right() + 10) # Background (TODO: Should the tab button have native # toolbutton shape, drawn using PE_PanelButtonTool or even # QToolBox tab shape) # Default outline pen pen = QPen(palette.color(QPalette.Mid)) p.save() p.setPen(Qt.NoPen) p.setBrush(QBrush(background_brush)) p.drawRect(rect) # Draw the background behind the icon if the background_brush # is different. if not opt.state & QStyle.State_On: p.setBrush(brush_highlight) p.drawRect(icon_area_rect) # Line between the icon and text p.setPen(pen) p.drawLine(icon_area_rect.topRight(), icon_area_rect.bottomRight()) if opt.state & QStyle.State_HasFocus: # Set the focus frame pen and draw the border pen = QPen(QColor(FOCUS_OUTLINE_COLOR)) p.setPen(pen) p.setBrush(Qt.NoBrush) # Adjust for pen rect = rect.adjusted(0, 0, -1, -1) p.drawRect(rect) else: p.setPen(pen) # Draw the top/bottom border if self.position == QStyleOptionToolBoxV2.OnlyOneTab or \ self.position == QStyleOptionToolBoxV2.Beginning or \ self.selected & \ QStyleOptionToolBoxV2.PreviousIsSelected: p.drawLine(rect.topLeft(), rect.topRight()) p.drawLine(rect.bottomLeft(), rect.bottomRight()) p.restore() p.save() text = fm.elidedText(opt.text, Qt.ElideRight, text_rect.width()) p.setPen(QPen(palette.color(QPalette.ButtonText))) p.setFont(opt.font) p.drawText(text_rect, int(Qt.AlignVCenter | Qt.AlignLeft) | \ int(Qt.TextSingleLine), text) if pm: pm_rect = QRect(QPoint(0, 0), pm.size()) centered_rect = QRect(pm_rect) centered_rect.moveCenter(icon_area_rect.center()) p.drawPixmap(centered_rect, pm, pm_rect) p.restore()
class StartupScreen(VispaWidget): # inherited parameters BACKGROUND_SHAPE = 'ROUNDRECT' SELECTABLE_FLAG = False AUTOSIZE = True AUTOSIZE_KEEP_ASPECT_RATIO = False PROTOTYPING_DESCRIPTION = """Prototyping""" EXECUTING_DESCRIPTION = """Executing""" VERIFYING_DESCRIPTION = """Verifying""" def __init__(self, parent): self._descriptionWidgets = [] self._descriptionActiveRects = [ QRect(), QRect(), QRect() ] # descriptions will be visible if mouse cursor is in the rect VispaWidget.__init__(self, parent) self._filenewIcon = QIcon(QPixmap(":/resources/filenew.svg")) self._fileopenIcon = QIcon(QPixmap(":/resources/fileopen.svg")) self.setImage( QSvgRenderer(":/resources/startup_development_cycle.svg")) self.setDragable(False) self.setMouseTracking( True) # receive mouse events even if no button is pressed self._hideDescriptions = False self.createPrototypingWidget() self.createExecutionWidget() self.createVerifyingWidget() def createDescriptionWidget(self, arrowDirection, description): widget = VispaWidget(self.parent()) widget.enableAutosizing(True, False) widget.setSelectable(False) widget.setArrowShape(arrowDirection) widget.setVisible(not self._hideDescriptions) widget.setDragable(False) self._descriptionWidgets.append(widget) return widget def createPrototypingWidget(self): self._prototypingDescriptionWidget = self.createDescriptionWidget( VispaWidget.ARROW_SHAPE_BOTTOM, self.PROTOTYPING_DESCRIPTION) bodyWidget = QWidget(self._prototypingDescriptionWidget) bodyWidget.setLayout(QGridLayout()) bodyWidget.layout().setContentsMargins(0, 0, 0, 0) bodyWidget.layout().addWidget(QLabel("Design physics analysis:"), 0, 0) analysisDesignerButton = QToolButton() analysisDesignerButton.setText("Analysis Designer") analysisDesignerButton.setIcon(self._filenewIcon) self.connect(analysisDesignerButton, SIGNAL("clicked(bool)"), self.parent().newAnalysisDesignerSlot) bodyWidget.layout().addWidget(analysisDesignerButton, 0, 1) bodyWidget.layout().addWidget(QLabel("Create physics event:"), 1, 0) pxlButton = QToolButton() pxlButton.setText("PXL Editor") pxlButton.setIcon(self._filenewIcon) self.connect(pxlButton, SIGNAL("clicked(bool)"), self.parent().newPxlSlot) bodyWidget.layout().addWidget(pxlButton, 1, 1) self._prototypingDescriptionWidget.setBodyWidget(bodyWidget) def createExecutionWidget(self): self._executionDescriptionWidget = self.createDescriptionWidget( VispaWidget.ARROW_SHAPE_RIGHT, self.EXECUTING_DESCRIPTION) bodyWidget = QWidget(self._executionDescriptionWidget) bodyWidget.setLayout(QGridLayout()) bodyWidget.layout().setContentsMargins(0, 0, 0, 0) label = QLabel("Open and run existing analysis:") bodyWidget.layout().addWidget(label, 0, 0) analysisDesignerButton = QToolButton() analysisDesignerButton.setText("Open analysis file") analysisDesignerButton.setIcon(self._fileopenIcon) self.connect(analysisDesignerButton, SIGNAL("clicked(bool)"), self.parent().openAnalysisFileSlot) bodyWidget.layout().addWidget(analysisDesignerButton, 0, 1) self._analysisDesignerRecentFilesList = QListWidget() self._analysisDesignerRecentFilesList.setFixedSize( label.sizeHint().width() + analysisDesignerButton.sizeHint().width(), 150) self.connect(self._analysisDesignerRecentFilesList, SIGNAL("doubleClicked(QModelIndex)"), self.parent().openAnalysisFileSlot) bodyWidget.layout().addWidget(self._analysisDesignerRecentFilesList, 1, 0, 1, 2) self._executionDescriptionWidget.setBodyWidget(bodyWidget) def analysisDesignerRecentFilesList(self): return self._analysisDesignerRecentFilesList def createVerifyingWidget(self): self._verifyingDescriptionWidget = self.createDescriptionWidget( VispaWidget.ARROW_SHAPE_LEFT, self.VERIFYING_DESCRIPTION) bodyWidget = QWidget(self._verifyingDescriptionWidget) bodyWidget.setLayout(QGridLayout()) bodyWidget.layout().setContentsMargins(0, 0, 0, 0) label = QLabel("Browse an existing PXL data file:") bodyWidget.layout().addWidget(label, 0, 0) analysisDesignerButton = QToolButton() analysisDesignerButton.setText("Open PXL file") analysisDesignerButton.setIcon(self._fileopenIcon) self.connect(analysisDesignerButton, SIGNAL("clicked(bool)"), self.parent().openPxlFileSlot) bodyWidget.layout().addWidget(analysisDesignerButton, 0, 1) self._pxlEditorRecentFilesList = QListWidget() self._pxlEditorRecentFilesList.setFixedSize( label.sizeHint().width() + analysisDesignerButton.sizeHint().width(), 150) self.connect(self._pxlEditorRecentFilesList, SIGNAL("doubleClicked(QModelIndex)"), self.parent().openPxlFileSlot) bodyWidget.layout().addWidget(self._pxlEditorRecentFilesList, 1, 0, 1, 2) self._verifyingDescriptionWidget.setBodyWidget(bodyWidget) def pxlEditorRecentFilesList(self): return self._pxlEditorRecentFilesList def mouseMoveEvent(self, event): if bool(event.buttons()): VispaWidget.mouseMoveEvent(self, event) elif self._hideDescriptions: for i in range(len(self._descriptionWidgets)): self._descriptionWidgets[i].setVisible( self._descriptionActiveRects[i].contains(event.pos())) def moveEvent(self, event): VispaWidget.moveEvent(self, event) self.rearangeDescriptionWidgets() def rearangeContent(self): VispaWidget.rearangeContent(self) self.rearangeDescriptionWidgets() def rearangeDescriptionWidgets(self): self._activeSize = QSize(0.3 * self.width(), 0.1 * self.height()) self._prototypingRect = QRect( QPoint(0.5 * (self.width() - self._activeSize.width()), 0), self._activeSize) self._executionRect = QRect(QPoint(0, 0.635 * self.height()), self._activeSize) self._verifyingRect = QRect( QPoint(self.width() - self._activeSize.width(), 0.635 * self.height()), self._activeSize) self._descriptionActiveRects[0] = self._prototypingRect self._descriptionActiveRects[1] = self._executionRect self._descriptionActiveRects[2] = self._verifyingRect self._prototypingDescriptionWidget.move( self.mapToParent(self._prototypingRect.topLeft()) + QPoint((self._prototypingRect.width() - self._prototypingDescriptionWidget.width()) * 0.5, -self._prototypingDescriptionWidget.height())) self._executionDescriptionWidget.move( self.mapToParent(self._executionRect.topLeft()) - QPoint( self._executionDescriptionWidget.width(), -0.5 * (self._executionRect.height() - self._executionDescriptionWidget.height()))) self._verifyingDescriptionWidget.move( self.mapToParent(self._verifyingRect.topRight()) - QPoint( 0, -0.5 * (self._verifyingRect.height() - self._verifyingDescriptionWidget.height()))) def boundingRect(self): br = VispaWidget.boundingRect(self) for w in self._descriptionWidgets: br = br.united(w.boundingRect()) return br def setVisible(self, visible): VispaWidget.setVisible(self, visible) self._executionDescriptionWidget.setVisible( visible and not self._hideDescriptions) self._prototypingDescriptionWidget.setVisible( visible and not self._hideDescriptions) self._verifyingDescriptionWidget.setVisible( visible and not self._hideDescriptions)
class StartupScreen(VispaWidget): # inherited parameters BACKGROUND_SHAPE = 'ROUNDRECT' SELECTABLE_FLAG = False AUTOSIZE = True AUTOSIZE_KEEP_ASPECT_RATIO = False PROTOTYPING_DESCRIPTION = """Prototyping""" EXECUTING_DESCRIPTION = """Executing""" VERIFYING_DESCRIPTION = """Verifying""" def __init__(self, parent): self._descriptionWidgets = [] self._descriptionActiveRects = [QRect(), QRect(), QRect()] # descriptions will be visible if mouse cursor is in the rect VispaWidget.__init__(self, parent) self._filenewIcon = QIcon(QPixmap(":/resources/filenew.svg")) self._fileopenIcon = QIcon(QPixmap(":/resources/fileopen.svg")) self.setImage(QSvgRenderer(":/resources/startup_development_cycle.svg")) self.setDragable(False) self.setMouseTracking(True) # receive mouse events even if no button is pressed self._hideDescriptions = False self.createPrototypingWidget() self.createExecutionWidget() self.createVerifyingWidget() def createDescriptionWidget(self, arrowDirection, description): widget = VispaWidget(self.parent()) widget.enableAutosizing(True, False) widget.setSelectable(False) widget.setArrowShape(arrowDirection) widget.setVisible(not self._hideDescriptions) widget.setDragable(False) self._descriptionWidgets.append(widget) return widget def createPrototypingWidget(self): self._prototypingDescriptionWidget = self.createDescriptionWidget(VispaWidget.ARROW_SHAPE_BOTTOM, self.PROTOTYPING_DESCRIPTION) bodyWidget = QWidget(self._prototypingDescriptionWidget) bodyWidget.setLayout(QGridLayout()) bodyWidget.layout().setContentsMargins(0, 0, 0, 0) bodyWidget.layout().addWidget(QLabel("Design physics analysis:"), 0, 0) analysisDesignerButton = QToolButton() analysisDesignerButton.setText("Analysis Designer") analysisDesignerButton.setIcon(self._filenewIcon) self.connect(analysisDesignerButton, SIGNAL("clicked(bool)"), self.parent().newAnalysisDesignerSlot) bodyWidget.layout().addWidget(analysisDesignerButton, 0, 1) bodyWidget.layout().addWidget(QLabel("Create physics event:"), 1, 0) pxlButton = QToolButton() pxlButton.setText("PXL Editor") pxlButton.setIcon(self._filenewIcon) self.connect(pxlButton, SIGNAL("clicked(bool)"), self.parent().newPxlSlot) bodyWidget.layout().addWidget(pxlButton, 1, 1) self._prototypingDescriptionWidget.setBodyWidget(bodyWidget) def createExecutionWidget(self): self._executionDescriptionWidget = self.createDescriptionWidget(VispaWidget.ARROW_SHAPE_RIGHT, self.EXECUTING_DESCRIPTION) bodyWidget = QWidget(self._executionDescriptionWidget) bodyWidget.setLayout(QGridLayout()) bodyWidget.layout().setContentsMargins(0, 0, 0, 0) label=QLabel("Open and run existing analysis:") bodyWidget.layout().addWidget(label, 0, 0) analysisDesignerButton = QToolButton() analysisDesignerButton.setText("Open analysis file") analysisDesignerButton.setIcon(self._fileopenIcon) self.connect(analysisDesignerButton, SIGNAL("clicked(bool)"), self.parent().openAnalysisFileSlot) bodyWidget.layout().addWidget(analysisDesignerButton, 0, 1) self._analysisDesignerRecentFilesList=QListWidget() self._analysisDesignerRecentFilesList.setFixedSize(label.sizeHint().width()+analysisDesignerButton.sizeHint().width(),150) self.connect(self._analysisDesignerRecentFilesList, SIGNAL("doubleClicked(QModelIndex)"), self.parent().openAnalysisFileSlot) bodyWidget.layout().addWidget(self._analysisDesignerRecentFilesList, 1, 0, 1, 2) self._executionDescriptionWidget.setBodyWidget(bodyWidget) def analysisDesignerRecentFilesList(self): return self._analysisDesignerRecentFilesList def createVerifyingWidget(self): self._verifyingDescriptionWidget = self.createDescriptionWidget(VispaWidget.ARROW_SHAPE_LEFT, self.VERIFYING_DESCRIPTION) bodyWidget = QWidget(self._verifyingDescriptionWidget) bodyWidget.setLayout(QGridLayout()) bodyWidget.layout().setContentsMargins(0, 0, 0, 0) label=QLabel("Browse an existing PXL data file:") bodyWidget.layout().addWidget(label, 0, 0) analysisDesignerButton = QToolButton() analysisDesignerButton.setText("Open PXL file") analysisDesignerButton.setIcon(self._fileopenIcon) self.connect(analysisDesignerButton, SIGNAL("clicked(bool)"), self.parent().openPxlFileSlot) bodyWidget.layout().addWidget(analysisDesignerButton, 0, 1) self._pxlEditorRecentFilesList=QListWidget() self._pxlEditorRecentFilesList.setFixedSize(label.sizeHint().width()+analysisDesignerButton.sizeHint().width(),150) self.connect(self._pxlEditorRecentFilesList, SIGNAL("doubleClicked(QModelIndex)"), self.parent().openPxlFileSlot) bodyWidget.layout().addWidget(self._pxlEditorRecentFilesList, 1, 0, 1, 2) self._verifyingDescriptionWidget.setBodyWidget(bodyWidget) def pxlEditorRecentFilesList(self): return self._pxlEditorRecentFilesList def mouseMoveEvent(self, event): if bool(event.buttons()): VispaWidget.mouseMoveEvent(self, event) elif self._hideDescriptions: for i in range(len(self._descriptionWidgets)): self._descriptionWidgets[i].setVisible(self._descriptionActiveRects[i].contains(event.pos())) def moveEvent(self, event): VispaWidget.moveEvent(self, event) self.rearangeDescriptionWidgets() def rearangeContent(self): VispaWidget.rearangeContent(self) self.rearangeDescriptionWidgets() def rearangeDescriptionWidgets(self): self._activeSize = QSize(0.3 * self.width(), 0.1 * self.height()) self._prototypingRect = QRect(QPoint(0.5 * (self.width() - self._activeSize.width()), 0), self._activeSize) self._executionRect = QRect(QPoint(0, 0.635 * self.height()), self._activeSize) self._verifyingRect = QRect(QPoint(self.width() -self._activeSize.width(), 0.635 * self.height()), self._activeSize) self._descriptionActiveRects[0] = self._prototypingRect self._descriptionActiveRects[1] = self._executionRect self._descriptionActiveRects[2] = self._verifyingRect self._prototypingDescriptionWidget.move(self.mapToParent(self._prototypingRect.topLeft()) + QPoint((self._prototypingRect.width() - self._prototypingDescriptionWidget.width()) * 0.5, - self._prototypingDescriptionWidget.height())) self._executionDescriptionWidget.move(self.mapToParent(self._executionRect.topLeft()) - QPoint(self._executionDescriptionWidget.width(), - 0.5 * (self._executionRect.height() - self._executionDescriptionWidget.height()))) self._verifyingDescriptionWidget.move(self.mapToParent(self._verifyingRect.topRight()) - QPoint(0, - 0.5 * (self._verifyingRect.height() - self._verifyingDescriptionWidget.height()))) def boundingRect(self): br = VispaWidget.boundingRect(self) for w in self._descriptionWidgets: br = br.united(w.boundingRect()) return br def setVisible(self, visible): VispaWidget.setVisible(self, visible) self._executionDescriptionWidget.setVisible(visible and not self._hideDescriptions) self._prototypingDescriptionWidget.setVisible(visible and not self._hideDescriptions) self._verifyingDescriptionWidget.setVisible(visible and not self._hideDescriptions)
def __paintEventNoStyle(self): p = QPainter(self) opt = QStyleOptionToolButton() self.initStyleOption(opt) fm = QFontMetrics(opt.font) palette = opt.palette # highlight brush is used as the background for the icon and background # when the tab is expanded and as mouse hover color (lighter). brush_highlight = palette.highlight() if opt.state & QStyle.State_Sunken: # State 'down' pressed during a mouse press (slightly darker). background_brush = brush_darker(brush_highlight, 110) elif opt.state & QStyle.State_MouseOver: background_brush = brush_darker(brush_highlight, 95) elif opt.state & QStyle.State_On: background_brush = brush_highlight else: # The default button brush. background_brush = palette.button() rect = opt.rect icon = opt.icon icon_size = opt.iconSize # TODO: add shift for pressed as set by the style (PM_ButtonShift...) pm = None if not icon.isNull(): if opt.state & QStyle.State_Enabled: mode = QIcon.Normal else: mode = QIcon.Disabled pm = opt.icon.pixmap( rect.size().boundedTo(icon_size), mode, QIcon.On if opt.state & QStyle.State_On else QIcon.Off) icon_area_rect = QRect(rect) icon_area_rect.setRight(int(icon_area_rect.height() * 1.26)) text_rect = QRect(rect) text_rect.setLeft(icon_area_rect.right() + 10) # Background (TODO: Should the tab button have native # toolbutton shape, drawn using PE_PanelButtonTool or even # QToolBox tab shape) # Default outline pen pen = QPen(palette.color(QPalette.Mid)) p.save() p.setPen(Qt.NoPen) p.setBrush(QBrush(background_brush)) p.drawRect(rect) # Draw the background behind the icon if the background_brush # is different. if not opt.state & QStyle.State_On: p.setBrush(brush_highlight) p.drawRect(icon_area_rect) # Line between the icon and text p.setPen(pen) p.drawLine(icon_area_rect.topRight(), icon_area_rect.bottomRight()) if opt.state & QStyle.State_HasFocus: # Set the focus frame pen and draw the border pen = QPen(QColor(FOCUS_OUTLINE_COLOR)) p.setPen(pen) p.setBrush(Qt.NoBrush) # Adjust for pen rect = rect.adjusted(0, 0, -1, -1) p.drawRect(rect) else: p.setPen(pen) # Draw the top/bottom border if self.position == QStyleOptionToolBoxV2.OnlyOneTab or \ self.position == QStyleOptionToolBoxV2.Beginning or \ self.selected & \ QStyleOptionToolBoxV2.PreviousIsSelected: p.drawLine(rect.topLeft(), rect.topRight()) p.drawLine(rect.bottomLeft(), rect.bottomRight()) p.restore() p.save() text = fm.elidedText(opt.text, Qt.ElideRight, text_rect.width()) p.setPen(QPen(palette.color(QPalette.ButtonText))) p.setFont(opt.font) p.drawText(text_rect, int(Qt.AlignVCenter | Qt.AlignLeft) | \ int(Qt.TextSingleLine), text) if pm: pm_rect = QRect(QPoint(0, 0), pm.size()) centered_rect = QRect(pm_rect) centered_rect.moveCenter(icon_area_rect.center()) p.drawPixmap(centered_rect, pm, pm_rect) p.restore()