QWindows11Style: Change appearance when Button is disabled/hovered

Fixes: QTBUG-126503
Fixes: QTBUG-125781
Pick-to: 6.7
Change-Id: Ib3e1ff2cab2c82c04445d238861766dd93237ce0
Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
(cherry picked from commit 3aca4589b06c6614538c9d96cd1c38e548499e82)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Wladimir Leuschner 2024-06-24 14:21:23 +02:00 committed by Qt Cherry-pick Bot
parent a6e399251a
commit 2a10643d44

View File

@ -47,6 +47,8 @@ enum WINUI3Color {
controlStrokeOnAccentSecondary, //Color of frame around Buttons in accent color controlStrokeOnAccentSecondary, //Color of frame around Buttons in accent color
controlFillSolid, //Color for solid fill controlFillSolid, //Color for solid fill
surfaceStroke, //Color of MDI window frames surfaceStroke, //Color of MDI window frames
controlAccentDisabled,
textAccentDisabled
}; };
const static QColor WINUI3ColorsLight [] { const static QColor WINUI3ColorsLight [] {
@ -66,6 +68,8 @@ const static QColor WINUI3ColorsLight [] {
QColor(0x00,0x00,0x00,0x66), //controlStrokeOnAccentSecondary QColor(0x00,0x00,0x00,0x66), //controlStrokeOnAccentSecondary
QColor(0xFF,0xFF,0xFF,0xFF), //controlFillSolid QColor(0xFF,0xFF,0xFF,0xFF), //controlFillSolid
QColor(0x75,0x75,0x75,0x66), //surfaceStroke QColor(0x75,0x75,0x75,0x66), //surfaceStroke
QColor(0x00,0x00,0x00,0x37), //controlAccentDisabled
QColor(0xFF,0xFF,0xFF,0xFF), //textAccentDisabled
}; };
const static QColor WINUI3ColorsDark[] { const static QColor WINUI3ColorsDark[] {
@ -85,6 +89,8 @@ const static QColor WINUI3ColorsDark[] {
QColor(0xFF,0xFF,0xFF,0x14), //controlStrokeOnAccentSecondary QColor(0xFF,0xFF,0xFF,0x14), //controlStrokeOnAccentSecondary
QColor(0x45,0x45,0x45,0xFF), //controlFillSolid QColor(0x45,0x45,0x45,0xFF), //controlFillSolid
QColor(0x75,0x75,0x75,0x66), //surfaceStroke QColor(0x75,0x75,0x75,0x66), //surfaceStroke
QColor(0xFF,0xFF,0xFF,0x28), //controlAccentDisabled
QColor(0xFF,0xFF,0xFF,0x87), //textAccentDisabled
}; };
const static QColor* WINUI3Colors[] { const static QColor* WINUI3Colors[] {
@ -1132,6 +1138,8 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op
const QString text = d->toolButtonElideText(toolbutton, rect, alignment); const QString text = d->toolButtonElideText(toolbutton, rect, alignment);
if (toolbutton->state & State_Raised || toolbutton->palette.isBrushSet(QPalette::Current, QPalette::ButtonText)) if (toolbutton->state & State_Raised || toolbutton->palette.isBrushSet(QPalette::Current, QPalette::ButtonText))
painter->setPen(QPen(toolbutton->palette.buttonText().color())); painter->setPen(QPen(toolbutton->palette.buttonText().color()));
else if (!(toolbutton->state & State_Enabled))
painter->setPen(flags & State_On ? QPen(WINUI3Colors[colorSchemeIndex][textAccentDisabled]) : QPen(toolbutton->palette.buttonText().color()));
else else
painter->setPen(QPen(WINUI3Colors[colorSchemeIndex][controlTextSecondary])); painter->setPen(QPen(WINUI3Colors[colorSchemeIndex][controlTextSecondary]));
proxy()->drawItemText(painter, rect, alignment, toolbutton->palette, proxy()->drawItemText(painter, rect, alignment, toolbutton->palette,
@ -1186,6 +1194,8 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op
const QString text = d->toolButtonElideText(toolbutton, tr, alignment); const QString text = d->toolButtonElideText(toolbutton, tr, alignment);
if (toolbutton->state & State_Raised || toolbutton->palette.isBrushSet(QPalette::Current, QPalette::ButtonText)) if (toolbutton->state & State_Raised || toolbutton->palette.isBrushSet(QPalette::Current, QPalette::ButtonText))
painter->setPen(QPen(toolbutton->palette.buttonText().color())); painter->setPen(QPen(toolbutton->palette.buttonText().color()));
else if (!(toolbutton->state & State_Enabled))
painter->setPen(flags & State_On ? QPen(WINUI3Colors[colorSchemeIndex][textAccentDisabled]) : QPen(toolbutton->palette.buttonText().color()));
else else
painter->setPen(QPen(WINUI3Colors[colorSchemeIndex][controlTextSecondary])); painter->setPen(QPen(WINUI3Colors[colorSchemeIndex][controlTextSecondary]));
proxy()->drawItemText(painter, QStyle::visualRect(toolbutton->direction, rect, tr), alignment, toolbutton->palette, proxy()->drawItemText(painter, QStyle::visualRect(toolbutton->direction, rect, tr), alignment, toolbutton->palette,
@ -1368,6 +1378,8 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op
if (btn->state & State_Sunken) if (btn->state & State_Sunken)
painter->setPen(flags & State_On ? QPen(WINUI3Colors[colorSchemeIndex][textOnAccentSecondary]) : QPen(WINUI3Colors[colorSchemeIndex][controlTextSecondary])); painter->setPen(flags & State_On ? QPen(WINUI3Colors[colorSchemeIndex][textOnAccentSecondary]) : QPen(WINUI3Colors[colorSchemeIndex][controlTextSecondary]));
else if (!(btn->state & State_Enabled))
painter->setPen(flags & State_On ? QPen(WINUI3Colors[colorSchemeIndex][textAccentDisabled]) : QPen(btn->palette.buttonText().color()));
else else
painter->setPen(flags & State_On ? QPen(WINUI3Colors[colorSchemeIndex][textOnAccentPrimary]) : QPen(btn->palette.buttonText().color())); painter->setPen(flags & State_On ? QPen(WINUI3Colors[colorSchemeIndex][textOnAccentPrimary]) : QPen(btn->palette.buttonText().color()));
proxy()->drawItemText(painter, textRect, tf, option->palette,btn->state & State_Enabled, btn->text); proxy()->drawItemText(painter, textRect, tf, option->palette,btn->state & State_Enabled, btn->text);
@ -1387,15 +1399,15 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op
} else { } else {
QRectF rect = btn->rect.marginsRemoved(QMargins(2,2,2,2)); QRectF rect = btn->rect.marginsRemoved(QMargins(2,2,2,2));
painter->setPen(Qt::NoPen); painter->setPen(Qt::NoPen);
painter->setBrush(flags & State_On ? option->palette.accent() : option->palette.button()); if (flags & (State_Sunken))
painter->setBrush(flags & State_On ? option->palette.accent().color().lighter(120) : WINUI3Colors[colorSchemeIndex][controlFillTertiary]);
else if (flags & State_MouseOver)
painter->setBrush(flags & State_On ? option->palette.accent().color().lighter(110) : WINUI3Colors[colorSchemeIndex][controlFillSecondary]);
else if (!(flags & State_Enabled))
painter->setBrush(flags & State_On ? WINUI3Colors[colorSchemeIndex][controlAccentDisabled] : option->palette.button());
else
painter->setBrush(flags & State_On ? option->palette.accent() : option->palette.button());
painter->drawRoundedRect(rect, secondLevelRoundingRadius, secondLevelRoundingRadius); painter->drawRoundedRect(rect, secondLevelRoundingRadius, secondLevelRoundingRadius);
if (flags.testFlags(State_Sunken | State_MouseOver)) {
if (flags & (State_Sunken))
painter->setBrush(flags & State_On ? option->palette.accent().color().lighter(120) : WINUI3Colors[colorSchemeIndex][controlFillTertiary]);
else if (flags & State_MouseOver)
painter->setBrush(flags & State_On ? option->palette.accent().color().lighter(110) : WINUI3Colors[colorSchemeIndex][controlFillSecondary]);
painter->drawRoundedRect(rect, secondLevelRoundingRadius, secondLevelRoundingRadius);
}
rect.adjust(0.5,0.5,-0.5,-0.5); rect.adjust(0.5,0.5,-0.5,-0.5);
painter->setBrush(Qt::NoBrush); painter->setBrush(Qt::NoBrush);
@ -2057,6 +2069,17 @@ void QWindows11Style::polish(QWidget* widget)
} }
} else if (widget->inherits("QAbstractButton") || widget->inherits("QToolButton")) { } else if (widget->inherits("QAbstractButton") || widget->inherits("QToolButton")) {
widget->setAutoFillBackground(false); widget->setAutoFillBackground(false);
auto pal = widget->palette();
if (colorSchemeIndex == 0) {
pal.setColor(QPalette::Disabled, QPalette::ButtonText, QColor(0x00,0x00,0x00,0x5C));
pal.setColor(QPalette::Disabled, QPalette::Button, QColor(0xF9,0xF9,0xF9,0x4D));
}
else {
pal.setColor(QPalette::Disabled, QPalette::ButtonText, QColor(0xFF,0xFF,0xFF,0x87));
pal.setColor(QPalette::Disabled, QPalette::Button, QColor(0xFF,0xFF,0xFF,0x6B));
}
widget->setPalette(pal);
} else if (qobject_cast<QGraphicsView *>(widget) && !qobject_cast<QTextEdit *>(widget)) { } else if (qobject_cast<QGraphicsView *>(widget) && !qobject_cast<QTextEdit *>(widget)) {
QPalette pal = widget->palette(); QPalette pal = widget->palette();
pal.setColor(QPalette::Base, pal.window().color()); pal.setColor(QPalette::Base, pal.window().color());