--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/radioapp/radiowidgets/src/radiocarouselanimator.cpp Thu Jul 22 16:33:45 2010 +0100
@@ -0,0 +1,217 @@
+/*
+* 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:
+*
+*/
+
+// System includes
+#include <QTimer>
+#include <QTimeLine>
+#include <HbLabel>
+
+// User includes
+#include "radiocarouselanimator.h"
+#include "radiostationcarousel.h"
+#include "radiocarouselitem.h"
+#include "radiostation.h"
+#include "radiostationmodel.h"
+#include "radiologger.h"
+
+// Constants
+const int FREQUENCY_SCROLL_DIVIDER = 100000;
+const int NUMBER_SCROLL_TIMELINE_DURATION = 1000;
+const int FLASH_TIMER_INTERVAL = 400;
+const qreal FLASHING_ITEM_DIM_OPACITY = 0.3;
+const qreal FLASHING_ITEM_NORMAL_OPACITY = 1.0;
+
+/*!
+ *
+ */
+RadioCarouselAnimator::RadioCarouselAnimator( RadioStationCarousel& carousel ) :
+ mCarousel( carousel ),
+ mAnimationTimeLine( new QTimeLine( NUMBER_SCROLL_TIMELINE_DURATION, this ) ),
+ mTimer( new QTimer( this ) ),
+ mCanceled( false ),
+ mMode( NoAnimation ),
+ mStationIsFavorite( false ),
+ mFlashingToggle( false )
+{
+ mAnimationTimeLine->setCurveShape( QTimeLine::EaseInCurve );
+ Radio::connect( mAnimationTimeLine, SIGNAL(finished()),
+ this, SLOT(finalizeNumberScroll()) );
+ Radio::connect( mAnimationTimeLine, SIGNAL(frameChanged(int)),
+ this, SLOT(updateNumberScroll(int)) );
+
+ mTimer->setInterval( FLASH_TIMER_INTERVAL );
+ mTimer->setSingleShot( false );
+ Radio::connect( mTimer, SIGNAL(timeout()),
+ this, SLOT(handleTimeout()) );
+}
+
+/*!
+ *
+ */
+RadioCarouselAnimator::~RadioCarouselAnimator()
+{
+ stopAll();
+}
+
+/*!
+ *
+ */
+void RadioCarouselAnimator::startNumberScroll( const uint startFrequency, const uint stopFrequency )
+{
+ addMode( ScrollingNumbers );
+
+ //TODO: Take italy case into account
+ mAnimationTimeLine->setDuration( NUMBER_SCROLL_TIMELINE_DURATION );
+ mAnimationTimeLine->setFrameRange( startFrequency / FREQUENCY_SCROLL_DIVIDER,
+ stopFrequency / FREQUENCY_SCROLL_DIVIDER );
+ mAnimationTimeLine->start();
+
+ mCarousel.scrollContentsTo( QPointF( -mCarousel.mMaxScrollPos, 0 ), mCarousel.mAutoScrollTime );
+}
+
+/*!
+ *
+ */
+void RadioCarouselAnimator::startFlashingIcon()
+{
+ const uint frequency = mCarousel.mItems[RadioStationCarousel::CenterItem]->frequency();
+ RadioStation station;
+ mCarousel.mModel->findFrequency( frequency, station );
+ mStationIsFavorite = station.isFavorite();
+
+ mCarousel.mItems[RadioStationCarousel::CenterItem]->setIconOpacity( FLASHING_ITEM_DIM_OPACITY );
+
+ addMode( FlashingIcon );
+}
+
+/*!
+ *
+ */
+void RadioCarouselAnimator::stopFlashingIcon()
+{
+ mCarousel.mItems[RadioStationCarousel::CenterItem]->setIconOpacity( FLASHING_ITEM_NORMAL_OPACITY );
+ removeMode( FlashingIcon );
+}
+
+/*!
+ *
+ */
+void RadioCarouselAnimator::startFlashingText()
+{
+ mCarousel.mInfoText->setOpacity( FLASHING_ITEM_DIM_OPACITY );
+ addMode( FlashingText );
+}
+
+/*!
+ *
+ */
+void RadioCarouselAnimator::stopFlashingText()
+{
+ mCarousel.mInfoText->setOpacity( FLASHING_ITEM_NORMAL_OPACITY );
+ removeMode( FlashingText );
+}
+
+/*!
+ *
+ */
+void RadioCarouselAnimator::stopAll()
+{
+ mCanceled = true;
+ mAnimationTimeLine->stop();
+ mTimer->stop();
+
+ stopFlashingText();
+ stopFlashingIcon();
+
+ mMode = NoAnimation;
+ deleteLater();
+}
+
+/*!
+ * Private slot
+ *
+ */
+void RadioCarouselAnimator::handleTimeout()
+{
+ mFlashingToggle = !mFlashingToggle;
+ if ( mMode.testFlag( IconItem ) ) {
+ if ( mFlashingToggle ) {
+ mCarousel.mItems[RadioStationCarousel::CenterItem]->setIconOpacity( FLASHING_ITEM_NORMAL_OPACITY );
+ } else {
+ mCarousel.mItems[RadioStationCarousel::CenterItem]->setIconOpacity( FLASHING_ITEM_DIM_OPACITY );
+ }
+ }
+
+ if ( mMode.testFlag( TextItem ) ) {
+ if ( mFlashingToggle ) {
+ mCarousel.mInfoText->setOpacity( FLASHING_ITEM_NORMAL_OPACITY );
+ } else {
+ mCarousel.mInfoText->setOpacity( FLASHING_ITEM_DIM_OPACITY );
+ }
+ }
+}
+
+/*!
+ * Private slot
+ *
+ */
+void RadioCarouselAnimator::updateNumberScroll( int value )
+{
+ mCarousel.mItems[RadioStationCarousel::RightItem]->setFrequency( value * FREQUENCY_SCROLL_DIVIDER );
+}
+
+/*!
+ * Private slot
+ *
+ */
+void RadioCarouselAnimator::finalizeNumberScroll()
+{
+ if ( !mCanceled ) {
+ mCarousel.mItems[RadioStationCarousel::CenterItem]->setFrequency(
+ mCarousel.mItems[RadioStationCarousel::RightItem]->frequency() );
+ mCarousel.scrollContentsTo( QPointF( -mCarousel.mMidScrollPos, 0 ), 0 );
+ emit mCarousel.scanAnimationFinished();
+ }
+ removeMode( ScrollingNumbers );
+}
+
+/*!
+ *
+ */
+void RadioCarouselAnimator::addMode( AnimationMode mode )
+{
+ mMode |= mode;
+ if ( mMode.testFlag( TimerItem ) && !mTimer->isActive() ) {
+ mTimer->start();
+ }
+}
+
+/*!
+ *
+ */
+void RadioCarouselAnimator::removeMode( AnimationMode mode )
+{
+ mMode &= ~mode;
+ if ( !mMode.testFlag( TimerItem ) ) {
+ mTimer->stop();
+ }
+
+ if ( mMode == NoAnimation ) {
+ deleteLater();
+ }
+
+}