React to changes in the system color palette.

Task-number: QTBUG-49734
Change-Id: Ic7926b53b6ee417c6c6206f7a9d5bb08bfd0c051
Reviewed-by: Morten Johan Sørvig <morten.sorvig@theqtcompany.com>
bb10
Jake Petroules 2015-12-09 21:04:48 -08:00
parent 95a6dc1cb9
commit 0ba7df2603
2 changed files with 46 additions and 3 deletions

View File

@ -37,6 +37,8 @@
#include <QtCore/QHash>
#include <qpa/qplatformtheme.h>
Q_FORWARD_DECLARE_OBJC_CLASS(QT_MANGLE_NAMESPACE(QCocoaThemeNotificationReceiver));
QT_BEGIN_NAMESPACE
class QPalette;
@ -46,6 +48,8 @@ public:
QCocoaTheme();
~QCocoaTheme();
void reset();
QPlatformMenuItem* createPlatformMenuItem() const Q_DECL_OVERRIDE;
QPlatformMenu* createPlatformMenu() const Q_DECL_OVERRIDE;
QPlatformMenuBar* createPlatformMenuBar() const Q_DECL_OVERRIDE;
@ -73,6 +77,7 @@ private:
mutable QPalette *m_systemPalette;
mutable QHash<QPlatformTheme::Palette, QPalette*> m_palettes;
mutable QHash<QPlatformTheme::Font, QFont*> m_fonts;
mutable QCocoaThemeNotificationReceiver *m_notificationReceiver;
};
QT_END_NAMESPACE

View File

@ -57,6 +57,31 @@
#include <Carbon/Carbon.h>
@interface QT_MANGLE_NAMESPACE(QCocoaThemeNotificationReceiver) : NSObject {
QCocoaTheme *mPrivate;
}
- (id)initWithPrivate:(QCocoaTheme *)priv;
- (void)systemColorsDidChange:(NSNotification *)notification;
@end
QT_NAMESPACE_ALIAS_OBJC_CLASS(QCocoaThemeNotificationReceiver);
@implementation QCocoaThemeNotificationReceiver
- (id)initWithPrivate:(QCocoaTheme *)priv
{
self = [super init];
mPrivate = priv;
return self;
}
- (void)systemColorsDidChange:(NSNotification *)notification
{
Q_UNUSED(notification);
mPrivate->reset();
QWindowSystemInterface::handleThemeChange(Q_NULLPTR);
}
@end
QT_BEGIN_NAMESPACE
const char *QCocoaTheme::name = "cocoa";
@ -64,16 +89,29 @@ const char *QCocoaTheme::name = "cocoa";
QCocoaTheme::QCocoaTheme()
:m_systemPalette(0)
{
m_notificationReceiver = [[QT_MANGLE_NAMESPACE(QCocoaThemeNotificationReceiver) alloc] initWithPrivate:this];
[[NSNotificationCenter defaultCenter] addObserver:m_notificationReceiver
selector:@selector(systemColorsDidChange:)
name:NSSystemColorsDidChangeNotification
object:nil];
}
QCocoaTheme::~QCocoaTheme()
{
delete m_systemPalette;
qDeleteAll(m_palettes);
[[NSNotificationCenter defaultCenter] removeObserver:m_notificationReceiver];
[m_notificationReceiver release];
reset();
qDeleteAll(m_fonts);
}
void QCocoaTheme::reset()
{
delete m_systemPalette;
m_systemPalette = Q_NULLPTR;
qDeleteAll(m_palettes);
m_palettes.clear();
}
bool QCocoaTheme::usePlatformNativeDialog(DialogType dialogType) const
{
if (dialogType == QPlatformTheme::FileDialog)