Windows11Style: Use pixmap cache for drawing CC_ScrollBar

Use a pixmap cache for CC_ScrollBar to avoid redundant paintings.

Change-Id: I677d6162a58e5fff9e53ad515e99436ea1546b0c
Reviewed-by: Axel Spoerl <axel.spoerl@qt.io>
Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
This commit is contained in:
Christian Ehrlicher 2024-09-21 19:59:30 +02:00
parent cd6608e887
commit 57f461e21a

View File

@ -471,6 +471,13 @@ void QWindows11Style::drawComplexControl(ComplexControl control, const QStyleOpt
#endif // QT_CONFIG(combobox) #endif // QT_CONFIG(combobox)
case CC_ScrollBar: case CC_ScrollBar:
if (const QStyleOptionSlider *scrollbar = qstyleoption_cast<const QStyleOptionSlider *>(option)) { if (const QStyleOptionSlider *scrollbar = qstyleoption_cast<const QStyleOptionSlider *>(option)) {
QCachedPainter cp(painter, QLatin1StringView("win11_scrollbar")
% HexString<uint8_t>(colorSchemeIndex)
% HexString<int>(scrollbar->minimum)
% HexString<int>(scrollbar->maximum)
% HexString<int>(scrollbar->sliderPosition),
scrollbar, scrollbar->rect.size());
if (cp.needsPainting()) {
const bool vertical = scrollbar->orientation == Qt::Vertical; const bool vertical = scrollbar->orientation == Qt::Vertical;
const bool horizontal = scrollbar->orientation == Qt::Horizontal; const bool horizontal = scrollbar->orientation == Qt::Horizontal;
const bool isMouseOver = state & State_MouseOver; const bool isMouseOver = state & State_MouseOver;
@ -486,14 +493,13 @@ void QWindows11Style::drawComplexControl(ComplexControl control, const QStyleOpt
rect.setHeight(rect.height() / 2); rect.setHeight(rect.height() / 2);
} }
rect.moveCenter(center); rect.moveCenter(center);
painter->setBrush(scrollbar->palette.base()); cp->setBrush(scrollbar->palette.base());
painter->setPen(Qt::NoPen); cp->setPen(Qt::NoPen);
painter->drawRoundedRect(rect, topLevelRoundingRadius, topLevelRoundingRadius); cp->drawRoundedRect(rect, topLevelRoundingRadius, topLevelRoundingRadius);
rect = rect.marginsRemoved(QMarginsF(0.5, 0.5, 0.5, 0.5)); rect = rect.marginsRemoved(QMarginsF(0.5, 0.5, 0.5, 0.5));
painter->setBrush(Qt::NoBrush); cp->setBrush(Qt::NoBrush);
painter->setPen(WINUI3Colors[colorSchemeIndex][frameColorLight]); cp->setPen(WINUI3Colors[colorSchemeIndex][frameColorLight]);
painter->drawRoundedRect(rect, topLevelRoundingRadius + 0.5, topLevelRoundingRadius + 0.5); cp->drawRoundedRect(rect, topLevelRoundingRadius + 0.5, topLevelRoundingRadius + 0.5);
} }
if (sub & SC_ScrollBarSlider) { if (sub & SC_ScrollBarSlider) {
QRectF rect = proxy()->subControlRect(CC_ScrollBar, option, SC_ScrollBarSlider, widget); QRectF rect = proxy()->subControlRect(CC_ScrollBar, option, SC_ScrollBarSlider, widget);
@ -503,30 +509,31 @@ void QWindows11Style::drawComplexControl(ComplexControl control, const QStyleOpt
else else
rect.setHeight(isMouseOver ? rect.height() / 2 : 1); rect.setHeight(isMouseOver ? rect.height() / 2 : 1);
rect.moveCenter(center); rect.moveCenter(center);
painter->setBrush(Qt::gray); cp->setBrush(Qt::gray);
painter->setPen(Qt::NoPen); cp->setPen(Qt::NoPen);
painter->drawRoundedRect(rect, secondLevelRoundingRadius, secondLevelRoundingRadius); cp->drawRoundedRect(rect, secondLevelRoundingRadius, secondLevelRoundingRadius);
} }
if (sub & SC_ScrollBarAddLine) { if (sub & SC_ScrollBarAddLine) {
if (isMouseOver) { if (isMouseOver) {
const QRectF rect = proxy()->subControlRect(CC_ScrollBar, option, SC_ScrollBarAddLine, widget); const QRectF rect = proxy()->subControlRect(CC_ScrollBar, option, SC_ScrollBarAddLine, widget);
QFont f(assetFont); QFont f = QFont(assetFont);
f.setPointSize(6); f.setPointSize(6);
painter->setFont(f); cp->setFont(f);
painter->setPen(Qt::gray); cp->setPen(Qt::gray);
const auto str = vertical ? QStringLiteral("\uEDDC") : QStringLiteral("\uEDDA"); const auto str = vertical ? QStringLiteral("\uEDDC") : QStringLiteral("\uEDDA");
painter->drawText(rect, str, Qt::AlignVCenter | Qt::AlignHCenter); cp->drawText(rect, str, Qt::AlignVCenter | Qt::AlignHCenter);
} }
} }
if (sub & SC_ScrollBarSubLine) { if (sub & SC_ScrollBarSubLine) {
if (isMouseOver) { if (isMouseOver) {
const QRectF rect = proxy()->subControlRect(CC_ScrollBar, option, SC_ScrollBarSubLine, widget); const QRectF rect = proxy()->subControlRect(CC_ScrollBar, option, SC_ScrollBarSubLine, widget);
QFont f(assetFont); QFont f = QFont(assetFont);
f.setPointSize(6); f.setPointSize(6);
painter->setFont(f); cp->setFont(f);
painter->setPen(Qt::gray); cp->setPen(Qt::gray);
const auto str = vertical ? QStringLiteral("\uEDDB") : QStringLiteral("\uEDD9"); const auto str = vertical ? QStringLiteral("\uEDDB") : QStringLiteral("\uEDD9");
painter->drawText(rect, str, Qt::AlignVCenter | Qt::AlignHCenter); cp->drawText(rect, str, Qt::AlignVCenter | Qt::AlignHCenter);
}
} }
} }
} }