Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qquickfluentwinui3theme.cpp
Go to the documentation of this file.
1// Copyright (C) 2024 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
6
7#include <QtCore/qoperatingsystemversion.h>
8#include <QtGui/private/qguiapplication_p.h>
9#include <QtGui/qpa/qplatformtheme.h>
10#include <QtGui/qguiapplication.h>
11#include <QtGui/qstylehints.h>
12#include <QtGui/QAccessibilityHints>
13#include <QtGui/qcolor.h>
14#include <QtGui/qfontdatabase.h>
15#include <QtQuickTemplates2/private/qquicktheme_p.h>
16
18
19// If on a Windows11 or above, the platform theme will be used to populate the palette
20// We need to fallback to hardcoded colors when using the style on other platforms,
21// that's why we need the following
22// The colors for Windows 11 are taken from the official WinUI3 Figma style at
23// https://www.figma.com/community/file/1159947337437047524
24// Try to keep these consistent with the widget windows11 style
26 solidBackground, // Solid background color used for the bottom most layer
27 acrylicBackgroundDefault, // Acrylic background for popups/tooltips
28 textPrimary, // Color for UI labels and static text
29 textSecondary, // Color for text in pressed controls
30 textDisabled, // Color for disabled text
31 textOnAccentPrimary, // Color of text on controls filled in accent color
32 textOnAccentSecondary, // Color of text on sunken controls in accent color
33 textOnAccentDisabled, // Color of text on disabled controls in accent color
34 controlDefault, // Color for standard controls
35 controlDisabled, // Color for disabled controls
36 controlStrokeDefault, // Color for gradient stops in elevations (pressed or disabled state)
37 controlStrokeSecondary, // Color for gradient stops in elevations
38 controlStrokeAccentDefault, // Color for gradient stops in elevations for accent controls
39 controlStrokeAccentSecondary, // Color for gradient stops in elevations for accent controls
40 accentDefault, // Default color for accent fills on controls
41 accentDisabled, // Default color for accent fills on disabled controls
42 accentSecondary, // Color for accent fills on hovered controls
43 inputActive, // Color for active text input backgrounds
44};
45
46const static QColor WINUI3ColorsLight [] {
47 QColor(0xF3,0xF3,0xF3,0xFF), //solidBackgroundColor
48 QColor(0xFC,0xFC,0xFC,0xFF), //acrylicBackgroundDefault
49 QColor(0x00,0x00,0x00,0xE4), //textPrimary
50 QColor(0x00,0x00,0x00,0x9E), //textSecondary
51 QColor(0x00,0x00,0x00,0x5C), //textDisabled
52 QColor(0xFF,0xFF,0xFF,0xFF), //textOnAccentPrimary
53 QColor(0xFF,0xFF,0xFF,0x7F), //textOnAccentSecondary
54 QColor(0xFF,0xFF,0xFF,0xFF), //textOnAccentDisabled
55 QColor(0xFF,0xFF,0xFF,0xB3), //controlDefault
56 QColor(0xF9,0xF9,0xF9,0x4D), //controlDisabled
57 QColor(0x00,0x00,0x00,0x0F), //controlStrokeDefault
58 QColor(0x00,0x00,0x00,0x29), //controlStrokeSecondary
59 QColor(0xFF,0xFF,0xFF,0x14), //controlStrokeAccentDefault
60 QColor(0x00,0x00,0x00,0x66), //controlStrokeAccentSecondary
61 QColor(0x00,0x5F,0xB8,0xFF), //accentDefault
62 QColor(0x00,0x00,0x00,0x37), //accentDisabled
63 QColor(0x00,0x5F,0xB8,0xE6), //accentSecondary
64 QColor(0xFF,0xFF,0xFF,0xFF) //inputActive
65};
66
67const static QColor WINUI3ColorsDark[] {
68 QColor(0x20,0x20,0x20,0xFF), //solidBackgroundColor
69 QColor(0x2C,0x2C,0x2C,0xFF), //acrylicBackgroundDefault
70 QColor(0xFF,0xFF,0xFF,0xFF), //textPrimary
71 QColor(0xFF,0xFF,0xFF,0xC5), //textSecondary
72 QColor(0xFF,0xFF,0xFF,0x5D), //textDisabled
73 QColor(0x00,0x00,0x00,0xFF), //textOnAccentPrimary
74 QColor(0x00,0x00,0x00,0x80), //textOnAccentSecondary
75 QColor(0xFF,0xFF,0xFF,0x87), //textOnAccentDisabled
76 QColor(0xFF,0xFF,0xFF,0x0F), //controlDefault
77 QColor(0xFF,0xFF,0xFF,0x11), //controlDisabled
78 QColor(0xFF,0xFF,0xFF,0x12), //controlStrokeDefault
79 QColor(0xFF,0xFF,0xFF,0x18), //controlStrokeSecondary
80 QColor(0xFF,0xFF,0xFF,0x14), //controlStrokeAccentDefault
81 QColor(0x00,0x00,0x00,0x23), //controlStrokeAccentSecondary
82 QColor(0x60,0xCD,0xFF,0xFF), //accentDefault
83 QColor(0xFF,0xFF,0xFF,0x28), //accentDisabled
84 QColor(0x60,0xCD,0xFF,0xE6), // accentSecondary
85 QColor(0x1E,0x1E,0x1E,0xB3) // inputActive
86};
87
88const static QColor* WINUI3Colors[] {
89 WINUI3ColorsLight,
90 WINUI3ColorsDark
91};
92
93// Function to populate the palette with WinUI3 theme-specific colors
94static void populateWinUI3Palette(QPalette &palette)
95{
96 const auto colorSchemeIndex = QGuiApplication::styleHints()->colorScheme() == Qt::ColorScheme::Light ? 0 : 1;
97
98 palette.setColor(QPalette::All, QPalette::Window, WINUI3Colors[colorSchemeIndex][solidBackground]);
99
100 palette.setColor(QPalette::All, QPalette::Base, WINUI3Colors[colorSchemeIndex][controlDefault]);
101 palette.setColor(QPalette::Active, QPalette::Base, WINUI3Colors[colorSchemeIndex][inputActive]);
102 palette.setColor(QPalette::Disabled, QPalette::Base, WINUI3Colors[colorSchemeIndex][controlDisabled]);
103
104 palette.setColor(QPalette::All, QPalette::WindowText, WINUI3Colors[colorSchemeIndex][textPrimary]);
105 palette.setColor(QPalette::Disabled, QPalette::WindowText, WINUI3Colors[colorSchemeIndex][textDisabled]);
106
107 palette.setColor(QPalette::All, QPalette::Text, WINUI3Colors[colorSchemeIndex][textPrimary]);
108 palette.setColor(QPalette::Disabled, QPalette::Text, WINUI3Colors[colorSchemeIndex][textDisabled]);
109
110 palette.setColor(QPalette::All, QPalette::PlaceholderText, WINUI3Colors[colorSchemeIndex][textSecondary]);
111 palette.setColor(QPalette::Disabled, QPalette::PlaceholderText, WINUI3Colors[colorSchemeIndex][textDisabled]);
112
113 palette.setColor(QPalette::All, QPalette::Button, WINUI3Colors[colorSchemeIndex][controlDefault]);
114 palette.setColor(QPalette::Disabled, QPalette::Button, WINUI3Colors[colorSchemeIndex][controlDisabled]);
115 palette.setColor(QPalette::All, QPalette::ButtonText, WINUI3Colors[colorSchemeIndex][textPrimary]);
116 palette.setColor(QPalette::Disabled, QPalette::ButtonText, WINUI3Colors[colorSchemeIndex][textDisabled]);
117
118 palette.setColor(QPalette::All, QPalette::ToolTipBase, WINUI3Colors[colorSchemeIndex][acrylicBackgroundDefault]);
119 palette.setColor(QPalette::All, QPalette::ToolTipText, WINUI3Colors[colorSchemeIndex][textPrimary]);
120 palette.setColor(QPalette::Disabled, QPalette::ToolTipText, WINUI3Colors[colorSchemeIndex][textDisabled]);
121
122 palette.setColor(QPalette::Disabled, QPalette::Accent, WINUI3Colors[colorSchemeIndex][accentDisabled]);
123 palette.setColor(QPalette::Disabled, QPalette::Highlight, WINUI3Colors[colorSchemeIndex][accentDisabled]);
124
125 palette.setColor(QPalette::All, QPalette::HighlightedText, Qt::white);
126
127 palette.setColor(QPalette::All, QPalette::Light, WINUI3Colors[colorSchemeIndex][controlStrokeAccentDefault]);
128 palette.setColor(QPalette::All, QPalette::Midlight, WINUI3Colors[colorSchemeIndex][controlStrokeDefault]);
129 palette.setColor(QPalette::All, QPalette::Dark, WINUI3Colors[colorSchemeIndex][controlStrokeSecondary]);
130 palette.setColor(QPalette::All, QPalette::Mid, WINUI3Colors[colorSchemeIndex][controlStrokeAccentSecondary]);
131}
132
133static void populateWinUI3Fonts(QQuickTheme *theme)
134{
135 QFont systemFont;
136 QFont toolBarFont;
137 QFont toolTipFont;
138
139 const QLatin1String segoeUiFamilyName("Segoe UI Variable");
140 if (QFontDatabase::families().contains(segoeUiFamilyName)) {
141 const QFont segoeFont(segoeUiFamilyName);
142 const QStringList families{segoeFont.family()};
143 systemFont.setFamilies(families);
144 toolBarFont.setFamilies(families);
145 }
146 systemFont.setWeight(QFont::Weight::Normal);
147 toolBarFont.setWeight(QFont::Weight::Normal);
148 toolTipFont.setWeight(QFont::Weight::Normal);
149
150 systemFont.setPixelSize(14);
151 toolBarFont.setPixelSize(12);
152 toolTipFont.setPixelSize(12);
153
154 theme->setFont(QQuickTheme::System, systemFont);
155 theme->setFont(QQuickTheme::ToolBar, toolBarFont);
156 theme->setFont(QQuickTheme::ToolTip, toolTipFont);
157}
158
159QPalette QQuickFluentWinUI3Theme::initializeDefaultPalette()
160{
161 QPalette palette;
162
163 const auto *styleHints = QGuiApplication::styleHints();
164 const auto highContrastTheme = styleHints->accessibility()->contrastPreference() == Qt::ContrastPreference::HighContrast;
165 // HighContrast themes use system colors only
166 if (!highContrastTheme) {
167 populateWinUI3Palette(palette);
168
169 // Resolve against the platform palette
170 if (auto platformTheme = QGuiApplicationPrivate::platformTheme()) {
171 const auto platformPalette = platformTheme->palette();
172 if (platformPalette)
173 palette = palette.resolve(*platformPalette);
174 }
175 const auto colorSchemeIndex = styleHints->colorScheme() == Qt::ColorScheme::Light ? 0 : 1;
176 // Ensure specific roles are set
177 if (!palette.isBrushSet(QPalette::Active, QPalette::Accent))
178 palette.setColor(QPalette::Active, QPalette::Accent, WINUI3Colors[colorSchemeIndex][accentDefault]);
179
180 if (!palette.isBrushSet(QPalette::Inactive, QPalette::Highlight))
181 palette.setColor(QPalette::Inactive, QPalette::Highlight, palette.accent().color());
182
183 palette.setColor(QPalette::Disabled, QPalette::Accent, WINUI3Colors[colorSchemeIndex][accentDisabled]);
184 palette.setColor(QPalette::Disabled, QPalette::Highlight, WINUI3Colors[colorSchemeIndex][accentDisabled]);
185 }
186 // WinUI3 sets the inactive accent color to the same as the active one
187 palette.setColor(QPalette::Inactive, QPalette::Accent, palette.accent().color());
188 palette.setColor(QPalette::Inactive, QPalette::Highlight, palette.highlight().color());
189
190 // Finally QGuiApp::palette() should take precedence over style palette
191 palette = QGuiApplication::palette().resolve(palette);
192
193 return palette;
194}
195
196void QQuickFluentWinUI3Theme::initialize(QQuickTheme *theme)
197{
199
200 QPalette systemPalette = initializeDefaultPalette();
201 theme->setPalette(QQuickTheme::System, systemPalette);
202}
203
204QT_END_NAMESPACE
static void initialize(QQuickTheme *theme)
static void populateWinUI3Palette(QPalette &palette)
static const QColor * WINUI3Colors[]
static void populateWinUI3Fonts(QQuickTheme *theme)
static const QColor WINUI3ColorsLight[]
@ acrylicBackgroundDefault
@ controlStrokeAccentDefault
@ textOnAccentSecondary
@ controlStrokeAccentSecondary
@ controlStrokeSecondary
static const QColor WINUI3ColorsDark[]