src/gui/styles/qs60style.cpp
branchRCL_3
changeset 5 d3bac044e0f0
parent 4 3b1da2848fc7
child 7 3f74d0d4af4c
--- a/src/gui/styles/qs60style.cpp	Fri Feb 19 23:40:16 2010 +0200
+++ b/src/gui/styles/qs60style.cpp	Fri Mar 12 15:46:37 2010 +0200
@@ -68,6 +68,10 @@
 #include "qtoolbutton.h"
 #include "qfocusframe.h"
 #include "qformlayout.h"
+#include "qradiobutton.h"
+#include "qcheckbox.h"
+#include "qdesktopwidget.h"
+#include "qprogressbar.h"
 
 #include "private/qtoolbarextension_p.h"
 #include "private/qcombobox_p.h"
@@ -88,10 +92,10 @@
 
 const layoutHeader QS60StylePrivate::m_layoutHeaders[] = {
 // *** generated layout data ***
-{240,320,1,15,"QVGA Landscape"},
-{320,240,1,15,"QVGA Portrait"},
-{360,640,1,15,"NHD Landscape"},
-{640,360,1,15,"NHD Portrait"},
+{240,320,1,16,"QVGA Landscape"},
+{320,240,1,16,"QVGA Portrait"},
+{360,640,1,16,"NHD Landscape"},
+{640,360,1,16,"NHD Portrait"},
 {352,800,1,12,"E90 Landscape"}
 // *** End of generated data ***
 };
@@ -100,10 +104,10 @@
 
 const short QS60StylePrivate::data[][MAX_PIXELMETRICS] = {
 // *** generated pixel metrics ***
-{5,0,-909,0,0,2,0,0,-1,7,12,19,13,13,6,200,-909,-909,-909,20,13,2,0,0,21,7,18,-909,3,3,1,-909,-909,0,1,0,0,12,20,15,15,18,18,1,115,18,0,-909,-909,-909,-909,0,0,16,2,-909,0,0,-909,16,-909,-909,-909,-909,32,18,55,24,55,3,3,4,9,13,-909,5,51,11,5,0,3,3,6,8,3,3,-909,2,-909,-909,-909,-909,5,5,3,1},
-{5,0,-909,0,0,1,0,0,-1,8,14,22,15,15,7,164,-909,-909,-909,19,15,2,0,0,21,8,27,-909,4,4,1,-909,-909,0,7,6,0,13,23,17,17,21,21,7,115,21,0,-909,-909,-909,-909,0,0,15,1,-909,0,0,-909,15,-909,-909,-909,-909,32,21,65,27,65,4,4,5,10,15,-909,5,58,13,5,0,4,4,7,9,4,4,-909,2,-909,-909,-909,-909,6,6,3,1},
-{7,0,-909,0,0,2,0,0,-1,25,69,28,19,19,9,258,-909,-909,-909,23,19,26,0,0,32,25,72,-909,5,5,2,-909,-909,0,7,21,0,17,29,22,22,27,27,7,173,29,0,-909,-909,-909,-909,0,0,25,2,-909,0,0,-909,25,-909,-909,-909,-909,87,27,77,35,77,5,5,6,8,19,-909,7,74,19,7,0,5,5,8,12,5,5,-909,3,-909,-909,-909,-909,7,7,3,1},
-{7,0,-909,0,0,2,0,0,-1,25,68,28,19,19,9,258,-909,-909,-909,31,19,6,0,0,32,25,60,-909,5,5,2,-909,-909,0,7,32,0,17,29,22,22,27,27,7,173,29,0,-909,-909,-909,-909,0,0,26,2,-909,0,0,-909,26,-909,-909,-909,-909,87,27,96,35,96,5,5,6,8,19,-909,7,74,22,7,0,5,5,8,12,5,5,-909,3,-909,-909,-909,-909,7,7,3,1},
+{5,0,-909,0,0,2,0,0,-1,7,12,19,13,13,6,200,-909,-909,-909,20,13,2,0,0,21,7,18,-909,3,3,1,-909,-909,0,1,0,0,12,20,15,15,18,18,1,115,18,0,-909,-909,-909,-909,0,0,16,2,-909,0,0,-909,16,-909,-909,-909,-909,32,18,55,24,55,4,4,4,9,13,-909,5,51,11,5,0,3,3,6,8,3,3,-909,2,-909,-909,-909,-909,5,5,3,1},
+{5,0,-909,0,0,1,0,0,-1,8,14,22,15,15,7,164,-909,-909,-909,19,15,2,0,0,21,8,27,-909,4,4,1,-909,-909,0,7,6,0,13,23,17,17,21,21,7,115,21,0,-909,-909,-909,-909,0,0,15,1,-909,0,0,-909,15,-909,-909,-909,-909,32,21,65,27,65,3,3,5,10,15,-909,5,58,13,5,0,4,4,7,9,4,4,-909,2,-909,-909,-909,-909,6,6,3,1},
+{7,0,-909,0,0,2,0,0,-1,25,69,28,19,19,9,258,-909,-909,-909,23,19,26,0,0,32,25,72,-909,5,5,2,-909,-909,0,7,21,0,17,29,22,22,27,27,7,173,29,0,-909,-909,-909,-909,0,0,25,2,-909,0,0,-909,25,-909,-909,-909,-909,87,27,77,35,77,13,13,6,8,19,-909,7,74,19,7,0,5,5,8,12,5,5,-909,3,-909,-909,-909,-909,7,7,3,1},
+{7,0,-909,0,0,2,0,0,-1,25,68,28,19,19,9,258,-909,-909,-909,31,19,6,0,0,32,25,60,-909,5,5,2,-909,-909,0,7,32,0,17,29,22,22,27,27,7,173,29,0,-909,-909,-909,-909,0,0,26,2,-909,0,0,-909,26,-909,-909,-909,-909,87,27,96,35,96,12,12,6,8,19,-909,7,74,22,7,0,5,5,8,12,5,5,-909,3,-909,-909,-909,-909,7,7,3,1},
 {7,0,-909,0,0,2,0,0,-1,10,20,27,18,18,9,301,-909,-909,-909,29,18,5,0,0,35,7,32,-909,5,5,2,-909,-909,0,2,8,0,16,28,21,21,26,26,2,170,26,0,-909,-909,-909,-909,0,0,21,6,-909,0,0,-909,-909,-909,-909,-909,-909,54,26,265,34,265,5,5,6,3,18,-909,7,72,19,7,0,5,6,8,11,6,5,-909,2,-909,-909,-909,-909,5,5,3,1}
 // *** End of generated data ***
 };
@@ -564,9 +568,11 @@
     const QSize &size, QPainter *painter, SkinElementFlags flags)
 {
     QPixmap result;
+    const int animationFrame = (flags & SF_Animation) ? currentAnimationFrame(part) : 0;
+
     const QString cacheKey =
-        QString::fromLatin1("S60Style: SkinParts=%1 QSize=%2|%3 SkinPartFlags=%4")
-            .arg((int)part).arg(size.width()).arg(size.height()).arg((int)flags);
+        QString::fromLatin1("S60Style: SkinParts=%1 QSize=%2|%3 SkinPartFlags=%4 AnimationFrame=%5")
+            .arg((int)part).arg(size.width()).arg(size.height()).arg((int)flags).arg(animationFrame);
     if (!QPixmapCache::find(cacheKey, result)) {
         result = QS60StylePrivate::part(part, size, painter, flags);
         QPixmapCache::insert(cacheKey, result);
@@ -672,8 +678,7 @@
         s60Color(QS60StyleEnums::CL_QsnHighlightColors, 2, 0));
     // set background image as a texture brush
     palette->setBrush(QPalette::Window, backgroundTexture());
-    // set these as transparent so that styled full screen theme background is visible
-    palette->setColor(QPalette::AlternateBase, Qt::transparent);
+    // set as transparent so that styled full screen theme background is visible
     palette->setBrush(QPalette::Base, Qt::transparent);
     // set button and tooltipbase based on pixel colors
     const QColor buttonColor = colorFromFrameGraphics(SF_ButtonNormal);
@@ -685,6 +690,9 @@
     palette->setColor(QPalette::Midlight, palette->color(QPalette::Button).lighter(125));
     palette->setColor(QPalette::Mid, palette->color(QPalette::Button).darker(150));
     palette->setColor(QPalette::Shadow, Qt::black);
+    QColor alternateBase = palette->light().color();
+    alternateBase.setAlphaF(0.8);
+    palette->setColor(QPalette::AlternateBase, alternateBase);
 
     QApplication::setPalette(*palette); //calling QApplication::setPalette clears palette hash
     setThemePaletteHash(palette);
@@ -775,6 +783,11 @@
     QApplication::setPalette(widgetPalette, "QComboBox");
     widgetPalette = *palette;
 
+    widgetPalette.setColor(QPalette::WindowText, s60Color(QS60StyleEnums::CL_QsnTextColors, 7, 0));
+    QApplication::setPalette(widgetPalette, "QRadioButton");
+    QApplication::setPalette(widgetPalette, "QCheckBox");
+    widgetPalette = *palette;
+
     widgetPalette.setColor(QPalette::WindowText, mainAreaTextColor);
     widgetPalette.setColor(QPalette::Button, QApplication::palette().color(QPalette::Button));
     widgetPalette.setColor(QPalette::Dark, mainAreaTextColor.darker());
@@ -813,13 +826,13 @@
             //ratio of 1:2 for horizontal tab bars (and 2:1 for vertical ones).
             result.setWidth(result.height() >> 1);
             break;
-            
+
         case QS60StyleEnums::SP_QgnGrafNsliderEndLeft:
         case QS60StyleEnums::SP_QgnGrafNsliderEndRight:
         case QS60StyleEnums::SP_QgnGrafNsliderMiddle:
             result.setWidth(result.height() >> 1);
             break;
-            
+
         case QS60StyleEnums::SP_QgnGrafNsliderMarker:
         case QS60StyleEnums::SP_QgnGrafNsliderMarkerSelected:
             result.scale(pixelMetric(QStyle::PM_SliderLength),
@@ -922,10 +935,10 @@
                 horizontal ? QS60StylePrivate::SE_ScrollBarGrooveHorizontal : QS60StylePrivate::SE_ScrollBarGrooveVertical;
             QS60StylePrivate::drawSkinElement(grooveElement, painter, grooveRect, flags);
 
-            const QStyle::SubControls subControls = optionSlider->subControls;
+            const SubControls subControls = optionSlider->subControls;
 
             // select correct slider (horizontal/vertical/pressed)
-            const bool sliderPressed = ((optionSlider->state & QStyle::State_Sunken) && (subControls & SC_ScrollBarSlider));
+            const bool sliderPressed = ((optionSlider->state & State_Sunken) && (subControls & SC_ScrollBarSlider));
             const QS60StylePrivate::SkinElements handleElement =
                 horizontal ?
                     ( sliderPressed ?
@@ -946,13 +959,13 @@
             const bool horizontal = optionSlider->orientation == Qt::Horizontal;
 
             //Highlight
-/*            if (optionSlider->state & QStyle::State_HasFocus)
+/*            if (optionSlider->state & State_HasFocus)
                 drawPrimitive(PE_FrameFocusRect, optionSlider, painter, widget);*/
-            
+
             //Groove graphics
             if (QS60StylePrivate::hasSliderGrooveGraphic()) {
-                const QS60StylePrivate::SkinElements grooveElement = horizontal ? 
-                    QS60StylePrivate::SE_SliderGrooveHorizontal : 
+                const QS60StylePrivate::SkinElements grooveElement = horizontal ?
+                    QS60StylePrivate::SE_SliderGrooveHorizontal :
                     QS60StylePrivate::SE_SliderGrooveVertical;
                 QS60StylePrivate::drawSkinElement(grooveElement, painter, sliderGroove, flags);
             } else {
@@ -972,10 +985,10 @@
             //Handle graphics
             const QRect sliderHandle = subControlRect(control, optionSlider, SC_SliderHandle, widget);
             QS60StylePrivate::SkinElements handleElement;
-            if (optionSlider->state & QStyle::State_Sunken)
+            if (optionSlider->state & State_Sunken)
                 handleElement =
                         horizontal ? QS60StylePrivate::SE_SliderHandleSelectedHorizontal : QS60StylePrivate::SE_SliderHandleSelectedVertical;
-            else    
+            else
                 handleElement =
                     horizontal ? QS60StylePrivate::SE_SliderHandleHorizontal : QS60StylePrivate::SE_SliderHandleVertical;
             QS60StylePrivate::drawSkinElement(handleElement, painter, sliderHandle, flags);
@@ -994,7 +1007,7 @@
             buttonOption.QStyleOption::operator=(*cmb);
             const int maxHeight = cmbxFrame.height();
             const int maxWidth = cmbxFrame.width() - cmbxEditField.width();
-            const int topLeftPoint = direction ? 
+            const int topLeftPoint = direction ?
                 (cmbxEditField.right() + 1) : (cmbxEditField.left() + 1 - maxWidth);
             const QRect buttonRect(topLeftPoint, cmbxEditField.top(), maxWidth, maxHeight);
             buttonOption.rect = buttonRect;
@@ -1020,102 +1033,62 @@
 #ifndef QT_NO_TOOLBUTTON
     case CC_ToolButton:
         if (const QStyleOptionToolButton *toolBtn = qstyleoption_cast<const QStyleOptionToolButton *>(option)) {
-            const State bflags = toolBtn->state;
+            State bflags = toolBtn->state & ~State_Sunken;
+
+            if (bflags & State_AutoRaise) {
+                if (!(bflags & State_MouseOver) || !(bflags & State_Enabled)) {
+                    bflags &= ~State_Raised;
+                }
+            }
+            State mflags = bflags;
+            if (toolBtn->state & State_Sunken) {
+                if (toolBtn->activeSubControls & SC_ToolButton)
+                    bflags |= State_Sunken;
+                mflags |= State_Sunken;
+            }
+
             const QRect button(subControlRect(control, toolBtn, SC_ToolButton, widget));
             QRect menuRect = QRect();
             if (toolBtn->subControls & SC_ToolButtonMenu)
                 menuRect = subControlRect(control, toolBtn, SC_ToolButtonMenu, widget);
 
-            QStyleOptionToolButton toolButton = *toolBtn;
-
-            if (sub&SC_ToolButton) {
+            if (toolBtn->subControls & SC_ToolButton) {
                 QStyleOption tool(0);
                 tool.palette = toolBtn->palette;
 
-                // Check if toolbutton is in toolbar.
-                QToolBar *toolBar = 0;
-                if (widget)
-                    toolBar = qobject_cast<QToolBar *>(widget->parentWidget());
-
-                if (bflags & (State_Sunken | State_On | State_Raised)) {
+                if (bflags & (State_Sunken | State_On | State_Raised | State_Enabled)) {
                     tool.rect = button.unite(menuRect);
                     tool.state = bflags;
-
-                    // todo: I'd like to move extension button next to where last button is
-                    // however, the painter seems to want to clip the button rect even if I turn of the clipping.
-                    if (toolBar && (qobject_cast<const QToolBarExtension *>(widget))){
-                        /*QList<QAction *> actionList = toolBar->actions();
-                        const int actionCount = actionList.count();
-                        const int toolbarWidth = toolBar->width();
-                        const int extButtonWidth = pixelMetric(PM_ToolBarExtensionExtent, option, widget);
-                        const int toolBarButtonWidth = pixelMetric(PM_ToolBarIconSize, option, widget);
-                        const int frame = pixelMetric(PM_ToolBarFrameWidth, option, widget);
-                        const int margin = pixelMetric(PM_ToolBarItemMargin, option, widget);
-                        const int border = frame + margin;
-                        const int spacing = pixelMetric(PM_ToolBarItemSpacing, option, widget);
-                        const int toolBarButtonArea = toolbarWidth - extButtonWidth - spacing - 2*border;
-                        const int numberOfVisibleButtons = toolBarButtonArea / toolBarButtonWidth;
-                        // new extension button place is after border and all the other visible buttons (with spacings)
-                        const int newXForExtensionButton = numberOfVisibleButtons * toolBarButtonWidth + (numberOfVisibleButtons-1)*spacing + border;
-                        painter->save();
-                        painter->setClipping(false);
-                        tool.rect.translate(-newXForExtensionButton,0);
-                        painter->restore();*/
-                    }
-
-                    if (toolBar){
-                        /*if (toolBar->orientation() == Qt::Vertical){
-                            // todo: I'd like to make all vertical buttons the same size, but again the painter
-                            // prefers to use clipping for button rects, even though clipping has been set off.
-                            painter->save();
-                            painter->setClipping(false);
-
-                            const int origWidth = tool.rect.width();
-                            const int newWidth = toolBar->width()-2*pixelMetric(PM_ToolBarFrameWidth, option, widget);
-                            painter->translate(origWidth-newWidth,0);
-                            tool.rect.translate(origWidth-tool.rect.width(),0);
-                            tool.rect.setWidth(newWidth);
-
-                            if (option->state & QStyle::State_Sunken)
-                                QS60StylePrivate::drawSkinElement(QS60StylePrivate::SE_ToolBarButtonPressed, painter, tool.rect, flags);
-                            else
-                                QS60StylePrivate::drawSkinElement(QS60StylePrivate::SE_ToolBarButton, painter, tool.rect, flags);
-
-                        }*/
-                        if (option->state & QStyle::State_Sunken)
-                            QS60StylePrivate::drawSkinElement(QS60StylePrivate::SE_ToolBarButtonPressed, painter, tool.rect, flags);
-                        else
-                            QS60StylePrivate::drawSkinElement(QS60StylePrivate::SE_ToolBarButton, painter, tool.rect, flags);
-                        /*
-                        if (toolBar->orientation() == Qt::Vertical)
-                            painter->restore();
-                            */
-                    } else {
-                        drawPrimitive(PE_PanelButtonTool, &tool, painter, widget);
-                    }
-
-                    if (toolButton.subControls & SC_ToolButtonMenu) {
-                        tool.rect = menuRect;
-                        tool.state = bflags;
-                        drawPrimitive(PE_IndicatorArrowDown, &tool, painter, widget);
-                    }
+                    const QToolButton *toolButtonWidget = qobject_cast<const QToolButton *>(widget);
+                    QS60StylePrivate::SkinElements element;
+                    if (toolButtonWidget)
+                        element = (toolButtonWidget->isDown()) ? QS60StylePrivate::SE_ToolBarButtonPressed : QS60StylePrivate::SE_ToolBarButton;
+                    else
+                        element = (option->state & State_Sunken) ? QS60StylePrivate::SE_ToolBarButtonPressed : QS60StylePrivate::SE_ToolBarButton;
+                    QS60StylePrivate::drawSkinElement(element, painter, tool.rect, flags);
+                    drawPrimitive(PE_PanelButtonTool, &tool, painter, widget);
+                }
+                if (toolBtn->subControls & SC_ToolButtonMenu) {
+                    tool.rect = menuRect;
+                    tool.state = mflags;
+                    drawPrimitive(PE_IndicatorArrowDown, &tool, painter, widget);
                 }
             }
-
+            QStyleOptionToolButton toolButton = *toolBtn;
             if (toolBtn->features & QStyleOptionToolButton::Arrow) {
-                QStyle::PrimitiveElement pe;
+                PrimitiveElement pe;
                 switch (toolBtn->arrowType) {
                     case Qt::LeftArrow:
-                        pe = QStyle::PE_IndicatorArrowLeft;
+                        pe = PE_IndicatorArrowLeft;
                         break;
                     case Qt::RightArrow:
-                        pe = QStyle::PE_IndicatorArrowRight;
+                        pe = PE_IndicatorArrowRight;
                         break;
                     case Qt::UpArrow:
-                        pe = QStyle::PE_IndicatorArrowUp;
+                        pe = PE_IndicatorArrowUp;
                         break;
                     case Qt::DownArrow:
-                        pe = QStyle::PE_IndicatorArrowDown;
+                        pe = PE_IndicatorArrowDown;
                         break;
                     default:
                         break; }
@@ -1199,7 +1172,7 @@
             // Draw frame
             const QRect textRect = subControlRect(CC_GroupBox, option, SC_GroupBoxLabel, widget);
             const QRect checkBoxRect = subControlRect(CC_GroupBox, option, SC_GroupBoxCheckBox, widget);
-            if (groupBox->subControls & QStyle::SC_GroupBoxFrame) {
+            if (groupBox->subControls & SC_GroupBoxFrame) {
                 QStyleOptionFrameV2 frame;
                 frame.QStyleOption::operator=(*groupBox);
                 frame.features = groupBox->features;
@@ -1210,14 +1183,14 @@
             }
 
             // Draw title
-            if ((groupBox->subControls & QStyle::SC_GroupBoxLabel) && !groupBox->text.isEmpty()) {
+            if ((groupBox->subControls & SC_GroupBoxLabel) && !groupBox->text.isEmpty()) {
                 const QColor textColor = groupBox->textColor;
                 painter->save();
 
                 if (textColor.isValid())
                     painter->setPen(textColor);
                 int alignment = int(groupBox->textAlignment);
-                if (!styleHint(QStyle::SH_UnderlineShortcut, option, widget))
+                if (!styleHint(SH_UnderlineShortcut, option, widget))
                     alignment |= Qt::TextHideMnemonic;
 
                 drawItemText(painter, textRect,  Qt::TextShowMnemonic | Qt::AlignHCenter | Qt::AlignVCenter | alignment,
@@ -1249,6 +1222,31 @@
     Q_D(const QS60Style);
     const QS60StylePrivate::SkinElementFlags flags = (option->state & State_Enabled) ?  QS60StylePrivate::SF_StateEnabled : QS60StylePrivate::SF_StateDisabled;
     switch (element) {
+        case CE_CheckBox:
+        case CE_RadioButton:
+            if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(option)) {
+                bool isRadio = (element == CE_RadioButton);
+                // Highlight needs to be drawn first, as it goes "underneath" the text and indicator.
+                if (btn->state & State_HasFocus) {
+                    QStyleOptionFocusRect fropt;
+                    fropt.QStyleOption::operator=(*btn);
+                    fropt.rect = subElementRect(isRadio ? SE_RadioButtonFocusRect
+                                                        : SE_CheckBoxFocusRect, btn, widget);
+                    drawPrimitive(PE_FrameFocusRect, &fropt, painter, widget);
+                }
+                QStyleOptionButton subopt = *btn;
+
+                subopt.rect = subElementRect(isRadio ? SE_RadioButtonIndicator
+                                                     : SE_CheckBoxIndicator, btn, widget);
+                drawPrimitive(isRadio ? PE_IndicatorRadioButton : PE_IndicatorCheckBox,
+                              &subopt, painter, widget);
+                subopt.rect = subElementRect(isRadio ? SE_RadioButtonContents
+                                                     : SE_CheckBoxContents, btn, widget);
+
+                drawControl(isRadio ? CE_RadioButtonLabel : CE_CheckBoxLabel, &subopt, painter, widget);
+            }
+            break;
+
     case CE_PushButton:
         if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(option)) {
 
@@ -1261,13 +1259,13 @@
         break;
     case CE_PushButtonBevel:
         if (const QStyleOptionButton *button = qstyleoption_cast<const QStyleOptionButton *>(option)) {
-            const bool isDisabled = !(option->state & QStyle::State_Enabled);
+            const bool isDisabled = !(option->state & State_Enabled);
             const bool isFlat = button->features & QStyleOptionButton::Flat;
             QS60StyleEnums::SkinParts skinPart;
             QS60StylePrivate::SkinElements skinElement;
             if (!isDisabled) {
-                const bool isPressed = (option->state & QStyle::State_Sunken) ||
-                                       (option->state & QStyle::State_On);
+                const bool isPressed = (option->state & State_Sunken) ||
+                                       (option->state & State_On);
                 if (isFlat) {
                     skinPart =
                         isPressed ? QS60StyleEnums::SP_QsnFrButtonTbCenterPressed : QS60StyleEnums::SP_QsnFrButtonTbCenter;
@@ -1292,7 +1290,7 @@
         if (const QStyleOptionToolButton *toolBtn = qstyleoption_cast<const QStyleOptionToolButton *>(option)) {
             QStyleOptionToolButton optionToolButton = *toolBtn;
 
-            if (!optionToolButton.icon.isNull() && (optionToolButton.state & QStyle::State_Sunken)
+            if (!optionToolButton.icon.isNull() && (optionToolButton.state & State_Sunken)
                     && (optionToolButton.state & State_Enabled)) {
 
                     const QIcon::State state = optionToolButton.state & State_On ? QIcon::On : QIcon::Off;
@@ -1351,8 +1349,8 @@
             painter->save();
 
             painter->setClipRect(voptAdj.rect);
-            const bool isSelected = (vopt->state & QStyle::State_Selected);
-            const bool hasFocus = (vopt->state & QStyle::State_HasFocus);
+            const bool isSelected = (vopt->state & State_Selected);
+            const bool hasFocus = (vopt->state & State_HasFocus);
 
             bool isScrollBarVisible = false;
             int scrollBarWidth = 0;
@@ -1426,8 +1424,8 @@
             }
 
              // draw the icon
-             const QIcon::Mode mode = (voptAdj.state & QStyle::State_Enabled) ? QIcon::Normal : QIcon::Disabled;
-             const QIcon::State state = voptAdj.state & QStyle::State_Open ? QIcon::On : QIcon::Off;
+             const QIcon::Mode mode = (voptAdj.state & State_Enabled) ? QIcon::Normal : QIcon::Disabled;
+             const QIcon::State state = voptAdj.state & State_Open ? QIcon::On : QIcon::Off;
              voptAdj.icon.paint(painter, iconRect, voptAdj.decorationAlignment, mode, state);
 
              // Draw selection check mark. Show check mark only in multi selection modes.
@@ -1439,29 +1437,29 @@
 
                  QStyleOptionViewItemV4 checkMarkOption(voptAdj);
                  // Draw selection mark.
-                 if (voptAdj.state & QStyle::State_Selected && !singleSelection) {
+                 if (voptAdj.state & State_Selected && !singleSelection) {
                      checkMarkOption.rect = selectionRect;
-                     drawPrimitive(QStyle::PE_IndicatorViewItemCheck, &checkMarkOption, painter, widget);
+                     drawPrimitive(PE_IndicatorViewItemCheck, &checkMarkOption, painter, widget);
                      if ( textRect.right() > selectionRect.left() )
                          textRect.setRight(selectionRect.left());
                  } else if (singleSelection &&
                      voptAdj.features & QStyleOptionViewItemV2::HasCheckIndicator &&
                      selectionRect.isValid()) {
                      checkMarkOption.rect = selectionRect;
-                     checkMarkOption.state = checkMarkOption.state & ~QStyle::State_HasFocus;
+                     checkMarkOption.state = checkMarkOption.state & ~State_HasFocus;
 
                      switch (vopt->checkState) {
                      case Qt::Unchecked:
-                         checkMarkOption.state |= QStyle::State_Off;
+                         checkMarkOption.state |= State_Off;
                          break;
                      case Qt::PartiallyChecked:
-                         checkMarkOption.state |= QStyle::State_NoChange;
+                         checkMarkOption.state |= State_NoChange;
                          break;
                      case Qt::Checked:
-                         checkMarkOption.state |= QStyle::State_On;
+                         checkMarkOption.state |= State_On;
                          break;
                      }
-                     drawPrimitive(QStyle::PE_IndicatorViewItemCheck, &checkMarkOption, painter, widget);
+                     drawPrimitive(PE_IndicatorViewItemCheck, &checkMarkOption, painter, widget);
                  }
              }
 
@@ -1486,7 +1484,7 @@
     case CE_TabBarTabShape:
         if (const QStyleOptionTabV3 *optionTab = qstyleoption_cast<const QStyleOptionTabV3 *>(option)) {
             QStyleOptionTabV3 optionTabAdj = *optionTab;
-            const bool isSelected = optionTab->state & QStyle::State_Selected;
+            const bool isSelected = optionTab->state & State_Selected;
             const bool directionMirrored = (optionTab->direction == Qt::RightToLeft);
             QS60StylePrivate::SkinElements skinElement;
             switch (optionTab->shape) {
@@ -1521,9 +1519,9 @@
                     skinElement==QS60StylePrivate::SE_TabBarTabSouthActive||
                     skinElement==QS60StylePrivate::SE_TabBarTabWestActive) {
                 const int borderThickness =
-                    QS60StylePrivate::pixelMetric(QStyle::PM_DefaultFrameWidth);
+                    QS60StylePrivate::pixelMetric(PM_DefaultFrameWidth);
                 const int tabOverlap =
-                    QS60StylePrivate::pixelMetric(QStyle::PM_TabBarTabOverlap) - borderThickness;
+                    QS60StylePrivate::pixelMetric(PM_TabBarTabOverlap) - borderThickness;
                 //todo: draw navi wipe behind tabbar - must be drawn with first draw
 
                 if (skinElement==QS60StylePrivate::SE_TabBarTabEastInactive||
@@ -1546,9 +1544,9 @@
             QStyleOptionTabV3 optionTab = *tab;
             QRect tr = optionTab.rect;
             const bool directionMirrored = (optionTab.direction == Qt::RightToLeft);
-            const int borderThickness = QS60StylePrivate::pixelMetric(QStyle::PM_DefaultFrameWidth);
+            const int borderThickness = QS60StylePrivate::pixelMetric(PM_DefaultFrameWidth);
             const int tabOverlap =
-                QS60StylePrivate::pixelMetric(QStyle::PM_TabBarTabOverlap) - borderThickness;
+                QS60StylePrivate::pixelMetric(PM_TabBarTabOverlap) - borderThickness;
             const QRect windowRect = painter->window();
 
             switch (tab->shape) {
@@ -1602,12 +1600,12 @@
                 m.rotate(newRotation);
                 painter->setTransform(m, true);
             }
-            tr.adjust(0, 0, pixelMetric(QStyle::PM_TabBarTabShiftHorizontal, tab, widget),
-                            pixelMetric(QStyle::PM_TabBarTabShiftVertical, tab, widget));
+            tr.adjust(0, 0, pixelMetric(PM_TabBarTabShiftHorizontal, tab, widget),
+                            pixelMetric(PM_TabBarTabShiftVertical, tab, widget));
 
             if (selected) {
-                tr.setBottom(tr.bottom() - pixelMetric(QStyle::PM_TabBarTabShiftVertical, tab, widget));
-                tr.setRight(tr.right() - pixelMetric(QStyle::PM_TabBarTabShiftHorizontal, tab, widget));
+                tr.setBottom(tr.bottom() - pixelMetric(PM_TabBarTabShiftVertical, tab, widget));
+                tr.setRight(tr.right() - pixelMetric(PM_TabBarTabShiftHorizontal, tab, widget));
             }
 
             int alignment = Qt::AlignCenter | Qt::TextShowMnemonic;
@@ -1648,17 +1646,20 @@
                 // busy indicator
                 const QS60StylePrivate::SkinElementFlag orientationFlag = optionProgressBar->orientation == Qt::Horizontal ?
                     QS60StylePrivate::SF_PointNorth : QS60StylePrivate::SF_PointWest;
-                QS60StylePrivate::drawSkinPart(QS60StyleEnums::SP_QgnGrafBarWait, painter, progressRect, flags | orientationFlag);
+
+                QS60StylePrivate::drawSkinPart(QS60StyleEnums::SP_QgnGrafBarWaitAnim,
+                        painter, progressRect, flags | orientationFlag | QS60StylePrivate::SF_Animation );
             } else {
                 const qreal progressFactor = (optionProgressBar->minimum == optionProgressBar->maximum) ? 1.0
                     : (qreal)optionProgressBar->progress / optionProgressBar->maximum;
+                const int frameWidth = pixelMetric(PM_DefaultFrameWidth, option, widget);
                 if (optionProgressBar->orientation == Qt::Horizontal) {
                     progressRect.setWidth(int(progressRect.width() * progressFactor));
                     if(optionProgressBar->direction == Qt::RightToLeft)
-                        progressRect.translate(optionProgressBar->rect.width()-progressRect.width(), 0);
-                    progressRect.adjust(1, 0, -1, 0);
+                        progressRect.translate(optionProgressBar->rect.width() - progressRect.width(), 0);
+                    progressRect.adjust(frameWidth, 0, -frameWidth, 0);
                 } else {
-                    progressRect.adjust(0, 1, 0, -1);
+                    progressRect.adjust(0, frameWidth, 0, -frameWidth);
                     progressRect.setTop(progressRect.bottom() - int(progressRect.height() * progressFactor));
                 }
 
@@ -1714,9 +1715,9 @@
             QRect textRect = subElementRect(SE_ItemViewItemText, &optionMenuItem, widget);
 
             //todo: move the vertical spacing stuff into subElementRect
-            const int vSpacing = QS60StylePrivate::pixelMetric(QStyle::PM_LayoutVerticalSpacing);
+            const int vSpacing = QS60StylePrivate::pixelMetric(PM_LayoutVerticalSpacing);
             if (checkable){
-                const int hSpacing = QS60StylePrivate::pixelMetric(QStyle::PM_LayoutHorizontalSpacing);
+                const int hSpacing = QS60StylePrivate::pixelMetric(PM_LayoutHorizontalSpacing);
                 QStyleOptionMenuItem optionCheckBox;
                 optionCheckBox.QStyleOptionMenuItem::operator=(*menuItem);
                 optionCheckBox.rect.setWidth(pixelMetric(PM_IndicatorWidth));
@@ -1754,7 +1755,7 @@
                 QStyleOptionMenuItem arrowOptions;
                 arrowOptions.QStyleOption::operator=(*menuItem);
                 const int indicatorWidth = (pixelMetric(PM_ListViewIconSize, option, widget) >> 1) +
-                    pixelMetric(QStyle::PM_LayoutVerticalSpacing, option, widget);
+                    pixelMetric(PM_LayoutVerticalSpacing, option, widget);
                 if (optionMenuItem.direction == Qt::LeftToRight)
                     arrowOptions.rect.setLeft(textRect.right());
                 arrowOptions.rect.setWidth(indicatorWidth);
@@ -1925,8 +1926,7 @@
         break;
     case CE_MenuScroller:
         break;
-    case CE_FocusFrame:
-        {
+    case CE_FocusFrame: {
             // The pen width should nearly fill the layoutspacings around the widget
             const int penWidth =
                 qMin(pixelMetric(QS60Style::PM_LayoutVerticalSpacing), pixelMetric(QS60Style::PM_LayoutHorizontalSpacing))
@@ -1985,11 +1985,21 @@
 */
 void QS60Style::drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const
 {
-    Q_D(const QS60Style);
     const QS60StylePrivate::SkinElementFlags flags = (option->state & State_Enabled) ?  QS60StylePrivate::SF_StateEnabled : QS60StylePrivate::SF_StateDisabled;
     bool commonStyleDraws = false;
 
     switch (element) {
+        case PE_FrameFocusRect: {
+            //Draw themed highlight to radiobuttons and checkboxes.
+            //For other widgets skip, unless palette has been modified. In that case, draw with commonstyle.
+            if (option->palette.highlight().color() == QS60StylePrivate::themePalette()->highlight().color())
+                if ((qstyleoption_cast<const QStyleOptionFocusRect *>(option) &&
+                    (qobject_cast<const QRadioButton *>(widget) || qobject_cast<const QCheckBox *>(widget))))
+                        QS60StylePrivate::drawSkinElement(QS60StylePrivate::SE_ListHighlight, painter, option->rect, flags);
+            else
+                commonStyleDraws = true;
+            }
+        break;
 #ifndef QT_NO_LINEEDIT
     case PE_PanelLineEdit:
         if (const QStyleOptionFrame *lineEdit = qstyleoption_cast<const QStyleOptionFrame *>(option)) {
@@ -2004,15 +2014,14 @@
         }
     break;
 #endif // QT_NO_LINEEDIT
-    case PE_IndicatorCheckBox:
-        {
+    case PE_IndicatorCheckBox: {
             // Draw checkbox indicator as color skinned graphics.
-            const QS60StyleEnums::SkinParts skinPart = (option->state & QStyle::State_On) ?
+            const QS60StyleEnums::SkinParts skinPart = (option->state & State_On) ?
                 QS60StyleEnums::SP_QgnIndiCheckboxOn : QS60StyleEnums::SP_QgnIndiCheckboxOff;
             painter->save();
 
-            QColor themeColor = QS60StylePrivate::themePalette()->windowText().color();
-            QColor windowTextColor = option->palette.windowText().color();
+            const QColor themeColor = QS60StylePrivate::themePalette()->windowText().color();
+            const QColor windowTextColor = option->palette.windowText().color();
 
             if (themeColor != windowTextColor)
                 painter->setPen(windowTextColor);
@@ -2032,7 +2041,7 @@
                 if (checkBoxVisible && singleSelection) {
                     drawPrimitive(PE_IndicatorCheckBox, option, painter, widget);
                 // ... or normal "tick" selection at the end.
-                } else if (option->state & QStyle::State_Selected) {
+                } else if (option->state & State_Selected) {
                     QRect tickRect = option->rect;
                     const int frameBorderWidth = QS60StylePrivate::pixelMetric(PM_Custom_FrameCornerWidth);
                     // adjust tickmark rect to exclude frame border
@@ -2059,15 +2068,15 @@
             buttonRect.adjust(0, -newY, -1, -newY);
 
             painter->save();
-            QColor themeColor = d->s60Color(QS60StyleEnums::CL_QsnTextColors, 6, option);
-            QColor buttonTextColor = option->palette.buttonText().color();
+            const QColor themeColor = QS60StylePrivate::s60Color(QS60StyleEnums::CL_QsnTextColors, 6, option);
+            const QColor buttonTextColor = option->palette.buttonText().color();
             if (themeColor != buttonTextColor)
                 painter->setPen(buttonTextColor);
             else
                 painter->setPen(themeColor);
 
             // Draw radiobutton indicator as color skinned graphics.
-            QS60StyleEnums::SkinParts skinPart = (option->state & QStyle::State_On) ?
+            QS60StyleEnums::SkinParts skinPart = (option->state & State_On) ?
                 QS60StyleEnums::SP_QgnIndiRadiobuttOn : QS60StyleEnums::SP_QgnIndiRadiobuttOff;
             QS60StylePrivate::drawSkinPart(skinPart, painter, buttonRect,
                 (flags | QS60StylePrivate::SF_ColorSkinned));
@@ -2077,15 +2086,14 @@
     case PE_PanelButtonCommand:
     case PE_PanelButtonTool:
     case PE_PanelButtonBevel:
-    case PE_FrameButtonBevel: {
+    case PE_FrameButtonBevel:
         if (QS60StylePrivate::canDrawThemeBackground(option->palette.base())) {
-            const bool isPressed = option->state & QStyle::State_Sunken;
+            const bool isPressed = option->state & State_Sunken;
             const QS60StylePrivate::SkinElements skinElement =
                 isPressed ? QS60StylePrivate::SE_ButtonPressed : QS60StylePrivate::SE_ButtonNormal;
             QS60StylePrivate::drawSkinElement(skinElement, painter, option->rect, flags);
         } else {
             commonStyleDraws = true;
-            }
         }
         break;
 #ifndef QT_NO_TOOLBUTTON
@@ -2207,7 +2215,6 @@
         break;
 #ifndef QT_NO_ITEMVIEWS
     case PE_PanelItemViewItem:
-    case PE_PanelItemViewRow: // ### Qt 5: remove
         break;
 #endif //QT_NO_ITEMVIEWS
 
@@ -2276,7 +2283,23 @@
             }
         }
         break;
-
+    case PE_PanelItemViewRow: // ### Qt 5: remove
+#ifndef QT_NO_ITEMVIEWS
+        if (const QStyleOptionViewItemV4 *vopt = qstyleoption_cast<const QStyleOptionViewItemV4 *>(option)) {
+            if (vopt->palette.base().texture().cacheKey() != QS60StylePrivate::m_themePalette->base().texture().cacheKey()) {
+                //QPalette::Base has been changed, let commonstyle draw the item
+                commonStyleDraws = true;
+            } else {
+                QPalette::ColorGroup cg = vopt->state & State_Enabled ? QPalette::Normal : QPalette::Disabled;
+                if (cg == QPalette::Normal && !(vopt->state & State_Active))
+                    cg = QPalette::Inactive;
+                if (vopt->features & QStyleOptionViewItemV2::Alternate)
+                    painter->fillRect(vopt->rect, vopt->palette.brush(cg, QPalette::AlternateBase));
+                //apart from alternate base, no background for list item is drawn for S60Style
+            }
+        }
+#endif
+        break;
     case PE_PanelScrollAreaCorner:
         break;
 
@@ -2361,8 +2384,7 @@
             if (const QStyleOptionFrame *f = qstyleoption_cast<const QStyleOptionFrame *>(opt))
                 sz += QSize(2 * f->lineWidth, 4 * f->lineWidth);
             break;
-        case CT_TabBarTab:
-            {
+        case CT_TabBarTab: {
                 const QSize naviPaneSize = QS60StylePrivate::naviPaneSize();
                 sz = QCommonStyle::sizeFromContents(ct, opt, csz, widget);
                 if (naviPaneSize.height() > sz.height())
@@ -2374,8 +2396,19 @@
             if (QS60StylePrivate::isTouchSupported())
                 //Make itemview easier to use in touch devices
                 //QCommonStyle does not adjust height with horizontal margin, it only adjusts width
-                sz.setHeight(sz.height() + 2 * pixelMetric(QStyle::PM_FocusFrameVMargin));
+                sz.setHeight(sz.height() + 2 * pixelMetric(PM_FocusFrameVMargin));
             break;
+#ifndef QT_NO_COMBOBOX
+        case CT_ComboBox: {
+                // Fixing Ui design issues with too wide QComboBoxes and greedy SizeHints
+                // Make sure, that the combobox says within the screen.
+                const QSize desktopContentSize = QApplication::desktop()->availableGeometry().size()
+                        -QSize(pixelMetric(PM_LayoutLeftMargin) + pixelMetric(PM_LayoutRightMargin), 0);
+                sz = QCommonStyle::sizeFromContents(ct, opt, csz, widget).
+                        boundedTo(desktopContentSize);
+            }
+            break;
+#endif
         default:
             sz = QCommonStyle::sizeFromContents( ct, opt, csz, widget);
             break;
@@ -2414,7 +2447,7 @@
             retValue = QPalette::Base;
             break;
         case SH_ItemView_ActivateItemOnSingleClick:
-            retValue = true;
+            retValue = QS60StylePrivate::isSingleClickUi();
             break;
         case SH_ProgressDialog_TextLabelAlignment:
             retValue = (QApplication::layoutDirection() == Qt::LeftToRight) ?
@@ -2526,7 +2559,7 @@
         if (const QStyleOptionSpinBox *spinbox = qstyleoption_cast<const QStyleOptionSpinBox *>(option)) {
             const int frameThickness = spinbox->frame ? pixelMetric(PM_SpinBoxFrameWidth, spinbox, widget) : 0;
             const int buttonMargin = spinbox->frame ? 2 : 0;
-            const int buttonWidth = QS60StylePrivate::pixelMetric(QStyle::PM_ButtonIconSize) + 2 * buttonMargin;
+            const int buttonWidth = QS60StylePrivate::pixelMetric(PM_ButtonIconSize) + 2 * buttonMargin;
             QSize buttonSize;
             buttonSize.setHeight(qMax(8, spinbox->rect.height() - frameThickness));
             //width should at least be equal to height
@@ -2575,34 +2608,36 @@
             ret = cmb->rect;
             const int width = cmb->rect.width();
             const int height = cmb->rect.height();
-            const int buttonIconSize = QS60StylePrivate::pixelMetric(QStyle::PM_ButtonIconSize);
+            const int buttonIconSize = QS60StylePrivate::pixelMetric(PM_ButtonIconSize);
             const int buttonMargin = cmb->frame ? 2 : 0;
             // lets use spinbox frame here as well, as no combobox specific value available.
             const int frameThickness = cmb->frame ? pixelMetric(PM_SpinBoxFrameWidth, cmb, widget) : 0;
             const int buttonWidth = qMax(cmb->rect.height(), buttonIconSize);
-            const int xposMod = (cmb->rect.x()) + width - buttonMargin - buttonWidth;
-            const int ypos = cmb->rect.y();
 
             QSize buttonSize;
             buttonSize.setWidth(buttonWidth + 2 * buttonMargin);
             buttonSize.setHeight(qMax(8, (cmb->rect.height() >> 1) - frameThickness)); //buttons should be squares
             buttonSize = buttonSize.expandedTo(QApplication::globalStrut());
             switch (scontrol) {
-                case SC_ComboBoxArrow:
+                case SC_ComboBoxArrow: {
+                    const int xposMod = cmb->rect.x() + width - buttonMargin - buttonWidth;
+                    const int ypos = cmb->rect.y();
                     ret.setRect(xposMod, ypos + buttonMargin, buttonWidth, height - 2 * buttonMargin);
+                    }
                     break;
                 case SC_ComboBoxEditField: {
-                    const int withFrameX = cmb->rect.x() + cmb->rect.width() - frameThickness - buttonSize.width();
+                    const int withFrameX = cmb->rect.x() + width - frameThickness - buttonSize.width();
                     ret = QRect(
                         frameThickness,
                         frameThickness,
                         withFrameX - frameThickness,
-                        cmb->rect.height() - 2 * frameThickness);
+                        height - 2 * frameThickness);
                     }
                 break;
             default:
                 break;
             }
+            ret = visualRect(cmb->direction, cmb->rect, ret);
         }
         break;
     case CC_GroupBox:
@@ -2613,7 +2648,7 @@
                 case SC_GroupBoxLabel: {
                     //slightly indent text and boxes, so that dialog border does not mess with them.
                     const int horizontalSpacing =
-                        QS60StylePrivate::pixelMetric(QStyle::PM_LayoutHorizontalSpacing);
+                        QS60StylePrivate::pixelMetric(PM_LayoutHorizontalSpacing);
                     ret.adjust(2, horizontalSpacing - 3, 0, 0);
                     }
                     break;
@@ -2668,6 +2703,9 @@
 {
     QRect ret;
     switch (element) {
+        case SE_RadioButtonFocusRect:
+            ret = opt->rect;
+            break;
         case SE_LineEditContents: {
                 // in S60 the input text box doesn't start from line Edit's TL, but
                 // a bit indented.
@@ -2686,9 +2724,9 @@
 
                 if (const QStyleOptionTabWidgetFrame *twf = qstyleoption_cast<const QStyleOptionTabWidgetFrame *>(opt)) {
                     const int tabOverlapNoBorder =
-                        QS60StylePrivate::pixelMetric(QStyle::PM_TabBarTabOverlap);
+                        QS60StylePrivate::pixelMetric(PM_TabBarTabOverlap);
                     const int tabOverlap =
-                        tabOverlapNoBorder-QS60StylePrivate::pixelMetric(QStyle::PM_DefaultFrameWidth);
+                        tabOverlapNoBorder-QS60StylePrivate::pixelMetric(PM_DefaultFrameWidth);
                     const QTabWidget *tab = qobject_cast<const QTabWidget *>(widget);
                     int gain = (tab) ? tabOverlap * tab->count() : 0;
                     switch (twf->shape) {
@@ -2737,8 +2775,8 @@
                     multiSelection &&
                     (vopt->features & QStyleOptionViewItemV2::HasCheckIndicator)) {
                     const int verticalSpacing =
-                        QS60StylePrivate::pixelMetric(QStyle::PM_LayoutVerticalSpacing);
-                    //const int horizontalSpacing = QS60StylePrivate::pixelMetric(QStyle::PM_LayoutHorizontalSpacing);
+                        QS60StylePrivate::pixelMetric(PM_LayoutVerticalSpacing);
+                    //const int horizontalSpacing = QS60StylePrivate::pixelMetric(PM_LayoutHorizontalSpacing);
                     const int checkBoxRectWidth = subElementRect(SE_ItemViewItemCheckIndicator, opt, widget).width();
                     ret.adjust(-checkBoxRectWidth - verticalSpacing, 0, -checkBoxRectWidth - verticalSpacing, 0);
                 }
@@ -2784,9 +2822,9 @@
                     singleSelection;
 
                 // Selection check mark rect.
-                const int indicatorWidth = QS60StylePrivate::pixelMetric(QStyle::PM_IndicatorWidth);
-                const int indicatorHeight = QS60StylePrivate::pixelMetric(QStyle::PM_IndicatorHeight);
-                const int spacing = QS60StylePrivate::pixelMetric(QStyle::PM_CheckBoxLabelSpacing);
+                const int indicatorWidth = QS60StylePrivate::pixelMetric(PM_IndicatorWidth);
+                const int indicatorHeight = QS60StylePrivate::pixelMetric(PM_IndicatorHeight);
+                const int spacing = QS60StylePrivate::pixelMetric(PM_CheckBoxLabelSpacing);
 
                 const int itemHeight = opt->rect.height();
                 int heightOffset = 0;
@@ -2818,6 +2856,25 @@
                 }
             ret = visualRect(opt->direction, opt->rect, ret);
             break;
+        case SE_RadioButtonIndicator: {
+                const int height = pixelMetric(PM_ExclusiveIndicatorHeight, opt, widget);
+                ret.setRect(opt->rect.x(), opt->rect.y() + ((opt->rect.height() - height) >> 1),
+                        pixelMetric(PM_ExclusiveIndicatorWidth, opt, widget), height);
+                ret.translate(2, 0); //move indicator slightly to avoid highlight crossing over it
+                ret = visualRect(opt->direction, opt->rect, ret);
+            }
+            break;
+        case SE_CheckBoxIndicator: {
+                const int height = pixelMetric(PM_IndicatorHeight, opt, widget);
+                ret.setRect(opt->rect.x(), opt->rect.y() + ((opt->rect.height() - height) >> 1),
+                          pixelMetric(PM_IndicatorWidth, opt, widget), height);
+                ret.translate(2, 0); //move indicator slightly to avoid highlight crossing over it
+                ret = visualRect(opt->direction, opt->rect, ret);
+            }
+            break;
+        case SE_CheckBoxFocusRect:
+            ret = opt->rect;
+            break;
         default:
             ret = QCommonStyle::subElementRect(element, opt, widget);
     }
@@ -2835,6 +2892,12 @@
     if (!widget)
         return;
 
+    //Currently we only support animations in QProgressBar.
+#ifndef QT_NO_PROGRESSBAR
+    if (qobject_cast<QProgressBar *>(widget))
+        widget->installEventFilter(this);
+#endif
+
     if (false
 #ifndef QT_NO_SCROLLBAR
         || qobject_cast<QScrollBar *>(widget)
@@ -2867,6 +2930,8 @@
  */
 void QS60Style::unpolish(QWidget *widget)
 {
+    Q_D(QS60Style);
+
     if (false
     #ifndef QT_NO_SCROLLBAR
         || qobject_cast<QScrollBar *>(widget)
@@ -2893,6 +2958,14 @@
     if (widget)
         widget->setPalette(QPalette());
 
+#if defined(Q_WS_S60) && !defined(QT_NO_PROGRESSBAR)
+    if (QProgressBar *bar = qobject_cast<QProgressBar *>(widget)) {
+        widget->removeEventFilter(this);
+        d->m_bars.removeAll(bar);
+    }
+#else
+    Q_UNUSED(d)
+#endif
     QCommonStyle::unpolish(widget);
 }
 
@@ -2924,10 +2997,23 @@
 bool QS60Style::event(QEvent *e)
 {
 #ifdef QT_KEYPAD_NAVIGATION
-    if (QS60StylePrivate::isTouchSupported())
-        return false;
     Q_D(QS60Style);
+    const QEvent::Type eventType = e->type();
+    if ((eventType == QEvent::FocusIn ||
+         eventType == QEvent::FocusOut ||
+         eventType == QEvent::EnterEditFocus ||
+         eventType == QEvent::LeaveEditFocus) &&
+        QS60StylePrivate::isTouchSupported())
+            return false;
+#endif
+
     switch (e->type()) {
+    case QEvent::Timer: {
+        QTimerEvent *te = static_cast<QTimerEvent*>(e);
+        timerEvent(te);
+        }
+        break;
+#ifdef QT_KEYPAD_NAVIGATION
     case QEvent::FocusIn:
         if (QWidget *focusWidget = QApplication::focusWidget()) {
             if (!d->m_focusFrame)
@@ -2946,12 +3032,10 @@
         if (d->m_focusFrame)
             d->m_focusFrame->update();
         break;
+#endif
     default:
         break;
     }
-#else
-    Q_UNUSED(e)
-#endif
     return false;
 }
 
@@ -2961,7 +3045,7 @@
 QIcon QS60Style::standardIconImplementation(StandardPixmap standardIcon,
     const QStyleOption *option, const QWidget *widget) const
 {
-    const int iconDimension = QS60StylePrivate::pixelMetric(QStyle::PM_ToolBarIconSize);
+    const int iconDimension = QS60StylePrivate::pixelMetric(PM_ToolBarIconSize);
     const QRect iconSize = (!option) ? QRect(0, 0, iconDimension, iconDimension) : option->rect;
     QS60StyleEnums::SkinParts part;
     QS60StylePrivate::SkinElementFlags adjustedFlags;
@@ -2971,67 +3055,67 @@
             QS60StylePrivate::SF_StateDisabled;
 
     switch(standardIcon) {
-        case QStyle::SP_MessageBoxWarning:
+        case SP_MessageBoxWarning:
             part = QS60StyleEnums::SP_QgnNoteWarning;
             break;
-        case QStyle::SP_MessageBoxInformation:
+        case SP_MessageBoxInformation:
             part = QS60StyleEnums::SP_QgnNoteInfo;
             break;
-        case QStyle::SP_MessageBoxCritical:
+        case SP_MessageBoxCritical:
             part = QS60StyleEnums::SP_QgnNoteError;
             break;
-        case QStyle::SP_MessageBoxQuestion:
+        case SP_MessageBoxQuestion:
             part = QS60StyleEnums::SP_QgnNoteQuery;
             break;
-        case QStyle::SP_ArrowRight:
+        case SP_ArrowRight:
             part = QS60StyleEnums::SP_QgnIndiNaviArrowRight;
             break;
-        case QStyle::SP_ArrowLeft:
+        case SP_ArrowLeft:
             part = QS60StyleEnums::SP_QgnIndiNaviArrowLeft;
             break;
-        case QStyle::SP_ArrowUp:
+        case SP_ArrowUp:
             part = QS60StyleEnums::SP_QgnIndiNaviArrowLeft;
             adjustedFlags |= QS60StylePrivate::SF_PointEast;
             break;
-        case QStyle::SP_ArrowDown:
+        case SP_ArrowDown:
             part = QS60StyleEnums::SP_QgnIndiNaviArrowLeft;
             adjustedFlags |= QS60StylePrivate::SF_PointWest;
             break;
-        case QStyle::SP_ArrowBack:
+        case SP_ArrowBack:
             if (QApplication::layoutDirection() == Qt::RightToLeft)
                 return QS60Style::standardIcon(SP_ArrowRight, option, widget);
             return QS60Style::standardIcon(SP_ArrowLeft, option, widget);
-        case QStyle::SP_ArrowForward:
+        case SP_ArrowForward:
             if (QApplication::layoutDirection() == Qt::RightToLeft)
                 return QS60Style::standardIcon(SP_ArrowLeft, option, widget);
             return QS60Style::standardIcon(SP_ArrowRight, option, widget);
-        case QStyle::SP_ComputerIcon:
+        case SP_ComputerIcon:
             part = QS60StyleEnums::SP_QgnPropPhoneMemcLarge;
             break;
-        case QStyle::SP_DirClosedIcon:
+        case SP_DirClosedIcon:
             part = QS60StyleEnums::SP_QgnPropFolderSmall;
             break;
-        case QStyle::SP_DirOpenIcon:
+        case SP_DirOpenIcon:
             part = QS60StyleEnums::SP_QgnPropFolderCurrent;
             break;
-        case QStyle::SP_DirIcon:
+        case SP_DirIcon:
             part = QS60StyleEnums::SP_QgnPropFolderSmall;
             break;
-        case QStyle::SP_FileDialogNewFolder:
+        case SP_FileDialogNewFolder:
             part = QS60StyleEnums::SP_QgnPropFolderSmallNew;
             break;
-        case QStyle::SP_FileIcon:
+        case SP_FileIcon:
             part = QS60StyleEnums::SP_QgnPropFileSmall;
             break;
-        case QStyle::SP_TrashIcon:
+        case SP_TrashIcon:
             part = QS60StyleEnums::SP_QgnNoteErased;
             break;
-        case QStyle::SP_ToolBarHorizontalExtensionButton:
+        case SP_ToolBarHorizontalExtensionButton:
             part = QS60StyleEnums::SP_QgnIndiSubMenu;
             if (QApplication::layoutDirection() == Qt::RightToLeft)
                 adjustedFlags |= QS60StylePrivate::SF_PointSouth;
             break;
-        case QStyle::SP_ToolBarVerticalExtensionButton:
+        case SP_ToolBarVerticalExtensionButton:
             adjustedFlags |= QS60StylePrivate::SF_PointEast;
             part = QS60StyleEnums::SP_QgnIndiSubMenu;
             break;
@@ -3045,6 +3129,72 @@
         QCommonStyle::standardIconImplementation(standardIcon, option, widget) : QIcon(cachedPixMap);
 }
 
+/*!
+    \internal
+    Animate indeterminate progress bars only when visible
+*/
+bool QS60Style::eventFilter(QObject *object, QEvent *event)
+{
+#ifdef Q_WS_S60
+#ifndef QT_NO_PROGRESSBAR
+    Q_D(QS60Style);
+    switch(event->type()) {
+    case QEvent::StyleChange:
+    case QEvent::Show:
+        if (QProgressBar *bar = qobject_cast<QProgressBar *>(object)) {
+            if (!d->m_bars.contains(bar))
+                d->m_bars << bar;
+            if (d->m_bars.size() == 1) //only start with first animated progressbar
+                d->startAnimation(QS60StyleEnums::SP_QgnGrafBarWaitAnim);
+        }
+        break;
+    case QEvent::Destroy:
+    case QEvent::Hide:
+        d->stopAnimation(QS60StyleEnums::SP_QgnGrafBarWaitAnim);
+        d->m_bars.removeAll(reinterpret_cast<QProgressBar *>(object));
+        break;
+    default:
+        break;
+    }
+#endif // QT_NO_PROGRESSBAR
+#endif // Q_WS_S60
+    return QStyle::eventFilter(object, event);
+}
+
+/*!
+    \internal
+    Handle the timer \a event. 
+*/
+void QS60Style::timerEvent(QTimerEvent *event)
+{
+#ifdef Q_WS_S60
+#ifndef QT_NO_PROGRESSBAR
+    Q_D(QS60Style);
+
+    QS60StyleAnimation *progressBarAnimation =
+        QS60StylePrivate::animationDefinition(QS60StyleEnums::SP_QgnGrafBarWaitAnim);
+
+    if (event->timerId() == progressBarAnimation->timerId()) {
+
+        Q_ASSERT(progressBarAnimation->interval() > 0);
+
+        if (progressBarAnimation->currentFrame() == progressBarAnimation->frameCount() )
+            if (progressBarAnimation->playMode() == QS60StyleEnums::AM_Looping)
+                progressBarAnimation->setCurrentFrame(0);
+            else
+                d->stopAnimation(progressBarAnimation->animationId());
+
+        foreach (QProgressBar *bar, d->m_bars) {
+            if ((bar->minimum() == 0 && bar->maximum() == 0))
+                bar->update();
+        }
+        progressBarAnimation->setCurrentFrame(progressBarAnimation->currentFrame() + 1);
+    }
+#endif // QT_NO_PROGRESSBAR
+#endif // Q_WS_S60
+    event->ignore();
+}
+
 extern QPoint qt_s60_fill_background_offset(const QWidget *targetWidget);
 
 bool qt_s60_fill_background(QPainter *painter, const QRegion &rgn, const QBrush &brush)
@@ -3056,11 +3206,13 @@
     const QPaintDevice *target = painter->device();
     if (target->devType() == QInternal::Widget) {
         const QWidget *widget = static_cast<const QWidget *>(target);
-        const QVector<QRect> &rects = rgn.rects();
-        for (int i = 0; i < rects.size(); ++i) {
-            const QRect rect(rects.at(i));
-            painter->drawPixmap(rect.topLeft(), backgroundTexture,
-                                rect.translated(qt_s60_fill_background_offset(widget)));
+        if (!widget->testAttribute(Qt::WA_TranslucentBackground)) {
+            const QVector<QRect> &rects = rgn.rects();
+            for (int i = 0; i < rects.size(); ++i) {
+                const QRect rect(rects.at(i));
+                painter->drawPixmap(rect.topLeft(), backgroundTexture,
+                                    rect.translated(qt_s60_fill_background_offset(widget)));
+            }
         }
     }
     return true;