src/hbcore/effects/hbeffect.cpp
changeset 21 4633027730f5
parent 5 627c4a0fd0e7
child 30 80e4d18b72f5
equal deleted inserted replaced
7:923ff622b8b9 21:4633027730f5
   125 
   125 
   126 HbEffectPrivate::~HbEffectPrivate()
   126 HbEffectPrivate::~HbEffectPrivate()
   127 {
   127 {
   128     privateDestroyed = true;
   128     privateDestroyed = true;
   129     mDisabledItems.clear();
   129     mDisabledItems.clear();
       
   130     // Delete all remaining animated item groups
       
   131     HbAnimatedItemGroup *itemGroup = 0;
       
   132     while (mAnimatedItemGroups.count()) {
       
   133         itemGroup = mAnimatedItemGroups.first();
       
   134         animatedItemGroupFinished(itemGroup);
       
   135     }
   130 }
   136 }
   131 
   137 
   132 void HbEffectPrivate::connectViewChanges()
   138 void HbEffectPrivate::connectViewChanges()
   133 {
   139 {
   134     // Connect to view change signals if not done yet
   140     // Connect to view change signals if not done yet
   139             connect(window, SIGNAL(currentViewChanged(HbView *)), SLOT(handleViewChanged(HbView *)));
   145             connect(window, SIGNAL(currentViewChanged(HbView *)), SLOT(handleViewChanged(HbView *)));
   140         }
   146         }
   141         // Need a notification when a mainwindow is added in the future.
   147         // Need a notification when a mainwindow is added in the future.
   142         connect(HbInstancePrivate::d_ptr(), SIGNAL(windowAdded(HbMainWindow *)), SLOT(handleWindowAdded(HbMainWindow *)));
   148         connect(HbInstancePrivate::d_ptr(), SIGNAL(windowAdded(HbMainWindow *)), SLOT(handleWindowAdded(HbMainWindow *)));
   143     }
   149     }
       
   150 }
       
   151 
       
   152 void HbEffectPrivate::addAnimatedItemGroup(HbAnimatedItemGroup *newGroup)
       
   153 {
       
   154     // Let HbEffectPrivate handle the deletion of animated item group
       
   155     connect(newGroup, SIGNAL(finished(HbAnimatedItemGroup *)),
       
   156             this, SLOT(animatedItemGroupFinished(HbAnimatedItemGroup *)));
       
   157     mAnimatedItemGroups.append(newGroup);
   144 }
   158 }
   145 
   159 
   146 void HbEffectPrivate::handleWindowAdded(HbMainWindow *window)
   160 void HbEffectPrivate::handleWindowAdded(HbMainWindow *window)
   147 {
   161 {
   148     connect(window, SIGNAL(currentViewChanged(HbView *)), SLOT(handleViewChanged(HbView *)));
   162     connect(window, SIGNAL(currentViewChanged(HbView *)), SLOT(handleViewChanged(HbView *)));
   189             }
   203             }
   190         }
   204         }
   191     }
   205     }
   192 }
   206 }
   193 
   207 
       
   208 void HbEffectPrivate::animatedItemGroupFinished(HbAnimatedItemGroup *itemGroup)
       
   209 {
       
   210     // Called when animated item group is finished - delete later and remove from register
       
   211     if (itemGroup) {
       
   212         int itemIndex = mAnimatedItemGroups.indexOf(itemGroup);
       
   213         if (itemIndex >= 0) {
       
   214             itemGroup->deleteLater();
       
   215             itemGroup = 0;
       
   216             mAnimatedItemGroups.removeAt(itemIndex);
       
   217         }
       
   218     }
       
   219 }
   194 
   220 
   195 HbAnimatedItemGroup::HbAnimatedItemGroup(
   221 HbAnimatedItemGroup::HbAnimatedItemGroup(
   196     const QList<QGraphicsItem *> &items,
   222     const QList<QGraphicsItem *> &items,
   197     QObject *receiver,
   223     QObject *receiver,
   198     const char *member,
   224     const char *member,
   205     mUserData(userData)
   231     mUserData(userData)
   206 {
   232 {
   207     // Need information of receiver destroyed because this class gets
   233     // Need information of receiver destroyed because this class gets
   208     // the notifications asynchronously so it must not invoke the
   234     // the notifications asynchronously so it must not invoke the
   209     // receiver if it has been destroyed meanwhile.
   235     // receiver if it has been destroyed meanwhile.
   210     connect(mReceiver, SIGNAL(destroyed()), this, SLOT(receiverDestroyed()));
   236     if (mReceiver) {
       
   237         connect(mReceiver, SIGNAL(destroyed()), this, SLOT(receiverDestroyed()));
       
   238     }
   211 }
   239 }
   212 
   240 
   213 void HbAnimatedItemGroup::finished(const HbEffect::EffectStatus &status)
   241 void HbAnimatedItemGroup::finished(const HbEffect::EffectStatus &status)
   214 {
   242 {
   215     if (++mFinishedCount == mItems.count()) {
   243     if (++mFinishedCount == mItems.count()) {
   219                 mFunction.toAscii().data(),
   247                 mFunction.toAscii().data(),
   220                 Qt::AutoConnection,
   248                 Qt::AutoConnection,
   221                 QGenericReturnArgument(),
   249                 QGenericReturnArgument(),
   222                 Q_ARG(HbEffect::EffectStatus, status));
   250                 Q_ARG(HbEffect::EffectStatus, status));
   223         }
   251         }
   224         // We are done, delete self.
   252         // We are done, notify owner
   225         deleteLater();
   253         emit finished(this);
   226     }
   254     }
   227 }
   255 }
   228 
   256 
   229 void HbAnimatedItemGroup::receiverDestroyed()
   257 void HbAnimatedItemGroup::receiverDestroyed()
   230 {
   258 {
   738     }
   766     }
   739 
   767 
   740     // Connect to view changes if not done yet
   768     // Connect to view changes if not done yet
   741     d.connectViewChanges();
   769     d.connectViewChanges();
   742 
   770 
   743     // This object deletes itself when the effect has finished.
       
   744     HbAnimatedItemGroup *group = new HbAnimatedItemGroup(items, receiver, member, userData);
   771     HbAnimatedItemGroup *group = new HbAnimatedItemGroup(items, receiver, member, userData);
       
   772     d.addAnimatedItemGroup(group);
   745 
   773 
   746     bool ret = false;
   774     bool ret = false;
   747 
   775 
   748     QObject *groupReceiver = 0;
   776     QObject *groupReceiver = 0;
   749     const char *groupMember = "";
   777     const char *groupMember = "";