diff -r c743ef5928ba -r f9ce957a272c homescreenapp/hsutils/src/hspageindicator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/hsutils/src/hspageindicator.cpp Fri Mar 19 09:27:44 2010 +0200 @@ -0,0 +1,250 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Menu Event. +* +*/ + +#include +#include +#include +#include +#include + +#include + +#include "hspageindicator.h" + +const char *KPageIndicatorActiveItemImageName = "qtg_graf_hspage_highlight"; +const char *KPageIndicatorNonActiveItemImageName = "qtg_graf_hspage_normal"; + +/*! + \class HsPageIndicator + \ingroup group_hsutils + \brief Page indicator widget. +*/ + +/*! + Constructor. + + \a parent Owner. +*/ +HsPageIndicator::HsPageIndicator(QGraphicsItem* parent): + HbWidget(parent), + mItemCount(0), + mCurrentIndex(0), + mNonActiveIcon(0), + mActiveIcon(0), + mIconAnimationGroup(0) +{ + mItemSize = QSizeF(30, 15); + + // perf improvement to load icons only once + mNonActiveIcon = new HbIcon(KPageIndicatorNonActiveItemImageName); + mActiveIcon = new HbIcon(KPageIndicatorActiveItemImageName); + + QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Horizontal); + layout->addStretch(); + + mPageIndicatorLayout = new QGraphicsLinearLayout(Qt::Horizontal); + layout->addItem(mPageIndicatorLayout); + + layout->addStretch(); + + setLayout(layout); +} + +/*! + Destructor. +*/ +HsPageIndicator::~HsPageIndicator() +{ +} + +/*! + \fn HsPageIndicator::currentItemChangeAnimationFinished() + Signaled when current item is changed and animation is finished. +*/ + +/*! + Add an item and animates if \a animated is true and sets the + new page as current if \a setAsCurrent is true +*/ +void HsPageIndicator::addItem(bool setAsCurrent,bool animated) +{ + mItemCount++; + addItemInternal(setAsCurrent,mItemCount - 1,animated); +} + +/*! + Removes on item and animates if \a animated is true. +*/ +void HsPageIndicator::removeItem(bool animated) +{ + if (mItemCount < 1) { + return; + } + + mItemCount--; + + if(mCurrentIndex == mItemCount) { + setCurrentIndex(mItemCount-1,animated); + } + + QGraphicsLayoutItem *item = mPageIndicatorLayout->itemAt(mPageIndicatorLayout->count() - 1); + mPageIndicatorLayout->removeAt(mPageIndicatorLayout->count() - 1); + + if (mItemCount < 2) { + hide(); + } + + delete item; + layout()->invalidate(); +} + +/*! + Set \a currentIndex as current item and animates the change if \a animated + is true. +*/ +void HsPageIndicator::setCurrentIndex(int currentIndex,bool animated) +{ + if( currentIndex < mPageIndicatorLayout->count() && currentIndex>=0) { + if ( mIconAnimationGroup ) { + mIconAnimationGroup->disconnect(this); + resetEffect(); + } + + QGraphicsLayoutItem *previousItem = mPageIndicatorLayout->itemAt(mCurrentIndex); + HbIconItem *previousIconItem = static_cast(previousItem); + previousIconItem->setIcon(*mNonActiveIcon); + mCurrentIndex = currentIndex; + + if (animated) { + startItemAnimation(); + } + } +} + +/*! + Sets the item count to \a itemCount. Ie. removes or adds items if + necessary. +*/ +void HsPageIndicator::setItemCount(int itemCount) +{ + if (mItemCount < itemCount) { + int count = itemCount - mItemCount; + for (int i = 0; i < count; ++i) { + addItem(false,false); + } + } else if (mItemCount > itemCount) { + int count = mItemCount - itemCount; + for (int i = 0; i < count; ++i) { + removeItem(false); + } + } +} + +/*! + Returns the item count +*/ +int HsPageIndicator::itemCount() +{ + return mItemCount; +} + + +/*! + Returns current index. +*/ +int HsPageIndicator::currentIndex() +{ + return mCurrentIndex; +} + +/*! + Returns true if current item animation is ongoing. +*/ +bool HsPageIndicator::isAnimatingCurrentItemChange() +{ + return mIconAnimationGroup; +} + +/*! + \internal +*/ +void HsPageIndicator::resetEffect() +{ + QGraphicsLayoutItem *item = mPageIndicatorLayout->itemAt(mCurrentIndex); + HbIconItem *iconItem = static_cast(item); + if ( iconItem ) { + QPointer iconEffect = iconItem->graphicsEffect(); + iconItem->setGraphicsEffect(0); + if (iconEffect) { + delete iconEffect; + } + } + mIconAnimationGroup = 0; + emit currentItemChangeAnimationFinished(); +} + +/*! + \internal +*/ +void HsPageIndicator::addItemInternal(bool setAsCurrent,int itemIndex,bool animated) +{ + HbIconItem *iconItem = new HbIconItem(); + iconItem->setIcon(*mNonActiveIcon); + iconItem->setPreferredSize(mItemSize); + iconItem->setMinimumSize(mItemSize); + iconItem->setMaximumSize(mItemSize); + + mPageIndicatorLayout->addItem(iconItem); + if (setAsCurrent) { + setCurrentIndex(itemIndex,animated); + } + layout()->invalidate(); + + if (mItemCount < 2) { + hide(); + } else { + show(); + } +} + +/*! + \internal +*/ +void HsPageIndicator::startItemAnimation() +{ + QGraphicsLayoutItem *item = mPageIndicatorLayout->itemAt(mCurrentIndex); + HbIconItem *iconItem = static_cast(item); + iconItem->setIcon(*mActiveIcon); + + QGraphicsBlurEffect* iconBlurEffect = new QGraphicsBlurEffect(); + iconBlurEffect->setBlurRadius(9); + iconItem->setGraphicsEffect(iconBlurEffect); + iconItem->setTransformOriginPoint(iconItem->rect().center()); + + mIconAnimationGroup = new QParallelAnimationGroup(); + + QPropertyAnimation *animation = new QPropertyAnimation(iconItem, "scale"); + animation->setDuration(1000); + animation->setKeyValueAt(0.5, 2); + animation->setEndValue(1.0); + mIconAnimationGroup->addAnimation(animation); + + connect(mIconAnimationGroup, SIGNAL(finished()), SLOT(resetEffect())); + + mIconAnimationGroup->start(QAbstractAnimation::DeleteWhenStopped); + +}