Ignore:
Timestamp:
Mar 8, 2010, 12:52:58 PM (15 years ago)
Author:
Dmitry A. Kuminov
Message:

trunk: Merged in qt 4.6.2 sources.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/src/gui/styles/qs60style_s60.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    6464#include <aknnavi.h>
    6565#include <gulicon.h>
     66#include <AknBitmapAnimation.h>
    6667
    6768#if !defined(QT_NO_STYLE_S60) || defined(QT_PLUGIN)
     
    7374    EDrawGulIcon,
    7475    EDrawBackground,
     76    EDrawAnimation,
    7577    ENoDraw
    7678};
     
    98100} partMapEntry;
    99101
     102AnimationData::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
     107AnimationDataV2::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}
     111AnimationDataV2::~AnimationDataV2()
     112{
     113    delete m_animation;
     114}
     115
     116QS60StyleAnimation::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
     122QS60StyleAnimation::~QS60StyleAnimation()
     123{
     124    delete m_currentData;
     125    delete m_defaultData;
     126}
     127
     128void 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
     136void QS60StyleAnimation::resetToDefaults()
     137{
     138    delete m_currentData;
     139    m_currentData = 0;
     140    QT_TRAP_THROWING(m_currentData = new (ELeave) AnimationDataV2(*m_defaultData));
     141}
     142
    100143class QS60StyleModeSpecifics
    101144{
     
    114157    static TAknsItemID partSpecificThemeId(int part);
    115158
     159    static QVariant themeDefinition(QS60StyleEnums::ThemeDefinitions definition, QS60StyleEnums::SkinParts part);
     160
    116161private:
    117162    static QPixmap createSkinnedGraphicsLX(QS60StyleEnums::SkinParts part,
     
    129174
    130175const partMapEntry QS60StyleModeSpecifics::m_partMap[] = {
    131     /* SP_QgnGrafBarWait */                {KAknsIIDQgnGrafBarWaitAnim,            EDrawIcon,   ES60_All,    -1,-1},
     176    /* SP_QgnGrafBarWaitAnim */            {KAknsIIDQgnGrafBarWaitAnim,       EDrawAnimation,   ES60_All,    -1,-1},
    132177    /* SP_QgnGrafBarFrameCenter */         {KAknsIIDQgnGrafBarFrameCenter,         EDrawIcon,   ES60_All,    -1,-1},
    133178    /* SP_QgnGrafBarFrameSideL */          {KAknsIIDQgnGrafBarFrameSideL,          EDrawIcon,   ES60_All,    -1,-1},
     
    372417{
    373418    switch(stylePart) {
    374         case QS60StyleEnums::SP_QgnGrafBarWait:
     419        case QS60StyleEnums::SP_QgnGrafBarWaitAnim:
    375420            fallbackIndex = EMbmAvkonQgn_graf_bar_wait_1;
    376421            break;
     
    605650}
    606651
     652bool QS60StylePrivate::isSingleClickUi()
     653{
     654    return (QSysInfo::s60Version() > QSysInfo::SV_S60_5_0);
     655}
     656
    607657QPoint qt_s60_fill_background_offset(const QWidget *targetWidget)
    608658{
     
    710760            break;
    711761        }
     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        }
    712825    }
    713826    if (!result)
     
    732845    QPixmap result;
    733846
    734 //        QS60WindowSurface::unlockBitmapHeap();
    735847    static const TDisplayMode displayMode = S60->supportsPremultipliedAlpha ? Q_SYMBIAN_ECOLOR16MAP : EColor16MA;
    736848    static const TInt drawParam = S60->supportsPremultipliedAlpha ? KAknsDrawParamDefault : KAknsDrawParamNoClearUnderImage|KAknsDrawParamRGBOnly;
     
    9101022
    9111023QFont 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
    9141029    TAknFontCategory aknFontCategory = EAknFontCategoryUndefined;
    9151030    switch (fontCategory) {
     
    9831098}
    9841099
     1100Q_GLOBAL_STATIC(QList<QS60StyleAnimation *>, m_animations)
     1101
    9851102QS60StylePrivate::QS60StylePrivate()
    9861103{
     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);
    9871107    // No need to set active layout, if dynamic metrics API is available
    9881108    setActiveLayout();
     
    11851305        topLevelWidget->ensurePolished();
    11861306    }
     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
    11871312}
    11881313
     
    12041329}
    12051330
     1331int 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
     1340QS60StyleAnimation* 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
     1351void 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
     1377void 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
     1392QVariant 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
    12061446#endif // Q_WS_S60
    12071447
Note: See TracChangeset for help on using the changeset viewer.