Cocoa: Implement widget palettes.
authorMorten Johan Sorvig <morten.sorvig@nokia.com>
Fri, 24 Feb 2012 08:17:00 +0000 (09:17 +0100)
committerQt by Nokia <qt-info@nokia.com>
Tue, 6 Mar 2012 11:30:16 +0000 (12:30 +0100)
Add roles to QPLatformTheme::Palette, map QWidget
subclasses to those. Port Qt4 widget palette creation
code to use the QPLatformTheme::Palette roles.

Palette entries are disabled in this commit, this
will be fixed later.

Change-Id: I07babe3d7c76d306efc4ea4813c7161fdf36227f
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
src/gui/kernel/qplatformtheme_qpa.h
src/plugins/platforms/cocoa/qcocoasystemsettings.h
src/plugins/platforms/cocoa/qcocoasystemsettings.mm
src/plugins/platforms/cocoa/qcocoatheme.h
src/plugins/platforms/cocoa/qcocoatheme.mm
src/widgets/kernel/qapplication.cpp
src/widgets/kernel/qapplication_qpa.cpp

index 3610a3c..be18e4f 100644 (file)
@@ -86,6 +86,19 @@ public:
     enum Palette {
         SystemPalette,
         ToolTipPalette,
+        ToolButtonPalette,
+        ButtonPalette,
+        HeaderPalette,
+        ComboBoxPalette,
+        ItemViewPalette,
+        MessageBoxLabelPelette,
+        TabBarPalette,
+        LabelPalette,
+        GroupBoxPalette,
+        MenuPalette,
+        MenuBarPalette,
+        TextEditPalette,
+        TextLineEditPalette,
         NPalettes
     };
 
index 84a66d7..2ed6f76 100644 (file)
 #ifndef QCOCOASYSTEMSETTINGS_H
 #define QCOCOASYSTEMSETTINGS_H
 
-#include <QtCore/qglobal.h>
+#include <QtCore/qhash.h>
 #include <QtGui/qpalette.h>
+#include <QtGui/qplatformtheme_qpa.h>
 
 QT_BEGIN_NAMESPACE
 
 QPalette * qt_mac_createSystemPalette();
+QHash<QPlatformTheme::Palette, QPalette*> qt_mac_createRolePalettes();
 
 QT_END_NAMESPACE
 
index 5170c0b..eea2fb6 100644 (file)
 
 #include "qcocoasystemsettings.h"
 
-#include <Carbon/Carbon.h>
 #include <QtCore/private/qcore_mac_p.h>
 
+#include <Carbon/Carbon.h>
+
 QColor qt_mac_colorFromCGColor(CGColorRef cgcolor)
 {
     QColor pc;
@@ -143,3 +144,86 @@ QPalette * qt_mac_createSystemPalette()
     return palette;
 }
 
+
+struct QMacPaletteMap {
+    inline QMacPaletteMap(QPlatformTheme::Palette p, ThemeBrush a, ThemeBrush i) :
+        paletteRole(p), active(a), inactive(i) { }
+
+    QPlatformTheme::Palette paletteRole;
+    ThemeBrush active, inactive;
+};
+
+static QMacPaletteMap mac_widget_colors[] = {
+//    TODO (msorvig): Fix/match palette behavior with Qt 4 and enable.
+//
+//    QMacPaletteMap(QPlatformTheme::ToolButtonPalette, kThemeTextColorBevelButtonActive, kThemeTextColorBevelButtonInactive),
+//    QMacPaletteMap(QPlatformTheme::ButtonPalette, kThemeTextColorPushButtonActive, kThemeTextColorPushButtonInactive),
+//    QMacPaletteMap(QPlatformTheme::HeaderPalette, kThemeTextColorPushButtonActive, kThemeTextColorPushButtonInactive),
+//    QMacPaletteMap(QPlatformTheme::ComboBoxPalette, kThemeTextColorPopupButtonActive, kThemeTextColorPopupButtonInactive),
+//    QMacPaletteMap(QPlatformTheme::ItemViewPalette, kThemeTextColorListView, kThemeTextColorDialogInactive),
+//    QMacPaletteMap(QPlatformTheme::MessageBoxLabelPelette, kThemeTextColorAlertActive, kThemeTextColorAlertInactive),
+//    QMacPaletteMap(QPlatformTheme::TabBarPalette, kThemeTextColorTabFrontActive, kThemeTextColorTabFrontInactive),
+//    QMacPaletteMap(QPlatformTheme::LabelPalette, kThemeTextColorPlacardActive, kThemeTextColorPlacardInactive),
+//    QMacPaletteMap(QPlatformTheme::GroupBoxPalette, kThemeTextColorPlacardActive, kThemeTextColorPlacardInactive),
+//    QMacPaletteMap(QPlatformTheme::MenuPalette, kThemeTextColorPopupLabelActive, kThemeTextColorPopupLabelInactive),
+//    ### TODO: The zeros below gives white-on-black text.
+//    QMacPaletteMap(QPlatformTheme::TextEditPalette, 0, 0),
+//    QMacPaletteMap(QPlatformTheme::TextLineEditPalette, 0, 0),
+    QMacPaletteMap(QPlatformTheme::NPalettes, 0, 0) };
+
+QHash<QPlatformTheme::Palette, QPalette*> qt_mac_createRolePalettes()
+{
+    QHash<QPlatformTheme::Palette, QPalette*> palettes;
+    QColor qc;
+    for (int i = 0; mac_widget_colors[i].paletteRole != QPlatformTheme::NPalettes; i++) {
+        QPalette pal;
+        if (mac_widget_colors[i].active != 0) {
+            qc = qt_mac_colorForThemeTextColor(mac_widget_colors[i].active);
+            pal.setColor(QPalette::Active, QPalette::Text, qc);
+            pal.setColor(QPalette::Active, QPalette::WindowText, qc);
+            pal.setColor(QPalette::Active, QPalette::HighlightedText, qc);
+            qc = qt_mac_colorForThemeTextColor(mac_widget_colors[i].inactive);
+            pal.setColor(QPalette::Inactive, QPalette::Text, qc);
+            pal.setColor(QPalette::Disabled, QPalette::Text, qc);
+            pal.setColor(QPalette::Inactive, QPalette::WindowText, qc);
+            pal.setColor(QPalette::Disabled, QPalette::WindowText, qc);
+            pal.setColor(QPalette::Inactive, QPalette::HighlightedText, qc);
+            pal.setColor(QPalette::Disabled, QPalette::HighlightedText, qc);
+        }
+        if (mac_widget_colors[i].paletteRole == QPlatformTheme::MenuPalette) {
+            qc = qt_mac_colorForThemeTextColor(kThemeTextColorMenuItemActive);
+            pal.setBrush(QPalette::ButtonText, qc);
+            qc = qt_mac_colorForThemeTextColor(kThemeTextColorMenuItemSelected);
+            pal.setBrush(QPalette::HighlightedText, qc);
+            qc = qt_mac_colorForThemeTextColor(kThemeTextColorMenuItemDisabled);
+            pal.setBrush(QPalette::Disabled, QPalette::Text, qc);
+        } else if ((mac_widget_colors[i].paletteRole == QPlatformTheme::ButtonPalette)
+                || (mac_widget_colors[i].paletteRole == QPlatformTheme::HeaderPalette)) {
+            pal.setColor(QPalette::Disabled, QPalette::ButtonText,
+                         pal.color(QPalette::Disabled, QPalette::Text));
+            pal.setColor(QPalette::Inactive, QPalette::ButtonText,
+                         pal.color(QPalette::Inactive, QPalette::Text));
+            pal.setColor(QPalette::Active, QPalette::ButtonText,
+                         pal.color(QPalette::Active, QPalette::Text));
+        } else if (mac_widget_colors[i].paletteRole == QPlatformTheme::ItemViewPalette) {
+            pal.setBrush(QPalette::Active, QPalette::Highlight,
+                         qt_mac_colorForTheme(kThemeBrushAlternatePrimaryHighlightColor));
+            qc = qt_mac_colorForThemeTextColor(kThemeTextColorMenuItemSelected);
+            pal.setBrush(QPalette::Active, QPalette::HighlightedText, qc);
+            pal.setBrush(QPalette::Inactive, QPalette::Text,
+                          pal.brush(QPalette::Active, QPalette::Text));
+            pal.setBrush(QPalette::Inactive, QPalette::HighlightedText,
+                          pal.brush(QPalette::Active, QPalette::Text));
+        } else if (mac_widget_colors[i].paletteRole == QPlatformTheme::TextEditPalette) {
+            pal.setBrush(QPalette::Inactive, QPalette::Text,
+                          pal.brush(QPalette::Active, QPalette::Text));
+            pal.setBrush(QPalette::Inactive, QPalette::HighlightedText,
+                          pal.brush(QPalette::Active, QPalette::Text));
+        } else if (mac_widget_colors[i].paletteRole == QPlatformTheme::TextLineEditPalette) {
+            pal.setBrush(QPalette::Disabled, QPalette::Base,
+                         pal.brush(QPalette::Active, QPalette::Base));
+        }
+        palettes.insert(mac_widget_colors[i].paletteRole, new QPalette(pal));
+    }
+    return palettes;
+}
index fa235b6..dccda2c 100644 (file)
@@ -42,8 +42,7 @@
 #ifndef QPLATFORMTHEME_COCOA_H
 #define QPLATFORMTHEME_COCOA_H
 
-#include <Cocoa/Cocoa.h>
-
+#include <QtCore/QHash>
 #include <QtGui/QPlatformTheme>
 
 QT_BEGIN_NAMESPACE
@@ -66,6 +65,7 @@ public:
     QVariant themeHint(ThemeHint hint) const;
 private:
     mutable QPalette *m_systemPalette;
+    mutable QHash<QPlatformTheme::Palette, QPalette*> m_palettes;
 };
 
 QT_END_NAMESPACE
index 6b0e04a..71d7c9e 100644 (file)
@@ -109,8 +109,11 @@ const QPalette *QCocoaTheme::palette(Palette type) const
     if (type == SystemPalette) {
         if (!m_systemPalette)
             m_systemPalette = qt_mac_createSystemPalette();
-
         return m_systemPalette;
+    } else {
+        if (m_palettes.isEmpty())
+            m_palettes = qt_mac_createRolePalettes();
+        return m_palettes.value(type, 0);
     }
     return 0;
 }
index 53f4942..bf2729a 100644 (file)
@@ -131,8 +131,11 @@ QApplicationPrivate *QApplicationPrivate::self = 0;
 static void initSystemPalette()
 {
     if (!QApplicationPrivate::sys_pal)
-        if (const QPalette *themePalette = QGuiApplicationPrivate::platformTheme()->palette())
+        if (const QPalette *themePalette = QGuiApplicationPrivate::platformTheme()->palette()) {
             QApplicationPrivate::setSystemPalette(*themePalette);
+            QApplicationPrivate::initializeWidgetPaletteHash();
+        }
+
     if (!QApplicationPrivate::sys_pal && QApplicationPrivate::app_style)
         QApplicationPrivate::setSystemPalette(QApplicationPrivate::app_style->standardPalette());
 }
index 54c5c39..6c91b89 100644 (file)
@@ -289,8 +289,33 @@ void QApplicationPrivate::cleanupMultitouch_sys()
 {
 }
 
+static void setPossiblePalette(const QPalette *palette, const char *className)
+{
+    if (palette == 0)
+        return;
+    QApplicationPrivate::setPalette_helper(*palette, className, false);
+}
+
+
 void QApplicationPrivate::initializeWidgetPaletteHash()
 {
+    QPlatformTheme *platformTheme = QGuiApplicationPrivate::platformTheme();
+    if (!platformTheme)
+        return;
+    setPossiblePalette(platformTheme->palette(QPlatformTheme::ToolButtonPalette), "QToolButton");
+    setPossiblePalette(platformTheme->palette(QPlatformTheme::ButtonPalette), "QAbstractButton");
+    setPossiblePalette(platformTheme->palette(QPlatformTheme::HeaderPalette), "QHeaderView");
+    setPossiblePalette(platformTheme->palette(QPlatformTheme::HeaderPalette), "Q3Header");
+    setPossiblePalette(platformTheme->palette(QPlatformTheme::ItemViewPalette), "QAbstractItemView");
+    setPossiblePalette(platformTheme->palette(QPlatformTheme::MessageBoxLabelPelette), "QMessageBoxLabel");
+    setPossiblePalette(platformTheme->palette(QPlatformTheme::TabBarPalette), "QTabBar");
+    setPossiblePalette(platformTheme->palette(QPlatformTheme::LabelPalette), "QLabel");
+    setPossiblePalette(platformTheme->palette(QPlatformTheme::GroupBoxPalette), "QGroupBox");
+    setPossiblePalette(platformTheme->palette(QPlatformTheme::MenuPalette), "QMenu");
+    setPossiblePalette(platformTheme->palette(QPlatformTheme::MenuBarPalette), "QMenuBar");
+    setPossiblePalette(platformTheme->palette(QPlatformTheme::TextEditPalette), "QTextEdit");
+    setPossiblePalette(platformTheme->palette(QPlatformTheme::TextEditPalette), "QTextControl");
+    setPossiblePalette(platformTheme->palette(QPlatformTheme::TextLineEditPalette), "QLineEdit");
 }
 
 #ifndef QT_NO_WHEELEVENT