src/gui/styles/qs60style_s60.cpp
changeset 7 f7bc934e204c
parent 3 41300fa6a67c
equal deleted inserted replaced
3:41300fa6a67c 7:f7bc934e204c
     1 /****************************************************************************
     1 /****************************************************************************
     2 **
     2 **
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     4 ** All rights reserved.
     4 ** All rights reserved.
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
     6 **
     6 **
     7 ** This file is part of the QtGui module of the Qt Toolkit.
     7 ** This file is part of the QtGui module of the Qt Toolkit.
     8 **
     8 **
    48 #include "private/qpixmap_s60_p.h"
    48 #include "private/qpixmap_s60_p.h"
    49 #include "private/qcore_symbian_p.h"
    49 #include "private/qcore_symbian_p.h"
    50 #include "qapplication.h"
    50 #include "qapplication.h"
    51 
    51 
    52 #include <w32std.h>
    52 #include <w32std.h>
    53 #include <aknsconstants.h>
    53 #include <AknsConstants.h>
    54 #include <aknconsts.h>
    54 #include <aknconsts.h>
    55 #include <aknsitemid.h>
    55 #include <AknsItemID.h>
    56 #include <aknsutils.h>
    56 #include <AknsUtils.h>
    57 #include <aknsdrawutils.h>
    57 #include <AknsDrawUtils.h>
    58 #include <aknsskininstance.h>
    58 #include <AknsSkinInstance.h>
    59 #include <aknsbasicbackgroundcontrolcontext.h>
    59 #include <AknsBasicBackgroundControlContext.h>
    60 #include <avkon.mbg>
    60 #include <avkon.mbg>
    61 #include <AknFontAccess.h>
    61 #include <AknFontAccess.h>
    62 #include <AknLayoutFont.h>
    62 #include <AknLayoutFont.h>
    63 #include <aknutils.h>
    63 #include <AknUtils.h>
    64 #include <aknnavi.h>
    64 #include <aknnavi.h>
    65 #include <gulicon.h>
    65 #include <gulicon.h>
       
    66 #include <AknBitmapAnimation.h>
    66 
    67 
    67 #if !defined(QT_NO_STYLE_S60) || defined(QT_PLUGIN)
    68 #if !defined(QT_NO_STYLE_S60) || defined(QT_PLUGIN)
    68 
    69 
    69 QT_BEGIN_NAMESPACE
    70 QT_BEGIN_NAMESPACE
    70 
    71 
    71 enum TDrawType {
    72 enum TDrawType {
    72     EDrawIcon,
    73     EDrawIcon,
    73     EDrawGulIcon,
    74     EDrawGulIcon,
    74     EDrawBackground,
    75     EDrawBackground,
       
    76     EDrawAnimation,
    75     ENoDraw
    77     ENoDraw
    76 };
    78 };
    77 
    79 
    78 enum TSupportRelease {
    80 enum TSupportRelease {
    79     ES60_None     = 0x0000, //indicates that the commonstyle should draw the graphics
    81     ES60_None     = 0x0000, //indicates that the commonstyle should draw the graphics
    95     int supportInfo;
    97     int supportInfo;
    96     int newMajorSkinId;
    98     int newMajorSkinId;
    97     int newMinorSkinId;
    99     int newMinorSkinId;
    98 } partMapEntry;
   100 } partMapEntry;
    99 
   101 
       
   102 AnimationData::AnimationData(const QS60StyleEnums::SkinParts part, int frames, int interval) : m_id(part),
       
   103     m_frames(frames), m_interval(interval), m_mode(QS60StyleEnums::AM_Looping)
       
   104 {
       
   105 }
       
   106 
       
   107 AnimationDataV2::AnimationDataV2(const AnimationData &data) : AnimationData(data.m_id, data.m_frames, data.m_interval),
       
   108     m_animation(0), m_currentFrame(0), m_resourceBased(false), m_timerId(0)
       
   109 {
       
   110 }
       
   111 AnimationDataV2::~AnimationDataV2()
       
   112 {
       
   113     delete m_animation;
       
   114 }
       
   115 
       
   116 QS60StyleAnimation::QS60StyleAnimation(const QS60StyleEnums::SkinParts part, int frames, int interval)
       
   117 {
       
   118     QT_TRAP_THROWING(m_defaultData = new (ELeave) AnimationData(part, frames, interval));
       
   119     QT_TRAP_THROWING(m_currentData = new (ELeave) AnimationDataV2(*m_defaultData));
       
   120 }
       
   121 
       
   122 QS60StyleAnimation::~QS60StyleAnimation()
       
   123 {
       
   124     delete m_currentData;
       
   125     delete m_defaultData;
       
   126 }
       
   127 
       
   128 void QS60StyleAnimation::setAnimationObject(CAknBitmapAnimation* animation)
       
   129 {
       
   130     Q_ASSERT(animation);
       
   131     if (m_currentData->m_animation)
       
   132         delete m_currentData->m_animation;
       
   133     m_currentData->m_animation = animation;
       
   134 }
       
   135 
       
   136 void QS60StyleAnimation::resetToDefaults()
       
   137 {
       
   138     delete m_currentData;
       
   139     m_currentData = 0;
       
   140     QT_TRAP_THROWING(m_currentData = new (ELeave) AnimationDataV2(*m_defaultData));
       
   141 }
       
   142 
   100 class QS60StyleModeSpecifics
   143 class QS60StyleModeSpecifics
   101 {
   144 {
   102 public:
   145 public:
   103     static QPixmap skinnedGraphics(QS60StyleEnums::SkinParts stylepart,
   146     static QPixmap skinnedGraphics(QS60StyleEnums::SkinParts stylepart,
   104         const QSize &size, QS60StylePrivate::SkinElementFlags flags);
   147         const QSize &size, QS60StylePrivate::SkinElementFlags flags);
   111     static bool disabledFrameGraphic(QS60StylePrivate::SkinFrameElements &frame);
   154     static bool disabledFrameGraphic(QS60StylePrivate::SkinFrameElements &frame);
   112     static QPixmap generateMissingThemeGraphic(QS60StyleEnums::SkinParts &part, const QSize &size, QS60StylePrivate::SkinElementFlags flags);
   155     static QPixmap generateMissingThemeGraphic(QS60StyleEnums::SkinParts &part, const QSize &size, QS60StylePrivate::SkinElementFlags flags);
   113     static QSize naviPaneSize();
   156     static QSize naviPaneSize();
   114     static TAknsItemID partSpecificThemeId(int part);
   157     static TAknsItemID partSpecificThemeId(int part);
   115 
   158 
       
   159     static QVariant themeDefinition(QS60StyleEnums::ThemeDefinitions definition, QS60StyleEnums::SkinParts part);
       
   160 
   116 private:
   161 private:
   117     static QPixmap createSkinnedGraphicsLX(QS60StyleEnums::SkinParts part,
   162     static QPixmap createSkinnedGraphicsLX(QS60StyleEnums::SkinParts part,
   118         const QSize &size, QS60StylePrivate::SkinElementFlags flags);
   163         const QSize &size, QS60StylePrivate::SkinElementFlags flags);
   119     static QPixmap createSkinnedGraphicsLX(QS60StylePrivate::SkinFrameElements frameElement, const QSize &size, QS60StylePrivate::SkinElementFlags flags);
   164     static QPixmap createSkinnedGraphicsLX(QS60StylePrivate::SkinFrameElements frameElement, const QSize &size, QS60StylePrivate::SkinElementFlags flags);
   120     static QPixmap colorSkinnedGraphicsLX(const QS60StyleEnums::SkinParts &stylepart,
   165     static QPixmap colorSkinnedGraphicsLX(const QS60StyleEnums::SkinParts &stylepart,
   126     // Array to match the skin ID, fallback graphics and Qt widget graphics.
   171     // Array to match the skin ID, fallback graphics and Qt widget graphics.
   127     static const partMapEntry m_partMap[];
   172     static const partMapEntry m_partMap[];
   128 };
   173 };
   129 
   174 
   130 const partMapEntry QS60StyleModeSpecifics::m_partMap[] = {
   175 const partMapEntry QS60StyleModeSpecifics::m_partMap[] = {
   131     /* SP_QgnGrafBarWait */                {KAknsIIDQgnGrafBarWaitAnim,            EDrawIcon,   ES60_All,    -1,-1},
   176     /* SP_QgnGrafBarWaitAnim */            {KAknsIIDQgnGrafBarWaitAnim,       EDrawAnimation,   ES60_All,    -1,-1},
   132     /* SP_QgnGrafBarFrameCenter */         {KAknsIIDQgnGrafBarFrameCenter,         EDrawIcon,   ES60_All,    -1,-1},
   177     /* SP_QgnGrafBarFrameCenter */         {KAknsIIDQgnGrafBarFrameCenter,         EDrawIcon,   ES60_All,    -1,-1},
   133     /* SP_QgnGrafBarFrameSideL */          {KAknsIIDQgnGrafBarFrameSideL,          EDrawIcon,   ES60_All,    -1,-1},
   178     /* SP_QgnGrafBarFrameSideL */          {KAknsIIDQgnGrafBarFrameSideL,          EDrawIcon,   ES60_All,    -1,-1},
   134     /* SP_QgnGrafBarFrameSideR */          {KAknsIIDQgnGrafBarFrameSideR,          EDrawIcon,   ES60_All,    -1,-1},
   179     /* SP_QgnGrafBarFrameSideR */          {KAknsIIDQgnGrafBarFrameSideR,          EDrawIcon,   ES60_All,    -1,-1},
   135     /* SP_QgnGrafBarProgress */            {KAknsIIDQgnGrafBarProgress,            EDrawIcon,   ES60_All,    -1,-1},
   180     /* SP_QgnGrafBarProgress */            {KAknsIIDQgnGrafBarProgress,            EDrawIcon,   ES60_All,    -1,-1},
       
   181     // No drop area for 3.x non-touch devices
       
   182     /* SP_QgnGrafOrgBgGrid */              {KAknsIIDNone,                          EDrawIcon,   ES60_3_X,    EAknsMajorGeneric ,0x1eba}, //KAknsIIDQgnGrafOrgBgGrid   
   136     /* SP_QgnGrafScrollArrowDown */        {KAknsIIDQgnGrafScrollArrowDown,     EDrawGulIcon,   ES60_All,    -1,-1},
   183     /* SP_QgnGrafScrollArrowDown */        {KAknsIIDQgnGrafScrollArrowDown,     EDrawGulIcon,   ES60_All,    -1,-1},
   137     /* SP_QgnGrafScrollArrowLeft */        {KAknsIIDQgnGrafScrollArrowLeft,     EDrawGulIcon,   ES60_All,    -1,-1},
   184     /* SP_QgnGrafScrollArrowLeft */        {KAknsIIDQgnGrafScrollArrowLeft,     EDrawGulIcon,   ES60_All,    -1,-1},
   138     /* SP_QgnGrafScrollArrowRight */       {KAknsIIDQgnGrafScrollArrowRight,    EDrawGulIcon,   ES60_All,    -1,-1},
   185     /* SP_QgnGrafScrollArrowRight */       {KAknsIIDQgnGrafScrollArrowRight,    EDrawGulIcon,   ES60_All,    -1,-1},
   139     /* SP_QgnGrafScrollArrowUp */          {KAknsIIDQgnGrafScrollArrowUp,       EDrawGulIcon,   ES60_All,    -1,-1},
   186     /* SP_QgnGrafScrollArrowUp */          {KAknsIIDQgnGrafScrollArrowUp,       EDrawGulIcon,   ES60_All,    -1,-1},
   140     /* SP_QgnGrafTabActiveL */             {KAknsIIDQgnGrafTabActiveL,             EDrawIcon,   ES60_All,    -1,-1},
   187     /* SP_QgnGrafTabActiveL */             {KAknsIIDQgnGrafTabActiveL,             EDrawIcon,   ES60_All,    -1,-1},
   369 }
   416 }
   370 
   417 
   371 void QS60StyleModeSpecifics::fallbackInfo(const QS60StyleEnums::SkinParts &stylePart, TInt &fallbackIndex)
   418 void QS60StyleModeSpecifics::fallbackInfo(const QS60StyleEnums::SkinParts &stylePart, TInt &fallbackIndex)
   372 {
   419 {
   373     switch(stylePart) {
   420     switch(stylePart) {
   374         case QS60StyleEnums::SP_QgnGrafBarWait:
   421         case QS60StyleEnums::SP_QgnGrafBarWaitAnim:
   375             fallbackIndex = EMbmAvkonQgn_graf_bar_wait_1;
   422             fallbackIndex = EMbmAvkonQgn_graf_bar_wait_1;
   376             break;
   423             break;
   377         case QS60StyleEnums::SP_QgnGrafBarFrameCenter:
   424         case QS60StyleEnums::SP_QgnGrafBarFrameCenter:
   378             fallbackIndex = EMbmAvkonQgn_graf_bar_frame_center;
   425             fallbackIndex = EMbmAvkonQgn_graf_bar_frame_center;
   379             break;
   426             break;
   602 bool QS60StylePrivate::hasSliderGrooveGraphic()
   649 bool QS60StylePrivate::hasSliderGrooveGraphic()
   603 {
   650 {
   604     return QSysInfo::s60Version() != QSysInfo::SV_S60_3_1;
   651     return QSysInfo::s60Version() != QSysInfo::SV_S60_3_1;
   605 }
   652 }
   606 
   653 
       
   654 bool QS60StylePrivate::isSingleClickUi()
       
   655 {
       
   656     return (QSysInfo::s60Version() > QSysInfo::SV_S60_5_0);
       
   657 }
       
   658 
   607 QPoint qt_s60_fill_background_offset(const QWidget *targetWidget)
   659 QPoint qt_s60_fill_background_offset(const QWidget *targetWidget)
   608 {
   660 {
   609     CCoeControl *control = targetWidget->effectiveWinId();
   661     CCoeControl *control = targetWidget->effectiveWinId();
   610     TPoint pos(0,0);
   662     TPoint pos(0,0);
   611     if (control) {
   663     if (control) {
   701                 targetSize,
   753                 targetSize,
   702                 KAknsDrawParamDefault | KAknsDrawParamRGBOnly);
   754                 KAknsDrawParamDefault | KAknsDrawParamRGBOnly);
   703 
   755 
   704             if (drawn)
   756             if (drawn)
   705                 result = fromFbsBitmap(background, NULL, flags, targetSize);
   757                 result = fromFbsBitmap(background, NULL, flags, targetSize);
   706             // if drawing fails in skin server, just ignore the background (probably OOM occured)
   758             // if drawing fails in skin server, just ignore the background (probably OOM case)
   707 
   759 
   708             CleanupStack::PopAndDestroy(4, background); //background, dev, gc, bgContext
   760             CleanupStack::PopAndDestroy(4, background); //background, dev, gc, bgContext
   709     //        QS60WindowSurface::lockBitmapHeap();
   761     //        QS60WindowSurface::lockBitmapHeap();
       
   762             break;
       
   763         }
       
   764         case EDrawAnimation: {
       
   765             CFbsBitmap* animationFrame;
       
   766             CFbsBitmap* frameMask;
       
   767             CAknBitmapAnimation* aknAnimation = 0;
       
   768             TBool constructedFromTheme = ETrue;
       
   769 
       
   770             QS60StyleAnimation* animation = QS60StylePrivate::animationDefinition(part); //ownership is not passed
       
   771             if (animation) {
       
   772                 if (!animation->animationObject() && !animation->isResourceBased()) {// no pre-made item exists, create new animation
       
   773                     CAknBitmapAnimation* newAnimation = CAknBitmapAnimation::NewL();
       
   774                     CleanupStack::PushL(newAnimation);
       
   775                     if (newAnimation)
       
   776                         constructedFromTheme = newAnimation->ConstructFromSkinL(skinId);
       
   777                     if (constructedFromTheme && newAnimation->BitmapAnimData()->FrameArray().Count() > 0) {
       
   778                         animation->setResourceBased(false);
       
   779                         animation->setAnimationObject(newAnimation); //animation takes ownership
       
   780                     }
       
   781                     CleanupStack::Pop(newAnimation);
       
   782                 }
       
   783                 //fill-in stored information
       
   784                 aknAnimation = animation->animationObject();
       
   785                 constructedFromTheme = !animation->isResourceBased();
       
   786             }
       
   787 
       
   788             const int currentFrame = QS60StylePrivate::currentAnimationFrame(part);
       
   789             if (constructedFromTheme && aknAnimation && aknAnimation->BitmapAnimData()->FrameArray().Count() > 0) {
       
   790                 //Animation was created successfully and contains frames, just fetch current frame
       
   791                 if(currentFrame >= aknAnimation->BitmapAnimData()->FrameArray().Count())
       
   792                     User::Leave(KErrOverflow);
       
   793                 const CBitmapFrameData* frameData = aknAnimation->BitmapAnimData()->FrameArray().At(currentFrame);
       
   794                 if (frameData) {
       
   795                     animationFrame = frameData->Bitmap();
       
   796                     frameMask = frameData->Mask();
       
   797                 }
       
   798             } else {
       
   799                 //Theme does not contain animation theming, create frames from resource file
       
   800                 TInt fallbackGraphicID = -1;
       
   801                 fallbackInfo(part, fallbackGraphicID);
       
   802                 fallbackGraphicID = fallbackGraphicID + (currentFrame * 2); //skip masks
       
   803                 TInt fallbackGraphicsMaskID =
       
   804                     (fallbackGraphicID == KErrNotFound) ? KErrNotFound : fallbackGraphicID + 1; //masks are auto-generated as next in mif files
       
   805                 if (fallbackGraphicsMaskID != KErrNotFound)
       
   806                     fallbackGraphicsMaskID = fallbackGraphicsMaskID + (currentFrame * 2); //skip actual graphics
       
   807 
       
   808                 //Then draw animation frame
       
   809                 AknsUtils::CreateIconL(
       
   810                     skinInstance,
       
   811                     KAknsIIDDefault, //animation is not themed, lets force fallback graphics
       
   812                     animationFrame,
       
   813                     frameMask,
       
   814                     AknIconUtils::AvkonIconFileName(),
       
   815                     fallbackGraphicID ,
       
   816                     fallbackGraphicsMaskID);
       
   817             }
       
   818             result = fromFbsBitmap(animationFrame, frameMask, flags, targetSize);
       
   819             if (!constructedFromTheme) {
       
   820                 delete animationFrame;
       
   821                 animationFrame = 0;
       
   822                 delete frameMask;
       
   823                 frameMask = 0;
       
   824             }
   710             break;
   825             break;
   711         }
   826         }
   712     }
   827     }
   713     if (!result)
   828     if (!result)
   714         result = QPixmap();
   829         result = QPixmap();
   729         rotatedBy90or270 ? TSize(size.height(), size.width()) : qt_QSize2TSize(size);
   844         rotatedBy90or270 ? TSize(size.height(), size.width()) : qt_QSize2TSize(size);
   730 
   845 
   731     MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance();
   846     MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance();
   732     QPixmap result;
   847     QPixmap result;
   733 
   848 
   734 //        QS60WindowSurface::unlockBitmapHeap();
       
   735     static const TDisplayMode displayMode = S60->supportsPremultipliedAlpha ? Q_SYMBIAN_ECOLOR16MAP : EColor16MA;
   849     static const TDisplayMode displayMode = S60->supportsPremultipliedAlpha ? Q_SYMBIAN_ECOLOR16MAP : EColor16MA;
   736     static const TInt drawParam = S60->supportsPremultipliedAlpha ? KAknsDrawParamDefault : KAknsDrawParamNoClearUnderImage|KAknsDrawParamRGBOnly;
   850     static const TInt drawParam = S60->supportsPremultipliedAlpha ? KAknsDrawParamDefault : KAknsDrawParamNoClearUnderImage|KAknsDrawParamRGBOnly;
   737 
   851 
   738     CFbsBitmap *frame = new (ELeave) CFbsBitmap(); //offscreen
   852     CFbsBitmap *frame = new (ELeave) CFbsBitmap(); //offscreen
   739     CleanupStack::PushL(frame);
   853     CleanupStack::PushL(frame);
   743     CleanupStack::PushL(bitmapDev);
   857     CleanupStack::PushL(bitmapDev);
   744     CFbsBitGc* bitmapGc = NULL;
   858     CFbsBitGc* bitmapGc = NULL;
   745     User::LeaveIfError(bitmapDev->CreateContext(bitmapGc));
   859     User::LeaveIfError(bitmapDev->CreateContext(bitmapGc));
   746     CleanupStack::PushL(bitmapGc);
   860     CleanupStack::PushL(bitmapGc);
   747 
   861 
   748 #ifndef Q_SYMBIAN_HAS_EXTENDED_BITMAP_TYPE
       
   749     frame->LockHeap();
   862     frame->LockHeap();
   750     memset(frame->DataAddress(), 0, frame->SizeInPixels().iWidth * frame->SizeInPixels().iHeight * 4);  // 4: argb bytes
   863     memset(frame->DataAddress(), 0, frame->SizeInPixels().iWidth * frame->SizeInPixels().iHeight * 4);  // 4: argb bytes
   751     frame->UnlockHeap();
   864     frame->UnlockHeap();
   752 #endif
       
   753 
   865 
   754     const TRect outerRect(TPoint(0, 0), targetSize);
   866     const TRect outerRect(TPoint(0, 0), targetSize);
   755     const TRect innerRect = innerRectFromElement(frameElement, outerRect);
   867     const TRect innerRect = innerRectFromElement(frameElement, outerRect);
   756 
   868 
   757     TAknsItemID frameSkinID, centerSkinID;
   869     TAknsItemID frameSkinID, centerSkinID;
   862     }
   974     }
   863 }
   975 }
   864 
   976 
   865 TRect QS60StyleModeSpecifics::innerRectFromElement(QS60StylePrivate::SkinFrameElements frameElement, const TRect &outerRect)
   977 TRect QS60StyleModeSpecifics::innerRectFromElement(QS60StylePrivate::SkinFrameElements frameElement, const TRect &outerRect)
   866 {
   978 {
   867     TInt widthShrink = QS60StylePrivate::pixelMetric(PM_Custom_FrameCornerWidth);
   979     TInt widthShrink = QS60StylePrivate::pixelMetric(PM_FrameCornerWidth);
   868     TInt heightShrink = QS60StylePrivate::pixelMetric(PM_Custom_FrameCornerHeight);
   980     TInt heightShrink = QS60StylePrivate::pixelMetric(PM_FrameCornerHeight);
   869     switch(frameElement) {
   981     switch(frameElement) {
   870         case QS60StylePrivate::SF_PanelBackground:
   982         case QS60StylePrivate::SF_PanelBackground:
   871             // panel should have slightly slimmer border to enable thin line of background graphics between closest component
   983             // panel should have slightly slimmer border to enable thin line of background graphics between closest component
   872             widthShrink = widthShrink-2;
   984             widthShrink = widthShrink - 2;
   873             heightShrink = heightShrink-2;
   985             heightShrink = heightShrink - 2;
   874             break;
   986             break;
   875         case QS60StylePrivate::SF_ToolTip:
   987         case QS60StylePrivate::SF_ToolTip:
   876             widthShrink = widthShrink>>1;
   988             widthShrink = widthShrink >> 1;
   877             heightShrink = heightShrink>>1;
   989             heightShrink = heightShrink >> 1;
   878             break;
   990             break;
   879         case QS60StylePrivate::SF_ListHighlight:
   991         case QS60StylePrivate::SF_ListHighlight:
   880             widthShrink = widthShrink-2;
   992             widthShrink = widthShrink - 2;
   881             heightShrink = heightShrink-2;
   993             heightShrink = heightShrink - 2;
       
   994             break;
       
   995         case QS60StylePrivate::SF_PopupBackground:
       
   996             widthShrink = widthShrink + 5;
       
   997             heightShrink = heightShrink + 5;
   882             break;
   998             break;
   883         default:
   999         default:
   884             break;
  1000             break;
   885     }
  1001     }
   886     TRect innerRect(outerRect);
  1002     TRect innerRect(outerRect);
   907         newSkinId.Set(m_partMap[(int)part].skinID);
  1023         newSkinId.Set(m_partMap[(int)part].skinID);
   908     return newSkinId;
  1024     return newSkinId;
   909 }
  1025 }
   910 
  1026 
   911 QFont QS60StylePrivate::s60Font_specific(
  1027 QFont QS60StylePrivate::s60Font_specific(
   912     QS60StyleEnums::FontCategories fontCategory, int pointSize)
  1028     QS60StyleEnums::FontCategories fontCategory,
   913 {
  1029     int pointSize, bool resolveFontSize)
       
  1030 {
       
  1031     Q_UNUSED(resolveFontSize);
       
  1032 
   914     TAknFontCategory aknFontCategory = EAknFontCategoryUndefined;
  1033     TAknFontCategory aknFontCategory = EAknFontCategoryUndefined;
   915     switch (fontCategory) {
  1034     switch (fontCategory) {
   916         case QS60StyleEnums::FC_Primary:
  1035         case QS60StyleEnums::FC_Primary:
   917             aknFontCategory = EAknFontCategoryPrimary;
  1036             aknFontCategory = EAknFontCategoryPrimary;
   918             break;
  1037             break;
   977 
  1096 
   978         activeLayoutIndex = (currentRelease == QSysInfo::SV_S60_3_1 || currentRelease == QSysInfo::SV_S60_3_2) ? 0 : 2;
  1097         activeLayoutIndex = (currentRelease == QSysInfo::SV_S60_3_1 || currentRelease == QSysInfo::SV_S60_3_2) ? 0 : 2;
   979         activeLayoutIndex += (!landscape) ? 1 : 0;
  1098         activeLayoutIndex += (!landscape) ? 1 : 0;
   980     }
  1099     }
   981 
  1100 
   982     m_pmPointer = data[activeLayoutIndex];
  1101     setCurrentLayout(activeLayoutIndex);
   983 }
  1102 }
       
  1103 
       
  1104 Q_GLOBAL_STATIC(QList<QS60StyleAnimation *>, m_animations)
   984 
  1105 
   985 QS60StylePrivate::QS60StylePrivate()
  1106 QS60StylePrivate::QS60StylePrivate()
   986 {
  1107 {
       
  1108     //Animation defaults need to be created when style is instantiated
       
  1109     QS60StyleAnimation* progressBarAnimation = new QS60StyleAnimation(QS60StyleEnums::SP_QgnGrafBarWaitAnim, 7, 100);
       
  1110     m_animations()->append(progressBarAnimation);
   987     // No need to set active layout, if dynamic metrics API is available
  1111     // No need to set active layout, if dynamic metrics API is available
   988     setActiveLayout();
  1112     setActiveLayout();
   989 }
  1113 }
   990 
  1114 
   991 QColor QS60StylePrivate::s60Color(QS60StyleEnums::ColorLists list,
  1115 QColor QS60StylePrivate::s60Color(QS60StyleEnums::ColorLists list,
   997         &KAknsIIDQsnLineColors,
  1121         &KAknsIIDQsnLineColors,
   998         &KAknsIIDQsnOtherColors,
  1122         &KAknsIIDQsnOtherColors,
   999         &KAknsIIDQsnParentColors,
  1123         &KAknsIIDQsnParentColors,
  1000         &KAknsIIDQsnTextColors
  1124         &KAknsIIDQsnTextColors
  1001     };
  1125     };
  1002     Q_ASSERT((int)list <= (int)sizeof(idMap)/sizeof(idMap[0]));
  1126     Q_ASSERT((int)list < (int)sizeof(idMap)/sizeof(idMap[0]));
  1003     const QColor color = QS60StyleModeSpecifics::colorValue(*idMap[(int) list], index - 1);
  1127     const QColor color = QS60StyleModeSpecifics::colorValue(*idMap[(int) list], index - 1);
  1004     return option ? QS60StylePrivate::stateColor(color, option) : color;
  1128     return option ? QS60StylePrivate::stateColor(color, option) : color;
  1005 }
  1129 }
  1006 
  1130 
  1007 // In some cases, the AVKON UI themegraphic is already in 'disabled state'.
  1131 // In some cases, the AVKON UI themegraphic is already in 'disabled state'.
  1131     return result;
  1255     return result;
  1132 }
  1256 }
  1133 
  1257 
  1134 QPixmap QS60StylePrivate::backgroundTexture()
  1258 QPixmap QS60StylePrivate::backgroundTexture()
  1135 {
  1259 {
       
  1260     bool createNewBackground = false;
  1136     if (!m_background) {
  1261     if (!m_background) {
       
  1262         createNewBackground = true;
       
  1263     } else {
       
  1264         //if background brush does not match screensize, re-create it
       
  1265         if (m_background->width() != S60->screenWidthInPixels ||
       
  1266             m_background->height() != S60->screenHeightInPixels) {
       
  1267             delete m_background;
       
  1268             createNewBackground = true;
       
  1269         }
       
  1270     }
       
  1271 
       
  1272     if (createNewBackground) {
  1137         QPixmap background = part(QS60StyleEnums::SP_QsnBgScreen,
  1273         QPixmap background = part(QS60StyleEnums::SP_QsnBgScreen,
  1138                 QSize(S60->screenWidthInPixels, S60->screenHeightInPixels), 0, SkinElementFlags());
  1274             QSize(S60->screenWidthInPixels, S60->screenHeightInPixels), 0, SkinElementFlags());
  1139         m_background = new QPixmap(background);
  1275         m_background = new QPixmap(background);
  1140     }
  1276     }
  1141     return *m_background;
  1277     return *m_background;
  1142 }
  1278 }
  1143 
  1279 
  1144 QSize QS60StylePrivate::screenSize()
  1280 QSize QS60StylePrivate::screenSize()
  1145 {
  1281 {
  1146     const TSize screenSize = QS60Data::screenDevice()->SizeInPixels();
  1282     return QSize(S60->screenWidthInPixels, S60->screenHeightInPixels);
  1147     return QSize(screenSize.iWidth, screenSize.iHeight);
       
  1148 }
  1283 }
  1149 
  1284 
  1150 QS60Style::QS60Style()
  1285 QS60Style::QS60Style()
  1151     : QCommonStyle(*new QS60StylePrivate)
  1286     : QCommonStyle(*new QS60StylePrivate)
  1152 {
  1287 {
  1171         QEvent e(QEvent::StyleChange);
  1306         QEvent e(QEvent::StyleChange);
  1172         QApplication::sendEvent(topLevelWidget, &e);
  1307         QApplication::sendEvent(topLevelWidget, &e);
  1173         setThemePalette(topLevelWidget);
  1308         setThemePalette(topLevelWidget);
  1174         topLevelWidget->ensurePolished();
  1309         topLevelWidget->ensurePolished();
  1175     }
  1310     }
       
  1311 #ifndef QT_NO_PROGRESSBAR
       
  1312     //re-start animation timer
       
  1313     stopAnimation(QS60StyleEnums::SP_QgnGrafBarWaitAnim); //todo: once we have more animations, we could say "stop all running ones"
       
  1314     startAnimation(QS60StyleEnums::SP_QgnGrafBarWaitAnim); //and "re-start all previously running ones"
       
  1315 #endif
  1176 }
  1316 }
  1177 
  1317 
  1178 QSize QS60StylePrivate::naviPaneSize()
  1318 QSize QS60StylePrivate::naviPaneSize()
  1179 {
  1319 {
  1180     return QS60StyleModeSpecifics::naviPaneSize();
  1320     return QS60StyleModeSpecifics::naviPaneSize();
  1190             return QSize(naviContainer->Size().iWidth, naviContainer->Size().iHeight);
  1330             return QSize(naviContainer->Size().iWidth, naviContainer->Size().iHeight);
  1191     }
  1331     }
  1192     return QSize(0,0);
  1332     return QSize(0,0);
  1193 }
  1333 }
  1194 
  1334 
       
  1335 int QS60StylePrivate::currentAnimationFrame(QS60StyleEnums::SkinParts part)
       
  1336 {
       
  1337     QS60StyleAnimation *animation = animationDefinition(part);
       
  1338     // todo: looping could be done in QS60Style::timerEvent
       
  1339     if (animation->frameCount() == animation->currentFrame())
       
  1340         animation->setCurrentFrame(0);
       
  1341     return animation->currentFrame();
       
  1342 }
       
  1343 
       
  1344 QS60StyleAnimation* QS60StylePrivate::animationDefinition(QS60StyleEnums::SkinParts part)
       
  1345 {
       
  1346     int i = 0;
       
  1347     const int animationsCount = m_animations()->isEmpty() ? 0 : m_animations()->count();
       
  1348     for(; i < animationsCount; i++) {
       
  1349         if (part == m_animations()->at(i)->animationId())
       
  1350             break;
       
  1351     }
       
  1352     return m_animations()->at(i);
       
  1353 }
       
  1354 
       
  1355 void QS60StylePrivate::startAnimation(QS60StyleEnums::SkinParts animationPart)
       
  1356 {
       
  1357     Q_Q(QS60Style);
       
  1358 
       
  1359     //Query animation data from theme and store values to local struct.
       
  1360     QVariant themeAnimationDataVariant = QS60StyleModeSpecifics::themeDefinition(
       
  1361         QS60StyleEnums::TD_AnimationData, animationPart);
       
  1362     QList<QVariant> themeAnimationData = themeAnimationDataVariant.toList();
       
  1363 
       
  1364     QS60StyleAnimation *animation = QS60StylePrivate::animationDefinition(animationPart);
       
  1365     if (animation) {
       
  1366         if (themeAnimationData.at(QS60StyleEnums::AD_Interval).toInt() != 0)
       
  1367             animation->setInterval(themeAnimationData.at(QS60StyleEnums::AD_Interval).toInt());
       
  1368 
       
  1369         if (themeAnimationData.at(QS60StyleEnums::AD_NumberOfFrames).toInt() != 0)
       
  1370             animation->setFrameCount(themeAnimationData.at(QS60StyleEnums::AD_NumberOfFrames).toInt());
       
  1371 
       
  1372         //todo: playmode is ignored for now, since it seems to return invalid data on some themes
       
  1373         //lets use the table values for play mode
       
  1374 
       
  1375         animation->setCurrentFrame(0); //always initialize
       
  1376         const int timerId = q->startTimer(animation->interval());
       
  1377         animation->setTimerId(timerId);
       
  1378     }
       
  1379 }
       
  1380 
       
  1381 void QS60StylePrivate::stopAnimation(QS60StyleEnums::SkinParts animationPart)
       
  1382 {
       
  1383     Q_Q(QS60Style);
       
  1384 
       
  1385     QS60StyleAnimation *animation = QS60StylePrivate::animationDefinition(animationPart);
       
  1386     if (animation) {
       
  1387         animation->setCurrentFrame(0);
       
  1388         if (animation->timerId() != 0) {
       
  1389             q->killTimer(animation->timerId());
       
  1390             animation->setTimerId(0);
       
  1391         }
       
  1392         animation->resetToDefaults();
       
  1393     }
       
  1394 }
       
  1395 
       
  1396 QVariant QS60StyleModeSpecifics::themeDefinition(
       
  1397     QS60StyleEnums::ThemeDefinitions definition, QS60StyleEnums::SkinParts part)
       
  1398 {
       
  1399     MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance();
       
  1400 
       
  1401     Q_ASSERT(skinInstance);
       
  1402 
       
  1403     switch(definition) {
       
  1404     //Animation definitions
       
  1405     case QS60StyleEnums::TD_AnimationData:
       
  1406         {
       
  1407             CAknsBmpAnimItemData *animationData;
       
  1408             TAknsItemID animationSkinId = partSpecificThemeId(part);
       
  1409             QList<QVariant> list;
       
  1410 
       
  1411             TRAPD( error, QT_TRYCATCH_LEAVING(
       
  1412                     animationData = static_cast<CAknsBmpAnimItemData*>(skinInstance->CreateUncachedItemDataL(
       
  1413                             animationSkinId, EAknsITBmpAnim))));
       
  1414             if (error)
       
  1415                 return list;
       
  1416 
       
  1417             if (animationData) {
       
  1418                 list.append((int)animationData->FrameInterval());
       
  1419                 list.append((int)animationData->NumberOfImages());
       
  1420 
       
  1421                 QS60StyleEnums::AnimationMode playMode;
       
  1422                 switch(animationData->PlayMode()) {
       
  1423                     case CBitmapAnimClientData::EPlay:
       
  1424                         playMode = QS60StyleEnums::AM_PlayOnce;
       
  1425                         break;
       
  1426                     case CBitmapAnimClientData::ECycle:
       
  1427                         playMode = QS60StyleEnums::AM_Looping;
       
  1428                         break;
       
  1429                     case CBitmapAnimClientData::EBounce:
       
  1430                         playMode = QS60StyleEnums::AM_Bounce;
       
  1431                         break;
       
  1432                     default:
       
  1433                         break;
       
  1434                 }
       
  1435                 list.append(QVariant((int)playMode));
       
  1436                 delete animationData;
       
  1437             } else {
       
  1438                 list.append(0);
       
  1439                 list.append(0);
       
  1440             }
       
  1441             return list;
       
  1442         }
       
  1443         break;
       
  1444     default:
       
  1445         break;
       
  1446     }
       
  1447     return QVariant();
       
  1448 }
       
  1449 
  1195 #endif // Q_WS_S60
  1450 #endif // Q_WS_S60
  1196 
  1451 
  1197 QT_END_NAMESPACE
  1452 QT_END_NAMESPACE
  1198 
  1453 
  1199 #endif // QT_NO_STYLE_S60 || QT_PLUGIN
  1454 #endif // QT_NO_STYLE_S60 || QT_PLUGIN