Changeset 651 for trunk/src/gui/styles/qs60style_s60.cpp
- Timestamp:
- Mar 8, 2010, 12:52:58 PM (15 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk
- Property svn:mergeinfo changed
/branches/vendor/nokia/qt/4.6.2 (added) merged: 650 /branches/vendor/nokia/qt/current merged: 649 /branches/vendor/nokia/qt/4.6.1 removed
- Property svn:mergeinfo changed
-
trunk/src/gui/styles/qs60style_s60.cpp
r561 r651 1 1 /**************************************************************************** 2 2 ** 3 ** Copyright (C) 20 09Nokia Corporation and/or its subsidiary(-ies).3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). 4 4 ** All rights reserved. 5 5 ** Contact: Nokia Corporation (qt-info@nokia.com) … … 64 64 #include <aknnavi.h> 65 65 #include <gulicon.h> 66 #include <AknBitmapAnimation.h> 66 67 67 68 #if !defined(QT_NO_STYLE_S60) || defined(QT_PLUGIN) … … 73 74 EDrawGulIcon, 74 75 EDrawBackground, 76 EDrawAnimation, 75 77 ENoDraw 76 78 }; … … 98 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_resourceBased(false), m_animation(0), 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 143 class QS60StyleModeSpecifics 101 144 { … … 114 157 static TAknsItemID partSpecificThemeId(int part); 115 158 159 static QVariant themeDefinition(QS60StyleEnums::ThemeDefinitions definition, QS60StyleEnums::SkinParts part); 160 116 161 private: 117 162 static QPixmap createSkinnedGraphicsLX(QS60StyleEnums::SkinParts part, … … 129 174 130 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 177 /* SP_QgnGrafBarFrameCenter */ {KAknsIIDQgnGrafBarFrameCenter, EDrawIcon, ES60_All, -1,-1}, 133 178 /* SP_QgnGrafBarFrameSideL */ {KAknsIIDQgnGrafBarFrameSideL, EDrawIcon, ES60_All, -1,-1}, … … 372 417 { 373 418 switch(stylePart) { 374 case QS60StyleEnums::SP_QgnGrafBarWait :419 case QS60StyleEnums::SP_QgnGrafBarWaitAnim: 375 420 fallbackIndex = EMbmAvkonQgn_graf_bar_wait_1; 376 421 break; … … 605 650 } 606 651 652 bool QS60StylePrivate::isSingleClickUi() 653 { 654 return (QSysInfo::s60Version() > QSysInfo::SV_S60_5_0); 655 } 656 607 657 QPoint qt_s60_fill_background_offset(const QWidget *targetWidget) 608 658 { … … 710 760 break; 711 761 } 762 case EDrawAnimation: { 763 CFbsBitmap* animationFrame; 764 CFbsBitmap* frameMask; 765 CAknBitmapAnimation* aknAnimation = 0; 766 TBool constructedFromTheme = ETrue; 767 768 QS60StyleAnimation* animation = QS60StylePrivate::animationDefinition(part); //ownership is not passed 769 if (animation) { 770 if (!animation->animationObject() && !animation->isResourceBased()) {// no pre-made item exists, create new animation 771 CAknBitmapAnimation* newAnimation = CAknBitmapAnimation::NewL(); 772 CleanupStack::PushL(newAnimation); 773 if (newAnimation) 774 constructedFromTheme = newAnimation->ConstructFromSkinL(skinId); 775 if (constructedFromTheme && newAnimation->BitmapAnimData()->FrameArray().Count() > 0) { 776 animation->setResourceBased(false); 777 animation->setAnimationObject(newAnimation); //animation takes ownership 778 } 779 CleanupStack::Pop(newAnimation); 780 } 781 //fill-in stored information 782 aknAnimation = animation->animationObject(); 783 constructedFromTheme = !animation->isResourceBased(); 784 } 785 786 const int currentFrame = QS60StylePrivate::currentAnimationFrame(part); 787 if (constructedFromTheme && aknAnimation && aknAnimation->BitmapAnimData()->FrameArray().Count() > 0) { 788 //Animation was created succesfully and contains frames, just fetch current frame 789 if(currentFrame >= aknAnimation->BitmapAnimData()->FrameArray().Count()) 790 User::Leave(KErrOverflow); 791 const CBitmapFrameData* frameData = aknAnimation->BitmapAnimData()->FrameArray().At(currentFrame); 792 if (frameData) { 793 animationFrame = frameData->Bitmap(); 794 frameMask = frameData->Mask(); 795 } 796 } else { 797 //Theme does not contain animation theming, create frames from resource file 798 TInt fallbackGraphicID = -1; 799 fallbackInfo(part, fallbackGraphicID); 800 fallbackGraphicID = fallbackGraphicID + (currentFrame * 2); //skip masks 801 TInt fallbackGraphicsMaskID = 802 (fallbackGraphicID == KErrNotFound) ? KErrNotFound : fallbackGraphicID + 1; //masks are auto-generated as next in mif files 803 if (fallbackGraphicsMaskID != KErrNotFound) 804 fallbackGraphicsMaskID = fallbackGraphicsMaskID + (currentFrame * 2); //skip actual graphics 805 806 //Then draw animation frame 807 AknsUtils::CreateIconL( 808 skinInstance, 809 KAknsIIDDefault, //animation is not themed, lets force fallback graphics 810 animationFrame, 811 frameMask, 812 AknIconUtils::AvkonIconFileName(), 813 fallbackGraphicID , 814 fallbackGraphicsMaskID); 815 } 816 result = fromFbsBitmap(animationFrame, frameMask, flags, targetSize); 817 if (!constructedFromTheme) { 818 delete animationFrame; 819 animationFrame = 0; 820 delete frameMask; 821 frameMask = 0; 822 } 823 break; 824 } 712 825 } 713 826 if (!result) … … 732 845 QPixmap result; 733 846 734 // QS60WindowSurface::unlockBitmapHeap();735 847 static const TDisplayMode displayMode = S60->supportsPremultipliedAlpha ? Q_SYMBIAN_ECOLOR16MAP : EColor16MA; 736 848 static const TInt drawParam = S60->supportsPremultipliedAlpha ? KAknsDrawParamDefault : KAknsDrawParamNoClearUnderImage|KAknsDrawParamRGBOnly; … … 910 1022 911 1023 QFont QS60StylePrivate::s60Font_specific( 912 QS60StyleEnums::FontCategories fontCategory, int pointSize) 913 { 1024 QS60StyleEnums::FontCategories fontCategory, 1025 int pointSize, bool resolveFontSize) 1026 { 1027 Q_UNUSED(resolveFontSize); 1028 914 1029 TAknFontCategory aknFontCategory = EAknFontCategoryUndefined; 915 1030 switch (fontCategory) { … … 983 1098 } 984 1099 1100 Q_GLOBAL_STATIC(QList<QS60StyleAnimation *>, m_animations) 1101 985 1102 QS60StylePrivate::QS60StylePrivate() 986 1103 { 1104 //Animation defaults need to be created when style is instantiated 1105 QS60StyleAnimation* progressBarAnimation = new QS60StyleAnimation(QS60StyleEnums::SP_QgnGrafBarWaitAnim, 7, 100); 1106 m_animations()->append(progressBarAnimation); 987 1107 // No need to set active layout, if dynamic metrics API is available 988 1108 setActiveLayout(); … … 1185 1305 topLevelWidget->ensurePolished(); 1186 1306 } 1307 #ifndef QT_NO_PROGRESSBAR 1308 //re-start animation timer 1309 stopAnimation(QS60StyleEnums::SP_QgnGrafBarWaitAnim); //todo: once we have more animations, we could say "stop all running ones" 1310 startAnimation(QS60StyleEnums::SP_QgnGrafBarWaitAnim); //and "re-start all previously running ones" 1311 #endif 1187 1312 } 1188 1313 … … 1204 1329 } 1205 1330 1331 int QS60StylePrivate::currentAnimationFrame(QS60StyleEnums::SkinParts part) 1332 { 1333 QS60StyleAnimation *animation = animationDefinition(part); 1334 // todo: looping could be done in QS60Style::timerEvent 1335 if (animation->frameCount() == animation->currentFrame()) 1336 animation->setCurrentFrame(0); 1337 return animation->currentFrame(); 1338 } 1339 1340 QS60StyleAnimation* QS60StylePrivate::animationDefinition(QS60StyleEnums::SkinParts part) 1341 { 1342 int i = 0; 1343 const int animationsCount = m_animations()->isEmpty() ? 0 : m_animations()->count(); 1344 for(; i < animationsCount; i++) { 1345 if (part == m_animations()->at(i)->animationId()) 1346 break; 1347 } 1348 return m_animations()->at(i); 1349 } 1350 1351 void QS60StylePrivate::startAnimation(QS60StyleEnums::SkinParts animationPart) 1352 { 1353 Q_Q(QS60Style); 1354 1355 //Query animation data from theme and store values to local struct. 1356 QVariant themeAnimationDataVariant = QS60StyleModeSpecifics::themeDefinition( 1357 QS60StyleEnums::TD_AnimationData, animationPart); 1358 QList<QVariant> themeAnimationData = themeAnimationDataVariant.toList(); 1359 1360 QS60StyleAnimation *animation = QS60StylePrivate::animationDefinition(animationPart); 1361 if (animation) { 1362 if (themeAnimationData.at(QS60StyleEnums::AD_Interval).toInt() != 0) 1363 animation->setInterval(themeAnimationData.at(QS60StyleEnums::AD_Interval).toInt()); 1364 1365 if (themeAnimationData.at(QS60StyleEnums::AD_NumberOfFrames).toInt() != 0) 1366 animation->setFrameCount(themeAnimationData.at(QS60StyleEnums::AD_NumberOfFrames).toInt()); 1367 1368 //todo: playmode is ignored for now, since it seems to return invalid data on some themes 1369 //lets use the table values for play mode 1370 1371 animation->setCurrentFrame(0); //always initialize 1372 const int timerId = q->startTimer(animation->interval()); 1373 animation->setTimerId(timerId); 1374 } 1375 } 1376 1377 void QS60StylePrivate::stopAnimation(QS60StyleEnums::SkinParts animationPart) 1378 { 1379 Q_Q(QS60Style); 1380 1381 QS60StyleAnimation *animation = QS60StylePrivate::animationDefinition(animationPart); 1382 if (animation) { 1383 animation->setCurrentFrame(0); 1384 if (animation->timerId() != 0) { 1385 q->killTimer(animation->timerId()); 1386 animation->setTimerId(0); 1387 } 1388 animation->resetToDefaults(); 1389 } 1390 } 1391 1392 QVariant QS60StyleModeSpecifics::themeDefinition( 1393 QS60StyleEnums::ThemeDefinitions definition, QS60StyleEnums::SkinParts part) 1394 { 1395 MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance(); 1396 1397 Q_ASSERT(skinInstance); 1398 1399 switch(definition) { 1400 //Animation definitions 1401 case QS60StyleEnums::TD_AnimationData: 1402 { 1403 CAknsBmpAnimItemData *animationData; 1404 TAknsItemID animationSkinId = partSpecificThemeId(part); 1405 QList<QVariant> list; 1406 1407 TRAPD( error, QT_TRYCATCH_LEAVING( 1408 animationData = static_cast<CAknsBmpAnimItemData*>(skinInstance->CreateUncachedItemDataL( 1409 animationSkinId, EAknsITBmpAnim)))); 1410 if (error) 1411 return list; 1412 1413 if (animationData) { 1414 list.append((int)animationData->FrameInterval()); 1415 list.append((int)animationData->NumberOfImages()); 1416 1417 QS60StyleEnums::AnimationMode playMode; 1418 switch(animationData->PlayMode()) { 1419 case CBitmapAnimClientData::EPlay: 1420 playMode = QS60StyleEnums::AM_PlayOnce; 1421 break; 1422 case CBitmapAnimClientData::ECycle: 1423 playMode = QS60StyleEnums::AM_Looping; 1424 break; 1425 case CBitmapAnimClientData::EBounce: 1426 playMode = QS60StyleEnums::AM_Bounce; 1427 break; 1428 default: 1429 break; 1430 } 1431 list.append(QVariant((int)playMode)); 1432 delete animationData; 1433 } else { 1434 list.append(0); 1435 list.append(0); 1436 } 1437 return list; 1438 } 1439 break; 1440 default: 1441 break; 1442 } 1443 return QVariant(); 1444 } 1445 1206 1446 #endif // Q_WS_S60 1207 1447
Note:
See TracChangeset
for help on using the changeset viewer.