Platform theme: fill QPalette::AccentColor with OS value
The AccentColor role, added in Qt 6.6, is currently populated with a default value. This patch implements populating the brush with OS values for Windows and macOS. Change-Id: Ic243c3b8664d50db3a2096a034de6ba672d9e2d2 Reviewed-by: Axel Spoerl <axel.spoerl@qt.io>
This commit is contained in:
parent
a33dd60e21
commit
d6ed400037
@ -94,6 +94,9 @@ static QPalette *qt_mac_createSystemPalette()
|
|||||||
palette->setColor(QPalette::Inactive, QPalette::PlaceholderText, qc);
|
palette->setColor(QPalette::Inactive, QPalette::PlaceholderText, qc);
|
||||||
palette->setColor(QPalette::Disabled, QPalette::PlaceholderText, qc);
|
palette->setColor(QPalette::Disabled, QPalette::PlaceholderText, qc);
|
||||||
|
|
||||||
|
qc = qt_mac_toQColor([NSColor controlAccentColor]);
|
||||||
|
palette->setColor(QPalette::AccentColor, qc);
|
||||||
|
|
||||||
return palette;
|
return palette;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -221,28 +221,48 @@ static QColor placeHolderColor(QColor textColor)
|
|||||||
return textColor;
|
return textColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[maybe_unused]] [[nodiscard]] static inline QColor qt_accentColor()
|
||||||
|
{
|
||||||
|
const QWinRegistryKey registry(HKEY_CURRENT_USER, LR"(Software\Microsoft\Windows\DWM)");
|
||||||
|
if (!registry.isValid())
|
||||||
|
return {};
|
||||||
|
const QVariant value = registry.value(L"AccentColor");
|
||||||
|
if (!value.isValid())
|
||||||
|
return {};
|
||||||
|
// The retrieved value is in the #AABBGGRR format, we need to
|
||||||
|
// convert it to the #AARRGGBB format which Qt expects.
|
||||||
|
const QColor abgr = QColor::fromRgba(qvariant_cast<DWORD>(value));
|
||||||
|
if (!abgr.isValid())
|
||||||
|
return {};
|
||||||
|
return QColor::fromRgb(abgr.blue(), abgr.green(), abgr.red(), abgr.alpha());
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
This is used when the theme is light mode, and when the theme is dark but the
|
This is used when the theme is light mode, and when the theme is dark but the
|
||||||
application doesn't support dark mode. In the latter case, we need to check.
|
application doesn't support dark mode. In the latter case, we need to check.
|
||||||
*/
|
*/
|
||||||
void QWindowsTheme::populateLightSystemBasePalette(QPalette &result)
|
void QWindowsTheme::populateLightSystemBasePalette(QPalette &result)
|
||||||
{
|
{
|
||||||
QColor background = getSysColor(COLOR_BTNFACE);
|
const QColor background = getSysColor(COLOR_BTNFACE);
|
||||||
QColor textColor = getSysColor(COLOR_WINDOWTEXT);
|
const QColor textColor = getSysColor(COLOR_WINDOWTEXT);
|
||||||
QColor accent = getSysColor(COLOR_HIGHLIGHT);
|
|
||||||
|
|
||||||
#if QT_CONFIG(cpp_winrt)
|
#if QT_CONFIG(cpp_winrt)
|
||||||
// respect the Windows 11 accent color
|
// respect the Windows 11 accent color
|
||||||
using namespace winrt::Windows::UI::ViewManagement;
|
using namespace winrt::Windows::UI::ViewManagement;
|
||||||
const auto settings = UISettings();
|
const auto settings = UISettings();
|
||||||
|
|
||||||
accent = getSysColor(settings.GetColorValue(UIColorType::Accent));
|
const QColor accent = getSysColor(settings.GetColorValue(UIColorType::Accent));
|
||||||
|
const QColor accentDarkest = getSysColor(settings.GetColorValue(UIColorType::AccentDark3));
|
||||||
|
#else
|
||||||
|
const QColor accent = qt_accentColor();
|
||||||
|
const QColor accentDarkest = accent.darker(120 * 120 * 120);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
const QColor linkColor = accent;
|
||||||
const QColor btnFace = background;
|
const QColor btnFace = background;
|
||||||
const QColor btnHighlight = getSysColor(COLOR_BTNHIGHLIGHT);
|
const QColor btnHighlight = getSysColor(COLOR_BTNHIGHLIGHT);
|
||||||
|
|
||||||
result.setColor(QPalette::Highlight, accent);
|
result.setColor(QPalette::Highlight, getSysColor(COLOR_HIGHLIGHT));
|
||||||
result.setColor(QPalette::WindowText, getSysColor(COLOR_WINDOWTEXT));
|
result.setColor(QPalette::WindowText, getSysColor(COLOR_WINDOWTEXT));
|
||||||
result.setColor(QPalette::Button, btnFace);
|
result.setColor(QPalette::Button, btnFace);
|
||||||
result.setColor(QPalette::Light, btnHighlight);
|
result.setColor(QPalette::Light, btnHighlight);
|
||||||
@ -257,9 +277,10 @@ void QWindowsTheme::populateLightSystemBasePalette(QPalette &result)
|
|||||||
result.setColor(QPalette::Midlight, getSysColor(COLOR_3DLIGHT));
|
result.setColor(QPalette::Midlight, getSysColor(COLOR_3DLIGHT));
|
||||||
result.setColor(QPalette::Shadow, getSysColor(COLOR_3DDKSHADOW));
|
result.setColor(QPalette::Shadow, getSysColor(COLOR_3DDKSHADOW));
|
||||||
result.setColor(QPalette::HighlightedText, getSysColor(COLOR_HIGHLIGHTTEXT));
|
result.setColor(QPalette::HighlightedText, getSysColor(COLOR_HIGHLIGHTTEXT));
|
||||||
|
result.setColor(QPalette::AccentColor, accent);
|
||||||
|
|
||||||
result.setColor(QPalette::Link, Qt::blue);
|
result.setColor(QPalette::Link, linkColor);
|
||||||
result.setColor(QPalette::LinkVisited, Qt::magenta);
|
result.setColor(QPalette::LinkVisited, accentDarkest);
|
||||||
result.setColor(QPalette::Inactive, QPalette::Button, result.button().color());
|
result.setColor(QPalette::Inactive, QPalette::Button, result.button().color());
|
||||||
result.setColor(QPalette::Inactive, QPalette::Window, result.window().color());
|
result.setColor(QPalette::Inactive, QPalette::Window, result.window().color());
|
||||||
result.setColor(QPalette::Inactive, QPalette::Light, result.light().color());
|
result.setColor(QPalette::Inactive, QPalette::Light, result.light().color());
|
||||||
@ -293,19 +314,18 @@ static void populateDarkSystemBasePalette(QPalette &result)
|
|||||||
const QColor accentLight = getSysColor(settings.GetColorValue(UIColorType::AccentLight1));
|
const QColor accentLight = getSysColor(settings.GetColorValue(UIColorType::AccentLight1));
|
||||||
const QColor accentLighter = getSysColor(settings.GetColorValue(UIColorType::AccentLight2));
|
const QColor accentLighter = getSysColor(settings.GetColorValue(UIColorType::AccentLight2));
|
||||||
const QColor accentLightest = getSysColor(settings.GetColorValue(UIColorType::AccentLight3));
|
const QColor accentLightest = getSysColor(settings.GetColorValue(UIColorType::AccentLight3));
|
||||||
const QColor linkColor = accent;
|
|
||||||
#else
|
#else
|
||||||
const QColor foreground = Qt::white;
|
const QColor foreground = Qt::white;
|
||||||
const QColor background = QColor(0x1E, 0x1E, 0x1E);
|
const QColor background = QColor(0x1E, 0x1E, 0x1E);
|
||||||
const QColor accent = QColor(0x00, 0x55, 0xff);
|
const QColor accent = qt_accentColor();
|
||||||
const QColor accentDark = accent.darker(120);
|
const QColor accentDark = accent.darker(120);
|
||||||
const QColor accentDarker = accentDark.darker(120);
|
const QColor accentDarker = accentDark.darker(120);
|
||||||
const QColor accentDarkest = accentDarker.darker(120);
|
const QColor accentDarkest = accentDarker.darker(120);
|
||||||
const QColor accentLight = accent.lighter(120);
|
const QColor accentLight = accent.lighter(120);
|
||||||
const QColor accentLighter = accentLight.lighter(120);
|
const QColor accentLighter = accentLight.lighter(120);
|
||||||
const QColor accentLightest = accentLighter.lighter(120);
|
const QColor accentLightest = accentLighter.lighter(120);
|
||||||
const QColor linkColor = Qt::blue;
|
|
||||||
#endif
|
#endif
|
||||||
|
const QColor linkColor = accent;
|
||||||
const QColor buttonColor = background.lighter(200);
|
const QColor buttonColor = background.lighter(200);
|
||||||
|
|
||||||
result.setColor(QPalette::All, QPalette::WindowText, foreground);
|
result.setColor(QPalette::All, QPalette::WindowText, foreground);
|
||||||
@ -331,6 +351,7 @@ static void populateDarkSystemBasePalette(QPalette &result)
|
|||||||
result.setColor(QPalette::All, QPalette::ToolTipBase, buttonColor);
|
result.setColor(QPalette::All, QPalette::ToolTipBase, buttonColor);
|
||||||
result.setColor(QPalette::All, QPalette::ToolTipText, foreground.darker(120));
|
result.setColor(QPalette::All, QPalette::ToolTipText, foreground.darker(120));
|
||||||
result.setColor(QPalette::All, QPalette::PlaceholderText, placeHolderColor(foreground));
|
result.setColor(QPalette::All, QPalette::PlaceholderText, placeHolderColor(foreground));
|
||||||
|
result.setColor(QPalette::All, QPalette::AccentColor, accent);
|
||||||
}
|
}
|
||||||
|
|
||||||
static QPalette systemPalette(bool light)
|
static QPalette systemPalette(bool light)
|
||||||
@ -346,6 +367,8 @@ static QPalette systemPalette(bool light)
|
|||||||
result.color(QPalette::Inactive, QPalette::Window));
|
result.color(QPalette::Inactive, QPalette::Window));
|
||||||
result.setColor(QPalette::Inactive, QPalette::HighlightedText,
|
result.setColor(QPalette::Inactive, QPalette::HighlightedText,
|
||||||
result.color(QPalette::Inactive, QPalette::Text));
|
result.color(QPalette::Inactive, QPalette::Text));
|
||||||
|
result.setColor(QPalette::Inactive, QPalette::AccentColor,
|
||||||
|
result.color(QPalette::Inactive, QPalette::Window));
|
||||||
}
|
}
|
||||||
|
|
||||||
const QColor disabled = mixColors(result.windowText().color(), result.button().color());
|
const QColor disabled = mixColors(result.windowText().color(), result.button().color());
|
||||||
@ -359,6 +382,7 @@ static QPalette systemPalette(bool light)
|
|||||||
result.setColor(QPalette::Disabled, QPalette::ButtonText, disabled);
|
result.setColor(QPalette::Disabled, QPalette::ButtonText, disabled);
|
||||||
result.setColor(QPalette::Disabled, QPalette::Highlight, result.color(QPalette::Highlight));
|
result.setColor(QPalette::Disabled, QPalette::Highlight, result.color(QPalette::Highlight));
|
||||||
result.setColor(QPalette::Disabled, QPalette::HighlightedText, result.color(QPalette::HighlightedText));
|
result.setColor(QPalette::Disabled, QPalette::HighlightedText, result.color(QPalette::HighlightedText));
|
||||||
|
result.setColor(QPalette::Disabled, QPalette::AccentColor, disabled);
|
||||||
result.setColor(QPalette::Disabled, QPalette::Base, result.window().color());
|
result.setColor(QPalette::Disabled, QPalette::Base, result.window().color());
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -549,7 +573,6 @@ void QWindowsTheme::clearPalettes()
|
|||||||
|
|
||||||
void QWindowsTheme::refreshPalettes()
|
void QWindowsTheme::refreshPalettes()
|
||||||
{
|
{
|
||||||
|
|
||||||
if (!QGuiApplication::desktopSettingsAware())
|
if (!QGuiApplication::desktopSettingsAware())
|
||||||
return;
|
return;
|
||||||
const bool light =
|
const bool light =
|
||||||
@ -567,19 +590,15 @@ void QWindowsTheme::refreshPalettes()
|
|||||||
const QColor accent = getSysColor(settings.GetColorValue(UIColorType::Accent));
|
const QColor accent = getSysColor(settings.GetColorValue(UIColorType::Accent));
|
||||||
const QColor accentLight = getSysColor(settings.GetColorValue(UIColorType::AccentLight1));
|
const QColor accentLight = getSysColor(settings.GetColorValue(UIColorType::AccentLight1));
|
||||||
const QColor accentDarkest = getSysColor(settings.GetColorValue(UIColorType::AccentDark3));
|
const QColor accentDarkest = getSysColor(settings.GetColorValue(UIColorType::AccentDark3));
|
||||||
|
#else
|
||||||
|
const QColor accent = qt_accentColor();
|
||||||
|
const QColor accentLight = accent.lighter(120);
|
||||||
|
const QColor accentDarkest = accent.darker(120 * 120 * 120);
|
||||||
|
#endif
|
||||||
m_palettes[CheckBoxPalette] = new QPalette(*m_palettes[SystemPalette]);
|
m_palettes[CheckBoxPalette] = new QPalette(*m_palettes[SystemPalette]);
|
||||||
m_palettes[CheckBoxPalette]->setColor(QPalette::Active, QPalette::Base, accent);
|
m_palettes[CheckBoxPalette]->setColor(QPalette::Active, QPalette::Base, accent);
|
||||||
m_palettes[CheckBoxPalette]->setColor(QPalette::Active, QPalette::Button, accentLight);
|
m_palettes[CheckBoxPalette]->setColor(QPalette::Active, QPalette::Button, accentLight);
|
||||||
m_palettes[CheckBoxPalette]->setColor(QPalette::Inactive, QPalette::Base, accentDarkest);
|
m_palettes[CheckBoxPalette]->setColor(QPalette::Inactive, QPalette::Base, accentDarkest);
|
||||||
#else
|
|
||||||
m_palettes[ButtonPalette] = new QPalette(*m_palettes[SystemPalette]);
|
|
||||||
m_palettes[ButtonPalette]->setColor(QPalette::Button, QColor(0x666666u));
|
|
||||||
const QColor checkBoxBlue(0x0078d7u);
|
|
||||||
m_palettes[CheckBoxPalette] = new QPalette(*m_palettes[SystemPalette]);
|
|
||||||
m_palettes[CheckBoxPalette]->setColor(QPalette::Base, checkBoxBlue);
|
|
||||||
m_palettes[CheckBoxPalette]->setColor(QPalette::Button, checkBoxBlue);
|
|
||||||
m_palettes[CheckBoxPalette]->setColor(QPalette::ButtonText, Qt::white);
|
|
||||||
#endif
|
|
||||||
m_palettes[RadioButtonPalette] = new QPalette(*m_palettes[CheckBoxPalette]);
|
m_palettes[RadioButtonPalette] = new QPalette(*m_palettes[CheckBoxPalette]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user