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}, |
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 |