diff options
Diffstat (limited to 'src/plugins/styles/modernwindows/qwindows11style.cpp')
-rw-r--r-- | src/plugins/styles/modernwindows/qwindows11style.cpp | 390 |
1 files changed, 224 insertions, 166 deletions
diff --git a/src/plugins/styles/modernwindows/qwindows11style.cpp b/src/plugins/styles/modernwindows/qwindows11style.cpp index f352b7e1af..63663c74aa 100644 --- a/src/plugins/styles/modernwindows/qwindows11style.cpp +++ b/src/plugins/styles/modernwindows/qwindows11style.cpp @@ -9,6 +9,17 @@ #include <qstyleoption.h> #include <qpainter.h> #include <QGraphicsDropShadowEffect> +#include <QLatin1StringView> +#include <QtWidgets/qcombobox.h> +#include <QtWidgets/qcommandlinkbutton.h> +#include <QtWidgets/qgraphicsview.h> +#include <QtWidgets/qlistview.h> +#include <QtWidgets/qmenu.h> +#if QT_CONFIG(mdiarea) +#include <QtWidgets/qmdiarea.h> +#endif +#include <QtWidgets/qtextedit.h> +#include <QtWidgets/qtreeview.h> #include "qdrawutil.h" #include <chrono> @@ -17,6 +28,7 @@ QT_BEGIN_NAMESPACE const static int topLevelRoundingRadius = 8; //Radius for toplevel items like popups for round corners const static int secondLevelRoundingRadius = 4; //Radius for second level items like hovered menu item round corners +constexpr QLatin1StringView originalWidthProperty("_q_windows11_style_original_width"); enum WINUI3Color { subtleHighlightColor, //Subtle highlight based on alpha used for hovered elements @@ -126,6 +138,8 @@ static void drawArrow(const QStyle *style, const QStyleOptionToolButton *toolbut */ QWindows11Style::QWindows11Style() : QWindowsVistaStyle(*new QWindows11StylePrivate) { + highContrastTheme = QGuiApplicationPrivate::styleHints->colorScheme() == Qt::ColorScheme::Unknown; + colorSchemeIndex = QGuiApplicationPrivate::styleHints->colorScheme() == Qt::ColorScheme::Light ? 0 : 1; } /*! @@ -134,6 +148,8 @@ QWindows11Style::QWindows11Style() : QWindowsVistaStyle(*new QWindows11StylePriv */ QWindows11Style::QWindows11Style(QWindows11StylePrivate &dd) : QWindowsVistaStyle(dd) { + highContrastTheme = QGuiApplicationPrivate::styleHints->colorScheme() == Qt::ColorScheme::Unknown; + colorSchemeIndex = QGuiApplicationPrivate::styleHints->colorScheme() == Qt::ColorScheme::Light ? 0 : 1; } /*! @@ -426,12 +442,21 @@ void QWindows11Style::drawComplexControl(ComplexControl control, const QStyleOpt #if QT_CONFIG(combobox) case CC_ComboBox: if (const QStyleOptionComboBox *combobox = qstyleoption_cast<const QStyleOptionComboBox *>(option)) { - QBrush fillColor = state & State_MouseOver && !(state & State_HasFocus) ? QBrush(WINUI3Colors[colorSchemeIndex][subtleHighlightColor]) : option->palette.brush(QPalette::Base); + QBrush fillColor = combobox->palette.brush(QPalette::Base); QRectF rect = option->rect.adjusted(2,2,-2,-2); painter->setBrush(fillColor); painter->setPen(Qt::NoPen); painter->drawRoundedRect(rect, secondLevelRoundingRadius, secondLevelRoundingRadius); + // In case the QComboBox is hovered overdraw the background with a alpha mask to + // highlight the QComboBox. + if (state & State_MouseOver) { + fillColor = QBrush(WINUI3Colors[colorSchemeIndex][subtleHighlightColor]); + painter->setBrush(fillColor); + painter->setPen(Qt::NoPen); + painter->drawRoundedRect(rect, secondLevelRoundingRadius, secondLevelRoundingRadius); + } + rect.adjust(0.5,0.5,-0.5,-0.5); painter->setBrush(Qt::NoBrush); painter->setPen(highContrastTheme == true ? combobox->palette.buttonText().color() : WINUI3Colors[colorSchemeIndex][frameColorLight]); @@ -897,12 +922,20 @@ void QWindows11Style::drawPrimitive(PrimitiveElement element, const QStyleOption if (widget && widget->objectName() == "qt_spinbox_lineedit") break; if (const auto *panel = qstyleoption_cast<const QStyleOptionFrame *>(option)) { - QBrush fillColor = state & State_MouseOver && !(state & State_HasFocus) ? QBrush(WINUI3Colors[colorSchemeIndex][subtleHighlightColor]) : option->palette.brush(QPalette::Base); - painter->setBrush(fillColor); - painter->setPen(Qt::NoPen); QRectF frameRect = option->rect; frameRect.adjust(0.5,0.5,-0.5,-0.5); + QBrush fillColor = option->palette.brush(QPalette::Base); + painter->setBrush(fillColor); + painter->setPen(Qt::NoPen); painter->drawRoundedRect(frameRect, secondLevelRoundingRadius, secondLevelRoundingRadius); + // In case the QLineEdit is hovered overdraw the background with a alpha mask to + // highlight the QLineEdit. + if (state & State_MouseOver && !(state & State_HasFocus)) { + fillColor = QBrush(WINUI3Colors[colorSchemeIndex][subtleHighlightColor]); + painter->setBrush(fillColor); + painter->setPen(Qt::NoPen); + painter->drawRoundedRect(frameRect, secondLevelRoundingRadius, secondLevelRoundingRadius); + } if (panel->lineWidth > 0) proxy()->drawPrimitive(PE_FrameLineEdit, panel, painter, widget); } @@ -938,7 +971,7 @@ void QWindows11Style::drawPrimitive(PrimitiveElement element, const QStyleOption painter->setPen(QPen(WINUI3Colors[colorSchemeIndex][frameColorLight])); painter->drawRoundedRect(rect.marginsRemoved(QMarginsF(0.5,0.5,0.5,0.5)), secondLevelRoundingRadius, secondLevelRoundingRadius); - if (widget && widget->inherits("QTextEdit")) { + if (qobject_cast<const QTextEdit *>(widget)) { QRegion clipRegion = option->rect; QColor lineColor = state & State_HasFocus ? option->palette.accent().color() : QColor(0,0,0,255); painter->setPen(QPen(lineColor)); @@ -953,7 +986,7 @@ void QWindows11Style::drawPrimitive(PrimitiveElement element, const QStyleOption painter->setBrush(WINUI3Colors[colorSchemeIndex][subtleHighlightColor]); painter->setPen(Qt::NoPen); painter->drawRoundedRect(vopt->rect.marginsRemoved(QMargins(0,2,-2,2)),2,2); - int offset = (widget && widget->inherits("QTreeView")) ? 2 : 0; + const int offset = qobject_cast<const QTreeView *>(widget) ? 2 : 0; if (vopt->viewItemPosition == QStyleOptionViewItem::Beginning && option->state & State_Selected) { painter->setPen(QPen(option->palette.accent().color())); painter->drawLine(option->rect.x(),option->rect.y()+offset,option->rect.x(),option->rect.y() + option->rect.height()-2); @@ -1096,7 +1129,7 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op rect.translate(shiftX, shiftY); painter->setFont(toolbutton->font); const QString text = d->toolButtonElideText(toolbutton, rect, alignment); - if (toolbutton->state & State_Raised) + if (toolbutton->state & State_Raised || toolbutton->palette.isBrushSet(QPalette::Current, QPalette::ButtonText)) painter->setPen(QPen(toolbutton->palette.buttonText().color())); else painter->setPen(QPen(WINUI3Colors[colorSchemeIndex][controlTextSecondary])); @@ -1150,7 +1183,7 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op } tr.translate(shiftX, shiftY); const QString text = d->toolButtonElideText(toolbutton, tr, alignment); - if (toolbutton->state & State_Raised) + if (toolbutton->state & State_Raised || toolbutton->palette.isBrushSet(QPalette::Current, QPalette::ButtonText)) painter->setPen(QPen(toolbutton->palette.buttonText().color())); else painter->setPen(QPen(WINUI3Colors[colorSchemeIndex][controlTextSecondary])); @@ -1199,75 +1232,72 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op break; case QStyle::CE_ProgressBarGroove:{ if (const QStyleOptionProgressBar* progbaropt = qstyleoption_cast<const QStyleOptionProgressBar*>(option)) { - if (const QProgressBar* bar = qobject_cast<const QProgressBar*>(widget)) { - QRect rect = subElementRect(SE_ProgressBarContents, progbaropt, widget); - QPointF center = rect.center(); - if (bar->orientation() & Qt::Horizontal) { - rect.setHeight(1); - rect.moveTop(center.y()); - } else { - rect.setWidth(1); - rect.moveLeft(center.x()); - } - painter->setPen(Qt::NoPen); - painter->setBrush(Qt::gray); - painter->drawRect(rect); + QRect rect = subElementRect(SE_ProgressBarContents, progbaropt, widget); + QPointF center = rect.center(); + if (progbaropt->state & QStyle::State_Horizontal) { + rect.setHeight(1); + rect.moveTop(center.y()); + } else { + rect.setWidth(1); + rect.moveLeft(center.x()); } + painter->setPen(Qt::NoPen); + painter->setBrush(Qt::gray); + painter->drawRect(rect); } break; } case QStyle::CE_ProgressBarContents: if (const QStyleOptionProgressBar* progbaropt = qstyleoption_cast<const QStyleOptionProgressBar*>(option)) { - if (const QProgressBar* bar = qobject_cast<const QProgressBar*>(widget)) { - const qreal progressBarThickness = 3; - const qreal progressBarHalfThickness = progressBarThickness / 2.0; - QRectF rect = subElementRect(SE_ProgressBarContents, progbaropt, widget); - QRectF originalRect = rect; - QPointF center = rect.center(); - bool isIndeterminate = progbaropt->maximum == 0 && progbaropt->minimum == 0; - float fillPercentage = 0; - const qreal offset = (bar->orientation() == Qt::Horizontal && int(rect.height()) % 2 == 0) - || (bar->orientation() == Qt::Vertical && int(rect.width()) % 2 == 0) ? 0.5 : 0.0; - - if (!isIndeterminate) { - fillPercentage = ((float(progbaropt->progress) - float(progbaropt->minimum)) / (float(progbaropt->maximum) - float(progbaropt->minimum))); - if (bar->orientation() == Qt::Horizontal) { - rect.setHeight(progressBarThickness); - rect.moveTop(center.y() - progressBarHalfThickness - offset); - rect.setWidth(rect.width() * fillPercentage); - } else { - float oldHeight = rect.height(); - rect.setWidth(progressBarThickness); - rect.moveLeft(center.x() - progressBarHalfThickness - offset); - rect.moveTop(oldHeight * (1.0f - fillPercentage)); - rect.setHeight(oldHeight * fillPercentage); - } + const qreal progressBarThickness = 3; + const qreal progressBarHalfThickness = progressBarThickness / 2.0; + QRectF rect = subElementRect(SE_ProgressBarContents, progbaropt, widget); + QRectF originalRect = rect; + QPointF center = rect.center(); + bool isIndeterminate = progbaropt->maximum == 0 && progbaropt->minimum == 0; + float fillPercentage = 0; + const Qt::Orientation orientation = (progbaropt->state & QStyle::State_Horizontal) ? Qt::Horizontal : Qt::Vertical; + const qreal offset = (orientation == Qt::Horizontal && int(rect.height()) % 2 == 0) + || (orientation == Qt::Vertical && int(rect.width()) % 2 == 0) ? 0.5 : 0.0; + + if (!isIndeterminate) { + fillPercentage = ((float(progbaropt->progress) - float(progbaropt->minimum)) / (float(progbaropt->maximum) - float(progbaropt->minimum))); + if (orientation == Qt::Horizontal) { + rect.setHeight(progressBarThickness); + rect.moveTop(center.y() - progressBarHalfThickness - offset); + rect.setWidth(rect.width() * fillPercentage); } else { - auto elapsedTime = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now()); - fillPercentage = (elapsedTime.time_since_epoch().count() % 5000)/(5000.0f*0.75); - if (bar->orientation() == Qt::Horizontal) { - float barBegin = qMin(qMax(fillPercentage-0.25,0.0) * rect.width(), float(rect.width())); - float barEnd = qMin(fillPercentage * rect.width(), float(rect.width())); - rect = QRect(QPoint(rect.left() + barBegin, rect.top()), QPoint(rect.left() + barEnd, rect.bottom())); - rect.setHeight(progressBarThickness); - rect.moveTop(center.y() - progressBarHalfThickness - offset); - } else { - float barBegin = qMin(qMax(fillPercentage-0.25,0.0) * rect.height(), float(rect.height())); - float barEnd = qMin(fillPercentage * rect.height(), float(rect.height())); - rect = QRect(QPoint(rect.left(), rect.bottom() - barEnd), QPoint(rect.right(), rect.bottom() - barBegin)); - rect.setWidth(progressBarThickness); - rect.moveLeft(center.x() - progressBarHalfThickness - offset); - } - const_cast<QWidget*>(widget)->update(); + float oldHeight = rect.height(); + rect.setWidth(progressBarThickness); + rect.moveLeft(center.x() - progressBarHalfThickness - offset); + rect.moveTop(oldHeight * (1.0f - fillPercentage)); + rect.setHeight(oldHeight * fillPercentage); } - if (progbaropt->invertedAppearance && bar->orientation() == Qt::Horizontal) - rect.moveLeft(originalRect.width() * (1.0 - fillPercentage)); - else if (progbaropt->invertedAppearance && bar->orientation() == Qt::Vertical) - rect.moveBottom(originalRect.height() * fillPercentage); - painter->setPen(Qt::NoPen); - painter->setBrush(progbaropt->palette.accent()); - painter->drawRoundedRect(rect, secondLevelRoundingRadius, secondLevelRoundingRadius); + } else { + auto elapsedTime = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now()); + fillPercentage = (elapsedTime.time_since_epoch().count() % 5000)/(5000.0f*0.75); + if (orientation == Qt::Horizontal) { + float barBegin = qMin(qMax(fillPercentage-0.25,0.0) * rect.width(), float(rect.width())); + float barEnd = qMin(fillPercentage * rect.width(), float(rect.width())); + rect = QRect(QPoint(rect.left() + barBegin, rect.top()), QPoint(rect.left() + barEnd, rect.bottom())); + rect.setHeight(progressBarThickness); + rect.moveTop(center.y() - progressBarHalfThickness - offset); + } else { + float barBegin = qMin(qMax(fillPercentage-0.25,0.0) * rect.height(), float(rect.height())); + float barEnd = qMin(fillPercentage * rect.height(), float(rect.height())); + rect = QRect(QPoint(rect.left(), rect.bottom() - barEnd), QPoint(rect.right(), rect.bottom() - barBegin)); + rect.setWidth(progressBarThickness); + rect.moveLeft(center.x() - progressBarHalfThickness - offset); + } + const_cast<QWidget*>(widget)->update(); } + if (progbaropt->invertedAppearance && orientation == Qt::Horizontal) + rect.moveLeft(originalRect.width() * (1.0 - fillPercentage)); + else if (progbaropt->invertedAppearance && orientation == Qt::Vertical) + rect.moveBottom(originalRect.height() * fillPercentage); + painter->setPen(Qt::NoPen); + painter->setBrush(progbaropt->palette.accent()); + painter->drawRoundedRect(rect, secondLevelRoundingRadius, secondLevelRoundingRadius); } break; case QStyle::CE_ProgressBarLabel: @@ -1356,13 +1386,15 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op } else { QRectF rect = btn->rect.marginsRemoved(QMargins(2,2,2,2)); painter->setPen(Qt::NoPen); - 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 - painter->setBrush(flags & State_On ? option->palette.accent() : option->palette.button()); + painter->setBrush(flags & State_On ? option->palette.accent() : option->palette.button()); 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); painter->setBrush(Qt::NoBrush); @@ -1570,7 +1602,13 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op break; case CE_HeaderSection: { if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(option)) { + painter->setPen(Qt::NoPen); + painter->setBrush(header->palette.button()); + painter->drawRect(header->rect); + painter->setPen(highContrastTheme == true ? header->palette.buttonText().color() : WINUI3Colors[colorSchemeIndex][frameColorLight]); + painter->setBrush(Qt::NoBrush); + if (header->position == QStyleOptionHeader::OnlyOneSection) { break; } @@ -1594,7 +1632,7 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op } case QStyle::CE_ItemViewItem: { if (const QStyleOptionViewItem *vopt = qstyleoption_cast<const QStyleOptionViewItem *>(option)) { - if (const QAbstractItemView *view = qobject_cast<const QAbstractItemView *>(widget)) { + if (const QAbstractItemView *view = qobject_cast<const QAbstractItemView *>(widget)) { QRect checkRect = proxy()->subElementRect(SE_ItemViewItemCheckIndicator, vopt, widget); QRect iconRect = proxy()->subElementRect(SE_ItemViewItemDecoration, vopt, widget); QRect textRect = proxy()->subElementRect(SE_ItemViewItemText, vopt, widget); @@ -1617,11 +1655,11 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op } painter->setPen(QPen(option->palette.buttonText().color())); - bool isTreeView = widget && widget->inherits("QTreeView"); + const bool isTreeView = qobject_cast<const QTreeView *>(widget); if ((vopt->state & State_Selected || vopt->state & State_MouseOver) && !(isTreeView && vopt->state & State_MouseOver) && vopt->showDecorationSelected) { painter->setBrush(WINUI3Colors[colorSchemeIndex][subtleHighlightColor]); - QWidget *editorWidget = view->indexWidget(view->currentIndex()); + QWidget *editorWidget = view ? view->indexWidget(view->currentIndex()) : nullptr; if (editorWidget) { QPalette pal = editorWidget->palette(); QColor editorBgColor = vopt->backgroundBrush == Qt::NoBrush ? vopt->palette.color(widget->backgroundRole()) : vopt->backgroundBrush.color(); @@ -1674,13 +1712,19 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op vopt->icon.paint(painter, iconRect, vopt->decorationAlignment, mode, state); painter->setPen(QPen(option->palette.buttonText().color())); - if (!view->isPersistentEditorOpen(vopt->index)) + if (!view || !view->isPersistentEditorOpen(vopt->index)) d->viewItemDrawText(painter, vopt, textRect); - if (vopt->state & State_Selected && (vopt->viewItemPosition == QStyleOptionViewItem::Beginning || vopt->viewItemPosition == QStyleOptionViewItem::OnlyOne || vopt->viewItemPosition == QStyleOptionViewItem::Invalid)) { - if (widget && widget->inherits("QListView") && qobject_cast<const QListView*>(widget)->viewMode() != QListView::IconMode) { + if (vopt->state & State_Selected + && (vopt->viewItemPosition == QStyleOptionViewItem::Beginning + || vopt->viewItemPosition == QStyleOptionViewItem::OnlyOne + || vopt->viewItemPosition == QStyleOptionViewItem::Invalid)) { + if (const QListView *lv = qobject_cast<const QListView *>(widget); + lv && lv->viewMode() != QListView::IconMode) { painter->setPen(QPen(vopt->palette.accent().color())); - painter->drawLine(option->rect.x(),option->rect.y()+2,option->rect.x(),option->rect.y() + option->rect.height()-2); - painter->drawLine(option->rect.x()+1,option->rect.y()+2,option->rect.x()+1,option->rect.y() + option->rect.height()-2); + painter->drawLine(option->rect.x(), option->rect.y() + 2, + option->rect.x(),option->rect.y() + option->rect.height() - 2); + painter->drawLine(option->rect.x() + 1, option->rect.y() + 2, + option->rect.x() + 1,option->rect.y() + option->rect.height() - 2); } } } @@ -1702,6 +1746,10 @@ int QWindows11Style::styleHint(StyleHint hint, const QStyleOption *opt, return 0; case QStyle::SH_ItemView_ShowDecorationSelected: return 1; + case QStyle::SH_Slider_AbsoluteSetButtons: + return Qt::LeftButton; + case QStyle::SH_Slider_PageSetButtons: + return 0; default: return QWindowsVistaStyle::styleHint(hint, opt, widget, returnData); } @@ -1718,9 +1766,9 @@ QRect QWindows11Style::subElementRect(QStyle::SubElement element, const QStyleOp case QStyle::SE_ItemViewItemText: if (const auto *item = qstyleoption_cast<const QStyleOptionViewItem *>(option)) { const int decorationOffset = item->features.testFlag(QStyleOptionViewItem::HasDecoration) ? item->decorationSize.width() : 0; - if (widget && widget->parentWidget() && - widget->parentWidget()->inherits("QComboBoxPrivateContainer")) { - ret = option->rect.adjusted(decorationOffset + 5, 0, -5, 0); + if (widget && widget->parentWidget() + && widget->parentWidget()->inherits("QComboBoxPrivateContainer")) { + ret = option->rect.adjusted(decorationOffset + 5, 0, -5, 0); } else { ret = QWindowsVistaStyle::subElementRect(element, option, widget); } @@ -1975,7 +2023,8 @@ int QWindows11Style::pixelMetric(PixelMetric metric, const QStyleOption *option, void QWindows11Style::polish(QWidget* widget) { QWindowsVistaStyle::polish(widget); - if (widget->inherits("QScrollBar") || widget->inherits("QComboBoxPrivateContainer") || widget->inherits("QMenu")) { + const bool isScrollBar = qobject_cast<QScrollBar *>(widget); + if (isScrollBar || qobject_cast<QMenu *>(widget) || widget->inherits("QComboBoxPrivateContainer")) { bool wasCreated = widget->testAttribute(Qt::WA_WState_Created); bool layoutDirection = widget->testAttribute(Qt::WA_RightToLeft); widget->setAttribute(Qt::WA_OpaquePaintEvent,false); @@ -1987,37 +2036,43 @@ void QWindows11Style::polish(QWidget* widget) auto pal = widget->palette(); pal.setColor(widget->backgroundRole(), Qt::transparent); widget->setPalette(pal); - } - if (widget->inherits("QComboBoxPrivateContainer") || widget->inherits("QMenu")) { - QGraphicsDropShadowEffect* dropshadow = new QGraphicsDropShadowEffect(widget); - dropshadow->setBlurRadius(3); - dropshadow->setXOffset(3); - dropshadow->setYOffset(3); - widget->setGraphicsEffect(dropshadow); - } - if (widget->inherits("QComboBox")) { - - QComboBox* cb = qobject_cast<QComboBox*>(widget); + if (!isScrollBar) { // for menus and combobox containers... + QGraphicsDropShadowEffect* dropshadow = new QGraphicsDropShadowEffect(widget); + dropshadow->setBlurRadius(3); + dropshadow->setXOffset(3); + dropshadow->setYOffset(3); + widget->setGraphicsEffect(dropshadow); + } + } else if (QComboBox* cb = qobject_cast<QComboBox*>(widget)) { if (cb->isEditable()) { QLineEdit *le = cb->lineEdit(); le->setFrame(false); } - } - if (widget->inherits("QGraphicsView") && !widget->inherits("QTextEdit")) { + } else if (widget->inherits("QAbstractSpinBox")) { + const int minWidth = 2 * 24 + 40; + const int originalWidth = widget->size().width(); + if (originalWidth < minWidth) { + widget->resize(minWidth, widget->size().height()); + widget->setProperty(originalWidthProperty.constData(), originalWidth); + } + } else if (widget->inherits("QAbstractButton") || widget->inherits("QToolButton")) { + widget->setAutoFillBackground(false); + } else if (qobject_cast<QGraphicsView *>(widget) && !qobject_cast<QTextEdit *>(widget)) { QPalette pal = widget->palette(); pal.setColor(QPalette::Base, pal.window().color()); widget->setPalette(pal); - } - else if (widget->inherits("QAbstractScrollArea") && !widget->inherits("QMdiArea")) { - if (const auto *scrollarea = qobject_cast<QAbstractScrollArea *>(widget)) { - QPalette pal = widget->palette(); - QColor backgroundColor = widget->palette().base().color(); - backgroundColor.setAlpha(255); - pal.setColor(scrollarea->viewport()->backgroundRole(), backgroundColor); - scrollarea->viewport()->setPalette(pal); - } - } - if (widget->inherits("QCommandLinkButton")) { + } else if (const auto *scrollarea = qobject_cast<QAbstractScrollArea *>(widget); + scrollarea +#if QT_CONFIG(mdiarea) + && !qobject_cast<QMdiArea *>(widget) +#endif + ) { + QPalette pal = scrollarea->viewport()->palette(); + const QPalette originalPalette = pal; + pal.setColor(scrollarea->viewport()->backgroundRole(), Qt::transparent); + scrollarea->viewport()->setPalette(pal); + scrollarea->viewport()->setProperty("_q_original_background_palette", originalPalette); + } else if (qobject_cast<QCommandLinkButton *>(widget)) { widget->setProperty("_qt_usingVistaStyle",false); QPalette pal = widget->palette(); pal.setColor(QPalette::ButtonText, pal.text().color()); @@ -2026,53 +2081,61 @@ void QWindows11Style::polish(QWidget* widget) } } +void QWindows11Style::unpolish(QWidget *widget) +{ + QWindowsVistaStyle::unpolish(widget); + if (const auto *scrollarea = qobject_cast<QAbstractScrollArea *>(widget); + scrollarea +#if QT_CONFIG(mdiarea) + && !qobject_cast<QMdiArea *>(widget) +#endif + ) { + const QPalette pal = scrollarea->viewport()->property("_q_original_background_palette").value<QPalette>(); + scrollarea->viewport()->setPalette(pal); + scrollarea->viewport()->setProperty("_q_original_background_palette", QVariant()); + } + if (widget->inherits("QAbstractSpinBox")) { + const QVariant originalWidth = widget->property(originalWidthProperty.constData()); + if (originalWidth.isValid()) { + widget->resize(originalWidth.toInt(), widget->size().height()); + widget->setProperty(originalWidthProperty.constData(), QVariant()); + } + } +} /* The colors for Windows 11 are taken from the official WinUI3 Figma style at https://www.figma.com/community/file/1159947337437047524 */ +#define SET_IF_UNRESOLVED(GROUP, ROLE, VALUE) \ + if (!result.isBrushSet(QPalette::Inactive, ROLE) || styleSheetChanged) \ + result.setColor(GROUP, ROLE, VALUE) + static void populateLightSystemBasePalette(QPalette &result) { static QString oldStyleSheet; const bool styleSheetChanged = oldStyleSheet != qApp->styleSheet(); - QPalette standardPalette = QApplication::palette(); const QColor textColor = QColor(0x00,0x00,0x00,0xE4); - const QColor btnFace = QColor(0xFF,0xFF,0xFF,0xB3); const QColor btnHighlight = result.accent().color(); const QColor btnColor = result.button().color(); - if (standardPalette.color(QPalette::Highlight) == result.color(QPalette::Highlight) || styleSheetChanged) - result.setColor(QPalette::Highlight, btnHighlight); - if (standardPalette.color(QPalette::WindowText) == result.color(QPalette::WindowText) || styleSheetChanged) - result.setColor(QPalette::WindowText, textColor); - if (standardPalette.color(QPalette::Button) == result.color(QPalette::Button) || styleSheetChanged) - result.setColor(QPalette::Button, btnFace); - if (standardPalette.color(QPalette::Light) == result.color(QPalette::Light) || styleSheetChanged) - result.setColor(QPalette::Light, btnColor.lighter(150)); - if (standardPalette.color(QPalette::Dark) == result.color(QPalette::Dark) || styleSheetChanged) - result.setColor(QPalette::Dark, btnColor.darker(200)); - if (standardPalette.color(QPalette::Mid) == result.color(QPalette::Mid) || styleSheetChanged) - result.setColor(QPalette::Mid, btnColor.darker(150)); - if (standardPalette.color(QPalette::Text) == result.color(QPalette::Text) || styleSheetChanged) - result.setColor(QPalette::Text, textColor); - if (standardPalette.color(QPalette::BrightText) != result.color(QPalette::BrightText) || styleSheetChanged) - result.setColor(QPalette::BrightText, btnHighlight); - if (standardPalette.color(QPalette::Base) == result.color(QPalette::Base) || styleSheetChanged) - result.setColor(QPalette::Base, btnFace); - if (standardPalette.color(QPalette::Window) == result.color(QPalette::Window) || styleSheetChanged) - result.setColor(QPalette::Window, QColor(0xF3,0xF3,0xF3,0xFF)); - if (standardPalette.color(QPalette::ButtonText) == result.color(QPalette::ButtonText) || styleSheetChanged) - result.setColor(QPalette::ButtonText, textColor); - if (standardPalette.color(QPalette::Midlight) == result.color(QPalette::Midlight) || styleSheetChanged) - result.setColor(QPalette::Midlight, btnColor.lighter(125)); - if (standardPalette.color(QPalette::Shadow) == result.color(QPalette::Shadow) || styleSheetChanged) - result.setColor(QPalette::Shadow, Qt::black); - if (standardPalette.color(QPalette::ToolTipBase) == result.color(QPalette::ToolTipBase) || styleSheetChanged) - result.setColor(QPalette::ToolTipBase, result.window().color()); - if (standardPalette.color(QPalette::ToolTipText) == result.color(QPalette::ToolTipText) || styleSheetChanged) - result.setColor(QPalette::ToolTipText, result.windowText().color()); + SET_IF_UNRESOLVED(QPalette::All, QPalette::Highlight, btnHighlight); + SET_IF_UNRESOLVED(QPalette::All, QPalette::WindowText, textColor); + SET_IF_UNRESOLVED(QPalette::All, QPalette::Button, btnFace); + SET_IF_UNRESOLVED(QPalette::All, QPalette::Light, btnColor.lighter(150)); + SET_IF_UNRESOLVED(QPalette::All, QPalette::Dark, btnColor.darker(200)); + SET_IF_UNRESOLVED(QPalette::All, QPalette::Mid, btnColor.darker(150)); + SET_IF_UNRESOLVED(QPalette::All, QPalette::Text, textColor); + SET_IF_UNRESOLVED(QPalette::All, QPalette::BrightText, btnHighlight); + SET_IF_UNRESOLVED(QPalette::All, QPalette::Base, btnFace); + SET_IF_UNRESOLVED(QPalette::All, QPalette::Window, QColor(0xF3,0xF3,0xF3,0xFF)); + SET_IF_UNRESOLVED(QPalette::All, QPalette::ButtonText, textColor); + SET_IF_UNRESOLVED(QPalette::All, QPalette::Midlight, btnColor.lighter(125)); + SET_IF_UNRESOLVED(QPalette::All, QPalette::Shadow, Qt::black); + SET_IF_UNRESOLVED(QPalette::All, QPalette::ToolTipBase, result.window().color()); + SET_IF_UNRESOLVED(QPalette::All, QPalette::ToolTipText, result.windowText().color()); if (result.midlight() == result.button()) result.setColor(QPalette::Midlight, btnColor.lighter(110)); @@ -2082,35 +2145,30 @@ static void populateLightSystemBasePalette(QPalette &result) /*! \internal */ -void QWindows11Style::polish(QPalette& pal) +void QWindows11Style::polish(QPalette& result) { - highContrastTheme = QGuiApplicationPrivate::colorScheme() == Qt::ColorScheme::Unknown; - colorSchemeIndex = QGuiApplicationPrivate::colorScheme() == Qt::ColorScheme::Light ? 0 : 1; + highContrastTheme = QGuiApplication::styleHints()->colorScheme() == Qt::ColorScheme::Unknown; + colorSchemeIndex = QGuiApplication::styleHints()->colorScheme() == Qt::ColorScheme::Light ? 0 : 1; if (!highContrastTheme && colorSchemeIndex == 0) - populateLightSystemBasePalette(pal); - - if (standardPalette().color(QPalette::Inactive, QPalette::Button) == pal.color(QPalette::Inactive, QPalette::Button)) - pal.setColor(QPalette::Inactive, QPalette::Button, pal.button().color()); - if (standardPalette().color(QPalette::Inactive, QPalette::Window) == pal.color(QPalette::Inactive, QPalette::Window)) - pal.setColor(QPalette::Inactive, QPalette::Window, pal.window().color()); - if (standardPalette().color(QPalette::Inactive, QPalette::Light) == pal.color(QPalette::Inactive, QPalette::Light)) - pal.setColor(QPalette::Inactive, QPalette::Light, pal.light().color()); - if (standardPalette().color(QPalette::Inactive, QPalette::Dark) == pal.color(QPalette::Inactive, QPalette::Dark)) - pal.setColor(QPalette::Inactive, QPalette::Dark, pal.dark().color()); - if (standardPalette().color(QPalette::Inactive, QPalette::Accent) == pal.color(QPalette::Inactive, QPalette::Accent)) - pal.setColor(QPalette::Inactive, QPalette::Accent, pal.accent().color()); - if (standardPalette().color(QPalette::Inactive, QPalette::Highlight) == pal.color(QPalette::Inactive, QPalette::Highlight)) - pal.setColor(QPalette::Inactive, QPalette::Highlight, pal.highlight().color()); - if (standardPalette().color(QPalette::Inactive, QPalette::HighlightedText) == pal.color(QPalette::Inactive, QPalette::HighlightedText)) - pal.setColor(QPalette::Inactive, QPalette::HighlightedText, pal.highlightedText().color()); - if (standardPalette().color(QPalette::Inactive, QPalette::Text) == pal.color(QPalette::Inactive, QPalette::Text)) - pal.setColor(QPalette::Inactive, QPalette::Text, pal.text().color()); - if (standardPalette().color(QPalette::Inactive, QPalette::WindowText) == pal.color(QPalette::Inactive, QPalette::WindowText)) - pal.setColor(QPalette::Inactive, QPalette::WindowText, pal.windowText().color()); + populateLightSystemBasePalette(result); + + const bool styleSheetChanged = false; // so the macro works + + SET_IF_UNRESOLVED(QPalette::Inactive, QPalette::Button, result.button().color()); + SET_IF_UNRESOLVED(QPalette::Inactive, QPalette::Window, result.window().color()); + SET_IF_UNRESOLVED(QPalette::Inactive, QPalette::Light, result.light().color()); + SET_IF_UNRESOLVED(QPalette::Inactive, QPalette::Dark, result.dark().color()); + SET_IF_UNRESOLVED(QPalette::Inactive, QPalette::Accent, result.accent().color()); + SET_IF_UNRESOLVED(QPalette::Inactive, QPalette::Highlight, result.highlight().color()); + SET_IF_UNRESOLVED(QPalette::Inactive, QPalette::HighlightedText, result.highlightedText().color()); + SET_IF_UNRESOLVED(QPalette::Inactive, QPalette::Text, result.text().color()); + SET_IF_UNRESOLVED(QPalette::Inactive, QPalette::WindowText, result.windowText().color()); if (highContrastTheme) - pal.setColor(QPalette::Active, QPalette::HighlightedText, pal.windowText().color()); + result.setColor(QPalette::Active, QPalette::HighlightedText, result.windowText().color()); } +#undef SET_IF_UNRESOLVED + QT_END_NAMESPACE |