Handle theme change in QApplication/QGuiApplication.
Re-initialize palette and fonts. Change-Id: Ib312747886a31e8370f8d99536d52cbcf8afe8a4 Reviewed-by: Morten Johan Sørvig <morten.sorvig@nokia.com>bb10
parent
d2f65aa470
commit
a6e20e4874
|
|
@ -99,6 +99,14 @@ QPlatformTheme *QGuiApplicationPrivate::platform_theme = 0;
|
|||
|
||||
QList<QObject *> QGuiApplicationPrivate::generic_plugin_list;
|
||||
|
||||
enum ApplicationResourceFlags
|
||||
{
|
||||
ApplicationPaletteExplicitlySet = 0x1,
|
||||
ApplicationFontExplicitlySet = 0x2
|
||||
};
|
||||
|
||||
static unsigned applicationResourceFlags = 0;
|
||||
|
||||
bool QGuiApplicationPrivate::app_do_modal = false;
|
||||
|
||||
QPalette *QGuiApplicationPrivate::app_pal = 0; // default application palette
|
||||
|
|
@ -144,6 +152,33 @@ static bool qt_detectRTLLanguage()
|
|||
" and Arabic) to get proper widget layout.") == QLatin1String("RTL"));
|
||||
}
|
||||
|
||||
static void initPalette()
|
||||
{
|
||||
if (!QGuiApplicationPrivate::app_pal)
|
||||
if (const QPalette *themePalette = QGuiApplicationPrivate::platformTheme()->palette())
|
||||
QGuiApplicationPrivate::app_pal = new QPalette(*themePalette);
|
||||
if (!QGuiApplicationPrivate::app_pal)
|
||||
QGuiApplicationPrivate::app_pal = new QPalette(Qt::black);
|
||||
}
|
||||
|
||||
static inline void clearPalette()
|
||||
{
|
||||
delete QGuiApplicationPrivate::app_pal;
|
||||
QGuiApplicationPrivate::app_pal = 0;
|
||||
}
|
||||
|
||||
static void initFontUnlocked()
|
||||
{
|
||||
if (!QGuiApplicationPrivate::app_font)
|
||||
QGuiApplicationPrivate::app_font =
|
||||
new QFont(QGuiApplicationPrivate::platformIntegration()->fontDatabase()->defaultFont());
|
||||
}
|
||||
|
||||
static inline void clearFontUnlocked()
|
||||
{
|
||||
delete QGuiApplicationPrivate::app_font;
|
||||
QGuiApplicationPrivate::app_font = 0;
|
||||
}
|
||||
|
||||
/*!
|
||||
\class QGuiApplication
|
||||
|
|
@ -312,8 +347,7 @@ QGuiApplication::~QGuiApplication()
|
|||
delete QGuiApplicationPrivate::qt_clipboard;
|
||||
QGuiApplicationPrivate::qt_clipboard = 0;
|
||||
|
||||
delete QGuiApplicationPrivate::app_pal;
|
||||
QGuiApplicationPrivate::app_pal = 0;
|
||||
clearPalette();
|
||||
|
||||
qUnregisterGuiVariant();
|
||||
|
||||
|
|
@ -671,8 +705,8 @@ QGuiApplicationPrivate::~QGuiApplicationPrivate()
|
|||
delete generic_plugin_list.at(i);
|
||||
generic_plugin_list.clear();
|
||||
|
||||
delete app_font;
|
||||
app_font = 0;
|
||||
clearFontUnlocked();
|
||||
|
||||
QFont::cleanup();
|
||||
|
||||
#ifndef QT_NO_CURSOR
|
||||
|
|
@ -1090,6 +1124,8 @@ void QGuiApplicationPrivate::processWindowStateChangedEvent(QWindowSystemInterfa
|
|||
|
||||
void QGuiApplicationPrivate::processThemeChanged(QWindowSystemInterfacePrivate::ThemeChangeEvent *tce)
|
||||
{
|
||||
if (self)
|
||||
self->notifyThemeChanged();
|
||||
if (QWindow *window = tce->window.data()) {
|
||||
QEvent e(QEvent::ThemeChange);
|
||||
QGuiApplication::sendSpontaneousEvent(window, &e);
|
||||
|
|
@ -1579,13 +1615,10 @@ QClipboard * QGuiApplication::clipboard()
|
|||
|
||||
\sa setPalette()
|
||||
*/
|
||||
|
||||
QPalette QGuiApplication::palette()
|
||||
{
|
||||
if (!QGuiApplicationPrivate::app_pal)
|
||||
if (const QPalette *themePalette = QGuiApplicationPrivate::platformTheme()->palette())
|
||||
QGuiApplicationPrivate::app_pal = new QPalette(*themePalette);
|
||||
if (!QGuiApplicationPrivate::app_pal)
|
||||
QGuiApplicationPrivate::app_pal = new QPalette(Qt::black);
|
||||
initPalette();
|
||||
return *QGuiApplicationPrivate::app_pal;
|
||||
}
|
||||
|
||||
|
|
@ -1602,6 +1635,7 @@ void QGuiApplication::setPalette(const QPalette &pal)
|
|||
QGuiApplicationPrivate::app_pal = new QPalette(pal);
|
||||
else
|
||||
*QGuiApplicationPrivate::app_pal = pal;
|
||||
applicationResourceFlags |= ApplicationPaletteExplicitlySet;
|
||||
}
|
||||
|
||||
/*!
|
||||
|
|
@ -1612,9 +1646,7 @@ void QGuiApplication::setPalette(const QPalette &pal)
|
|||
QFont QGuiApplication::font()
|
||||
{
|
||||
QMutexLocker locker(&applicationFontMutex);
|
||||
if (!QGuiApplicationPrivate::app_font)
|
||||
QGuiApplicationPrivate::app_font =
|
||||
new QFont(QGuiApplicationPrivate::platformIntegration()->fontDatabase()->defaultFont());
|
||||
initFontUnlocked();
|
||||
return *QGuiApplicationPrivate::app_font;
|
||||
}
|
||||
|
||||
|
|
@ -1630,6 +1662,7 @@ void QGuiApplication::setFont(const QFont &font)
|
|||
QGuiApplicationPrivate::app_font = new QFont(font);
|
||||
else
|
||||
*QGuiApplicationPrivate::app_font = font;
|
||||
applicationResourceFlags |= ApplicationFontExplicitlySet;
|
||||
}
|
||||
|
||||
/*!
|
||||
|
|
@ -2034,4 +2067,17 @@ QPixmap QGuiApplicationPrivate::getPixmapCursor(Qt::CursorShape cshape)
|
|||
return QPixmap();
|
||||
}
|
||||
|
||||
void QGuiApplicationPrivate::notifyThemeChanged()
|
||||
{
|
||||
if (!(applicationResourceFlags & ApplicationPaletteExplicitlySet)) {
|
||||
clearPalette();
|
||||
initPalette();
|
||||
}
|
||||
if (!(applicationResourceFlags & ApplicationFontExplicitlySet)) {
|
||||
QMutexLocker locker(&applicationFontMutex);
|
||||
clearFontUnlocked();
|
||||
initFontUnlocked();
|
||||
}
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
|
|
|||
|
|
@ -200,6 +200,9 @@ public:
|
|||
};
|
||||
QHash<QWindow *, SynthesizedMouseData> synthesizedMousePoints;
|
||||
|
||||
protected:
|
||||
virtual void notifyThemeChanged();
|
||||
|
||||
private:
|
||||
void init();
|
||||
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@
|
|||
#include <QtCore/QSysInfo>
|
||||
#include <QtGui/QPalette>
|
||||
#include <QtGui/QGuiApplication>
|
||||
#include <QtGui/QWindowSystemInterface>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
|
|
@ -265,10 +266,10 @@ QPlatformDialogHelper *QWindowsTheme::createPlatformDialogHelper(DialogType type
|
|||
return QWindowsDialogs::createHelper(type);
|
||||
}
|
||||
|
||||
void QWindowsTheme::windowsThemeChanged(QWindow * /* window */)
|
||||
void QWindowsTheme::windowsThemeChanged(QWindow * window)
|
||||
{
|
||||
refresh();
|
||||
// QWindowSystemInterface::handleThemeChange(window);
|
||||
QWindowSystemInterface::handleThemeChange(window);
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
|
|
|||
|
|
@ -128,6 +128,21 @@ Q_CORE_EXPORT void qt_call_post_routines();
|
|||
|
||||
QApplicationPrivate *QApplicationPrivate::self = 0;
|
||||
|
||||
static void initSystemPalette()
|
||||
{
|
||||
if (!QApplicationPrivate::sys_pal)
|
||||
if (const QPalette *themePalette = QGuiApplicationPrivate::platformTheme()->palette())
|
||||
QApplicationPrivate::setSystemPalette(*themePalette);
|
||||
if (!QApplicationPrivate::sys_pal && QApplicationPrivate::app_style)
|
||||
QApplicationPrivate::setSystemPalette(QApplicationPrivate::app_style->standardPalette());
|
||||
}
|
||||
|
||||
static void clearSystemPalette()
|
||||
{
|
||||
delete QApplicationPrivate::sys_pal;
|
||||
QApplicationPrivate::sys_pal = 0;
|
||||
}
|
||||
|
||||
#ifdef Q_OS_WINCE
|
||||
int QApplicationPrivate::autoMaximizeThreshold = -1;
|
||||
bool QApplicationPrivate::autoSipEnabled = false;
|
||||
|
|
@ -365,6 +380,7 @@ QString QApplicationPrivate::styleSheet; // default application styles
|
|||
QPointer<QWidget> QApplicationPrivate::leaveAfterRelease = 0;
|
||||
|
||||
int QApplicationPrivate::app_cspec = QApplication::NormalColor;
|
||||
|
||||
QPalette *QApplicationPrivate::sys_pal = 0; // default system palette
|
||||
QPalette *QApplicationPrivate::set_pal = 0; // default palette set by programmer
|
||||
|
||||
|
|
@ -783,8 +799,7 @@ QApplication::~QApplication()
|
|||
|
||||
delete QApplicationPrivate::app_pal;
|
||||
QApplicationPrivate::app_pal = 0;
|
||||
delete QApplicationPrivate::sys_pal;
|
||||
QApplicationPrivate::sys_pal = 0;
|
||||
clearSystemPalette();
|
||||
delete QApplicationPrivate::set_pal;
|
||||
QApplicationPrivate::set_pal = 0;
|
||||
app_palettes()->clear();
|
||||
|
|
@ -1084,11 +1099,8 @@ QStyle *QApplication::style()
|
|||
// take ownership of the style
|
||||
QApplicationPrivate::app_style->setParent(qApp);
|
||||
|
||||
if (!QApplicationPrivate::sys_pal)
|
||||
if (const QPalette *themePalette = QGuiApplicationPrivate::platformTheme()->palette())
|
||||
QApplicationPrivate::setSystemPalette(*themePalette);
|
||||
if (!QApplicationPrivate::sys_pal)
|
||||
QApplicationPrivate::setSystemPalette(QApplicationPrivate::app_style->standardPalette());
|
||||
initSystemPalette();
|
||||
|
||||
if (QApplicationPrivate::set_pal) // repolish set palette with the new style
|
||||
QApplication::setPalette(*QApplicationPrivate::set_pal);
|
||||
|
||||
|
|
@ -4631,6 +4643,13 @@ void QApplicationPrivate::translateTouchCancel(QTouchDevice *device, ulong times
|
|||
}
|
||||
}
|
||||
|
||||
void QApplicationPrivate::notifyThemeChanged()
|
||||
{
|
||||
QGuiApplicationPrivate::notifyThemeChanged();
|
||||
clearSystemPalette();
|
||||
initSystemPalette();
|
||||
}
|
||||
|
||||
#ifndef QT_NO_GESTURES
|
||||
QGestureManager* QGestureManager::instance()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -260,7 +260,9 @@ public:
|
|||
static QPalette *sys_pal;
|
||||
static QPalette *set_pal;
|
||||
|
||||
private:
|
||||
protected:
|
||||
void notifyThemeChanged();
|
||||
|
||||
public:
|
||||
static QFont *sys_font;
|
||||
static QFont *set_font;
|
||||
|
|
|
|||
Loading…
Reference in New Issue