From 6cedd3755b9243334483a4afd0d0566a0b85a468 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 19 Jul 2017 18:27:13 +0100 Subject: [PATCH] Add custom rendering of tab close buttons --- qrenderdoc/Styles/RDStyle/RDStyle.cpp | 74 +++++++++++++++++++++++++++ qrenderdoc/Styles/RDStyle/RDStyle.h | 14 +++-- 2 files changed, 83 insertions(+), 5 deletions(-) diff --git a/qrenderdoc/Styles/RDStyle/RDStyle.cpp b/qrenderdoc/Styles/RDStyle/RDStyle.cpp index 64c5aacfb..2441afae5 100644 --- a/qrenderdoc/Styles/RDStyle/RDStyle.cpp +++ b/qrenderdoc/Styles/RDStyle/RDStyle.cpp @@ -36,6 +36,23 @@ RDStyle::~RDStyle() { } +QRect RDStyle::subElementRect(SubElement element, const QStyleOption *opt, const QWidget *widget) const +{ + QRect ret = QProxyStyle::subElementRect(element, opt, widget); + + if(element == QStyle::SE_DockWidgetCloseButton || element == QStyle::SE_DockWidgetFloatButton) + { + int width = pixelMetric(QStyle::PM_TabCloseIndicatorWidth, opt, widget); + int height = pixelMetric(QStyle::PM_TabCloseIndicatorHeight, opt, widget); + + QPoint c = ret.center(); + ret.setSize(QSize(width, height)); + ret.moveCenter(c); + } + + return ret; +} + QSize RDStyle::sizeFromContents(ContentsType type, const QStyleOption *opt, const QSize &size, const QWidget *widget) const { @@ -64,6 +81,19 @@ int RDStyle::pixelMetric(PixelMetric metric, const QStyleOption *opt, const QWid return QProxyStyle::pixelMetric(metric, opt, widget); } +QIcon RDStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption *opt, + const QWidget *widget) const +{ + if(standardIcon == QStyle::SP_TitleBarCloseButton) + { + int sz = pixelMetric(QStyle::PM_SmallIconSize); + + return QIcon(QPixmap(QSize(sz, sz))); + } + + return QProxyStyle::standardIcon(standardIcon, opt, widget); +} + void RDStyle::drawComplexControl(ComplexControl control, const QStyleOptionComplex *opt, QPainter *p, const QWidget *widget) const { @@ -214,6 +244,50 @@ void RDStyle::drawPrimitive(PrimitiveElement element, const QStyleOption *opt, Q p->setPen(oldPen); return; } + else if(element == PE_IndicatorTabClose) + { + QPen oldPen = p->pen(); + bool aa = p->testRenderHint(QPainter::Antialiasing); + p->setRenderHint(QPainter::Antialiasing); + + QColor col = opt->palette.color(QPalette::Text); + + QRectF rect = opt->rect.adjusted(1, 1, -1, -1); + + if(opt->state & (QStyle::State_Raised | QStyle::State_Sunken | QStyle::State_MouseOver)) + { + QPointF c = rect.center(); + qreal radius = rect.width() / 2.0; + + col = opt->palette.color(QPalette::Base); + + QPainterPath path; + + path.addEllipse(c, radius, radius); + + QColor fillCol = QColor(Qt::red).darker(120); + + if(opt->state & QStyle::State_Sunken) + fillCol = fillCol.darker(120); + + p->fillPath(path, fillCol); + } + + p->setPen(QPen(col, 1.5)); + + QPointF c = rect.center(); + + qreal crossrad = rect.width() / 4.0; + + p->drawLine(c + QPointF(-crossrad, -crossrad), c + QPointF(crossrad, crossrad)); + p->drawLine(c + QPointF(-crossrad, crossrad), c + QPointF(crossrad, -crossrad)); + + p->setPen(oldPen); + if(!aa) + p->setRenderHint(QPainter::Antialiasing, false); + + return; + } QProxyStyle::drawPrimitive(element, opt, p, widget); } diff --git a/qrenderdoc/Styles/RDStyle/RDStyle.h b/qrenderdoc/Styles/RDStyle/RDStyle.h index a2ca597e9..cdba30e2a 100644 --- a/qrenderdoc/Styles/RDStyle/RDStyle.h +++ b/qrenderdoc/Styles/RDStyle/RDStyle.h @@ -40,16 +40,20 @@ public: RDStyle(ColorScheme scheme); ~RDStyle(); + QRect subElementRect(SubElement element, const QStyleOption *option, + const QWidget *widget) const override; QSize sizeFromContents(ContentsType type, const QStyleOption *option, const QSize &size, const QWidget *widget) const override; - int pixelMetric(PixelMetric metric, const QStyleOption *option, - const QWidget *widget) const override; + int pixelMetric(PixelMetric metric, const QStyleOption *option = NULL, + const QWidget *widget = NULL) const override; + QIcon standardIcon(StandardPixmap standardIcon, const QStyleOption *option = NULL, + const QWidget *widget = NULL) const override; void drawComplexControl(ComplexControl control, const QStyleOptionComplex *option, - QPainter *painter, const QWidget *widget) const override; + QPainter *painter, const QWidget *widget = NULL) const override; void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, - const QWidget *widget) const override; + const QWidget *widget = NULL) const override; void drawControl(ControlElement control, const QStyleOption *option, QPainter *painter, - const QWidget *widget) const override; + const QWidget *widget = NULL) const override; protected: };