Add custom rendering of tab close buttons

This commit is contained in:
baldurk
2017-07-28 19:06:41 +01:00
parent 2dc577a02c
commit 6cedd3755b
2 changed files with 83 additions and 5 deletions
+74
View File
@@ -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);
}
+9 -5
View File
@@ -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:
};