diff options
Diffstat (limited to 'src/plugins/platforms/windows/qwindowstheme.cpp')
-rw-r--r-- | src/plugins/platforms/windows/qwindowstheme.cpp | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/src/plugins/platforms/windows/qwindowstheme.cpp b/src/plugins/platforms/windows/qwindowstheme.cpp index 73cff3c9ce..a59b74cef3 100644 --- a/src/plugins/platforms/windows/qwindowstheme.cpp +++ b/src/plugins/platforms/windows/qwindowstheme.cpp @@ -42,12 +42,126 @@ #include "qwindowstheme.h" #include "qwindowsdialoghelpers.h" #include "qwindowscontext.h" +#include "qwindowsintegration.h" #include "qt_windows.h" #include <QtCore/QVariant> +#include <QtCore/QCoreApplication> +#include <QtCore/QDebug> +#include <QtCore/QTextStream> +#include <QtCore/QSysInfo> +#include <QtGui/QPalette> +#include <QtGui/QGuiApplication> QT_BEGIN_NAMESPACE +static inline QTextStream& operator<<(QTextStream &str, const QColor &c) +{ + str.setIntegerBase(16); + str.setFieldWidth(2); + str.setPadChar(QLatin1Char('0')); + str << " rgb: #" << c.red() << c.green() << c.blue(); + str.setIntegerBase(10); + str.setFieldWidth(0); + return str; +} + +static inline QString paletteToString(const QPalette &palette) +{ + QString result; + QTextStream str(&result); + str << "text=" << palette.color(QPalette::WindowText) + << " background=" << palette.color(QPalette::Window); + return result; +} + +static inline QColor mixColors(const QColor &c1, const QColor &c2) +{ + return QColor ((c1.red() + c2.red()) / 2, + (c1.green() + c2.green()) / 2, + (c1.blue() + c2.blue()) / 2); +} + +static inline QColor getSysColor(int index) +{ + return qColorToCOLORREF(GetSysColor(index)); +} + +static inline QPalette systemPalette() +{ + QPalette result; + result.setColor(QPalette::WindowText, getSysColor(COLOR_WINDOWTEXT)); + result.setColor(QPalette::Button, getSysColor(COLOR_BTNFACE)); + result.setColor(QPalette::Light, getSysColor(COLOR_BTNHIGHLIGHT)); + result.setColor(QPalette::Dark, getSysColor(COLOR_BTNSHADOW)); + result.setColor(QPalette::Mid, result.button().color().darker(150)); + result.setColor(QPalette::Text, getSysColor(COLOR_WINDOWTEXT)); + result.setColor(QPalette::BrightText, getSysColor(COLOR_BTNHIGHLIGHT)); + result.setColor(QPalette::Base, getSysColor(COLOR_WINDOW)); + result.setColor(QPalette::Window, getSysColor(COLOR_BTNFACE)); + result.setColor(QPalette::ButtonText, getSysColor(COLOR_BTNTEXT)); + result.setColor(QPalette::Midlight, getSysColor(COLOR_3DLIGHT)); + result.setColor(QPalette::Shadow, getSysColor(COLOR_3DDKSHADOW)); + result.setColor(QPalette::Highlight, getSysColor(COLOR_HIGHLIGHT)); + result.setColor(QPalette::HighlightedText, getSysColor(COLOR_HIGHLIGHTTEXT)); + result.setColor(QPalette::Link, Qt::blue); + result.setColor(QPalette::LinkVisited, Qt::magenta); + result.setColor(QPalette::Inactive, QPalette::Button, result.button().color()); + result.setColor(QPalette::Inactive, QPalette::Window, result.background().color()); + result.setColor(QPalette::Inactive, QPalette::Light, result.light().color()); + result.setColor(QPalette::Inactive, QPalette::Dark, result.dark().color()); + + if (result.midlight() == result.button()) + result.setColor(QPalette::Midlight, result.button().color().lighter(110)); + if (result.background() != result.base()) { + result.setColor(QPalette::Inactive, QPalette::Highlight, result.color(QPalette::Inactive, QPalette::Window)); + result.setColor(QPalette::Inactive, QPalette::HighlightedText, result.color(QPalette::Inactive, QPalette::Text)); + } + + const QColor disabled = + mixColors(result.foreground().color(), result.button().color()); + + result.setColorGroup(QPalette::Disabled, result.foreground(), result.button(), + result.light(), result.dark(), result.mid(), + result.text(), result.brightText(), result.base(), + result.background()); + result.setColor(QPalette::Disabled, QPalette::WindowText, disabled); + result.setColor(QPalette::Disabled, QPalette::Text, disabled); + result.setColor(QPalette::Disabled, QPalette::ButtonText, disabled); + result.setColor(QPalette::Disabled, QPalette::Highlight, + getSysColor(COLOR_HIGHLIGHT)); + result.setColor(QPalette::Disabled, QPalette::HighlightedText, + getSysColor(COLOR_HIGHLIGHTTEXT)); + result.setColor(QPalette::Disabled, QPalette::Base, + result.background().color()); + return result; +} + +QPalette toolTipPalette(const QPalette &systemPalette) +{ + QPalette result(systemPalette); + const QColor tipBgColor(getSysColor(COLOR_INFOBK)); + const QColor tipTextColor(getSysColor(COLOR_INFOTEXT)); + + result.setColor(QPalette::All, QPalette::Button, tipBgColor); + result.setColor(QPalette::All, QPalette::Window, tipBgColor); + result.setColor(QPalette::All, QPalette::Text, tipTextColor); + result.setColor(QPalette::All, QPalette::WindowText, tipTextColor); + result.setColor(QPalette::All, QPalette::ButtonText, tipTextColor); + result.setColor(QPalette::All, QPalette::Button, tipBgColor); + result.setColor(QPalette::All, QPalette::Window, tipBgColor); + result.setColor(QPalette::All, QPalette::Text, tipTextColor); + result.setColor(QPalette::All, QPalette::WindowText, tipTextColor); + result.setColor(QPalette::All, QPalette::ButtonText, tipTextColor); + const QColor disabled = + mixColors(result.foreground().color(), result.button().color()); + result.setColor(QPalette::Disabled, QPalette::WindowText, disabled); + result.setColor(QPalette::Disabled, QPalette::Text, disabled); + result.setColor(QPalette::Disabled, QPalette::Base, Qt::white); + result.setColor(QPalette::Disabled, QPalette::BrightText, Qt::white); + return result; +} + static inline bool booleanSystemParametersInfo(UINT what, bool defaultValue) { BOOL result; @@ -66,11 +180,53 @@ static inline bool dWordSystemParametersInfo(UINT what, DWORD defaultValue) QWindowsTheme::QWindowsTheme() { + qFill(m_palettes, m_palettes + NPalettes, static_cast<QPalette *>(0)); + refresh(); +} + +QWindowsTheme::~QWindowsTheme() +{ + clearPalettes(); +} + +void QWindowsTheme::clearPalettes() +{ + qDeleteAll(m_palettes, m_palettes + NPalettes); + qFill(m_palettes, m_palettes + NPalettes, static_cast<QPalette *>(0)); +} + +QWindowsTheme *QWindowsTheme::instance() +{ + return static_cast<QWindowsTheme *>(QWindowsIntegration::instance()->platformTheme()); +} + +static inline QStringList iconThemeSearchPaths() +{ + const QFileInfo appDir(QCoreApplication::applicationDirPath() + QStringLiteral("/icons")); + return appDir.isDir() ? QStringList(appDir.absoluteFilePath()) : QStringList(); +} + +static inline QStringList styleNames() +{ + QStringList result; + if (QSysInfo::WindowsVersion >= QSysInfo::WV_VISTA) + result.append(QStringLiteral("WindowsVista")); + if (QSysInfo::WindowsVersion >= QSysInfo::WV_XP) + result.append(QStringLiteral("WindowsXP")); + result.append(QStringLiteral("Windows")); + return result; } QVariant QWindowsTheme::themeHint(ThemeHint hint) const { switch (hint) { + case SystemIconThemeName: + break; + case IconThemeSearchPaths: + return QVariant(iconThemeSearchPaths()); + break; + case StyleNames: + return QVariant(styleNames()); case TextCursorWidth: return QVariant(int(dWordSystemParametersInfo(SPI_GETCARETWIDTH, 1u))); case DropShadow: @@ -81,6 +237,19 @@ QVariant QWindowsTheme::themeHint(ThemeHint hint) const return QVariant(); } +void QWindowsTheme::refresh() +{ + clearPalettes(); + if (QGuiApplication::desktopSettingsAware()) { + m_palettes[SystemPalette] = new QPalette(systemPalette()); + m_palettes[ToolTipPalette] = new QPalette(toolTipPalette(*m_palettes[SystemPalette])); + if (QWindowsContext::verboseTheming) + qDebug() << __FUNCTION__ << '\n' + << " system=" << paletteToString(*m_palettes[SystemPalette]) + << " tooltip=" << paletteToString(*m_palettes[ToolTipPalette]); + } +} + bool QWindowsTheme::usePlatformNativeDialog(DialogType type) const { return QWindowsDialogs::useHelper(type); @@ -91,4 +260,10 @@ QPlatformDialogHelper *QWindowsTheme::createPlatformDialogHelper(DialogType type return QWindowsDialogs::createHelper(type); } +void QWindowsTheme::windowsThemeChanged(QWindow * /* window */) +{ + refresh(); + // QWindowSystemInterface::handleThemeChange(window); +} + QT_END_NAMESPACE |