src/gui/styles/qwindowsxpstyle.cpp
changeset 3 41300fa6a67c
parent 0 1918ee327afb
child 4 3b1da2848fc7
--- a/src/gui/styles/qwindowsxpstyle.cpp	Tue Jan 26 12:42:25 2010 +0200
+++ b/src/gui/styles/qwindowsxpstyle.cpp	Tue Feb 02 00:43:10 2010 +0200
@@ -47,6 +47,7 @@
 #include <private/qpaintengine_raster_p.h>
 #include <private/qapplication_p.h>
 #include <private/qstylehelper_p.h>
+#include <private/qwidget_p.h>
 #include <qlibrary.h>
 #include <qpainter.h>
 #include <qpaintengine.h>
@@ -299,7 +300,11 @@
 
     if (!limboWidget) {
         limboWidget = new QWidget(0);
+        limboWidget->createWinId();
         limboWidget->setObjectName(QLatin1String("xp_limbo_widget"));
+        // We dont need this internal widget to appear in QApplication::topLevelWidgets()
+        if (QWidgetPrivate::allWidgets)
+            QWidgetPrivate::allWidgets->remove(limboWidget);
     }
 
     return limboWidget->winId();
@@ -618,8 +623,7 @@
 
     painter->save();
 
-    QMatrix m = painter->matrix();
-    bool complexXForm = m.m11() != 1.0 || m.m22() != 1.0 || m.m12() != 0.0 || m.m21() != 0.0;
+    bool complexXForm = painter->deviceTransform().type() > QTransform::TxTranslate;
 
     bool translucentToplevel = false;
     QPaintDevice *pdev = painter->device();
@@ -1577,7 +1581,7 @@
                 // This should work, but currently there's an error in the ::drawBackgroundDirectly()
                 // code, when using the HDC directly..
                 if (useGradient) {
-                    QStyleOptionTabWidgetFrame frameOpt = *tab;
+                    QStyleOptionTabWidgetFrameV2 frameOpt = *tab;
                     frameOpt.rect = widget->rect();
                     QRect contentsRect = subElementRect(SE_TabWidgetTabContents, &frameOpt, widget);
                     QRegion reg = option->rect;
@@ -2836,8 +2840,8 @@
 
             State bflags = toolbutton->state & ~State_Sunken;
             State mflags = bflags;
-
-            if (bflags & State_AutoRaise) {
+            bool autoRaise = flags & State_AutoRaise;
+            if (autoRaise) {
                 if (!(bflags & State_MouseOver) || !(bflags & State_Enabled)) {
                     bflags &= ~State_Raised;
                 }
@@ -2856,8 +2860,8 @@
             QStyleOption tool(0);
             tool.palette = toolbutton->palette;
             if (toolbutton->subControls & SC_ToolButton) {
-                if (flags & (State_Sunken | State_On | State_Raised) || !(flags & State_AutoRaise)) {
-                    if (toolbutton->features & QStyleOptionToolButton::MenuButtonPopup) {
+                if (flags & (State_Sunken | State_On | State_Raised) || !autoRaise) {
+                    if (toolbutton->features & QStyleOptionToolButton::MenuButtonPopup && autoRaise) {
                         XPThemeData theme(widget, p, QLatin1String("TOOLBAR"));
                         theme.partId = TP_SPLITBUTTON;
                         theme.rect = button;
@@ -2876,13 +2880,12 @@
                         theme.stateId = stateId;
                         d->drawBackground(theme);
                     } else {
-                        tool.rect = button;
+                        tool.rect = option->rect;
                         tool.state = bflags;
-                        if (widget && !qobject_cast<QToolBar*>(widget->parentWidget())
-                                   && !(bflags & State_AutoRaise))
+                        if (autoRaise) // for tool bars
+                            proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p, widget);
+                        else
                             proxy()->drawPrimitive(PE_PanelButtonBevel, &tool, p, widget);
-                        else
-                            proxy()->drawPrimitive(PE_PanelButtonTool, &tool, p, widget);
                     }
                 }
             }
@@ -2899,13 +2902,40 @@
             QStyleOptionToolButton label = *toolbutton;
             label.state = bflags;
             int fw = 2;
+            if (!autoRaise)
+                label.state &= ~State_Sunken;
             label.rect = button.adjusted(fw, fw, -fw, -fw);
             proxy()->drawControl(CE_ToolButtonLabel, &label, p, widget);
 
             if (toolbutton->subControls & SC_ToolButtonMenu) {
                 tool.rect = menuarea;
                 tool.state = mflags;
-                proxy()->drawPrimitive(PE_IndicatorButtonDropDown, &tool, p, widget);
+                if (autoRaise) {
+                    proxy()->drawPrimitive(PE_IndicatorButtonDropDown, &tool, p, widget);
+                } else {
+                    tool.state = mflags;
+                    menuarea.adjust(-2, 0, 0, 0);
+                    // Draw menu button
+                    if ((bflags & State_Sunken) != (mflags & State_Sunken)){
+                        p->save();
+                        p->setClipRect(menuarea);
+                        tool.rect = option->rect;
+                        proxy()->drawPrimitive(PE_PanelButtonBevel, &tool, p, 0);
+                        p->restore();
+                    }
+                    // Draw arrow
+                    p->save();
+                    p->setPen(option->palette.dark().color());
+                    p->drawLine(menuarea.left(), menuarea.top() + 3,
+                                menuarea.left(), menuarea.bottom() - 3);
+                    p->setPen(option->palette.light().color());
+                    p->drawLine(menuarea.left() - 1, menuarea.top() + 3,
+                                menuarea.left() - 1, menuarea.bottom() - 3);
+
+                    tool.rect = menuarea.adjusted(2, 3, -2, -1);
+                    proxy()->drawPrimitive(PE_IndicatorArrowDown, &tool, p, widget);
+                    p->restore();
+                }
             } else if (toolbutton->features & QStyleOptionToolButton::HasMenu) {
                 int mbi = proxy()->pixelMetric(PM_MenuButtonIndicator, toolbutton, widget);
                 QRect ir = toolbutton->rect;
@@ -3749,12 +3779,19 @@
             QStyleHintReturnMask *mask = qstyleoption_cast<QStyleHintReturnMask *>(returnData);
             const QStyleOptionTitleBar *titlebar = qstyleoption_cast<const QStyleOptionTitleBar *>(option);
             if (mask && titlebar) {
+                // Note certain themes will not return the whole window frame but only the titlebar part when
+                // queried This function needs to return the entire window mask, hence we will only fetch the mask for the
+                // titlebar itself and add the remaining part of the window rect at the bottom.
+                int tbHeight = proxy()->pixelMetric(PM_TitleBarHeight, option, widget);
+                QRect titleBarRect = option->rect;
+                titleBarRect.setHeight(tbHeight);
                 XPThemeData themeData;
                 if (titlebar->titleBarState & Qt::WindowMinimized) {
-                    themeData = XPThemeData(widget, 0, QLatin1String("WINDOW"), WP_MINCAPTION, CS_ACTIVE, option->rect);
+                    themeData = XPThemeData(widget, 0, QLatin1String("WINDOW"), WP_MINCAPTION, CS_ACTIVE, titleBarRect);
                 } else
-                    themeData = XPThemeData(widget, 0, QLatin1String("WINDOW"), WP_CAPTION, CS_ACTIVE, option->rect);
-                mask->region = d->region(themeData);
+                    themeData = XPThemeData(widget, 0, QLatin1String("WINDOW"), WP_CAPTION, CS_ACTIVE, titleBarRect);
+                mask->region = d->region(themeData) +
+                               QRect(0, tbHeight, option->rect.width(), option->rect.height() - tbHeight);
             }
         }
         break;