radioapp/radiowidgets/src/radiofrequencystrip.cpp
changeset 39 ac7857bd5fdb
parent 38 f8c3d4e6102c
child 47 74b7c6e79031
--- a/radioapp/radiowidgets/src/radiofrequencystrip.cpp	Fri Jul 23 10:16:59 2010 +0300
+++ b/radioapp/radiowidgets/src/radiofrequencystrip.cpp	Fri Aug 06 09:29:48 2010 +0300
@@ -16,19 +16,9 @@
 */
 
 // System includes
-#include <QPainter>
-#include <QStringListModel>
-#include <QGraphicsSceneResizeEvent>
-#include <QPen>
-#include <HbPushButton>
-#include <QTimer>
-#include <HbColorScheme>
-#include <HbEvent>
-#include <HbSwipeGesture>
-#include <HbDeviceProfile>
 
+// User includes
 #include "radiofrequencystrip.h"
-#include "radiofrequencyitem.h"
 #include "radiouiengine.h"
 #include "radiostation.h"
 #include "radiostationmodel.h"
@@ -36,95 +26,11 @@
 #include "radiouiloader.h"
 #include "radiologger.h"
 
-// Frequency lines
-const int TAB_HEIGHT_SMALL = 12;
-const int TAB_HEIGHT_BIG = 18;
-const int PEN_WIDTH_FAVORITE = 4;
-const qreal INDICATOR_WIDTH = 2.0;
-
-const qreal ROUNDER = 0.5;
-const int SELECTOR_WIDTH = 2;
-const int SELECTOR_Z_POS = 100;
-
-const int HALF_HERTZ = ONE_HERTZ / 2;
-const int ONE_TAB_DISTANCE = 20;
-const uint ONE_TAB_IN_HZ = uint( 0.2 * ONE_HERTZ );
-const qreal PIXEL_IN_HZ = ONE_TAB_IN_HZ / ONE_TAB_DISTANCE;
-const qreal PIXMAP_OVERLAP = qreal( ONE_TAB_DISTANCE ) / 2;
-const int ITEM_WIDTH = ONE_TAB_DISTANCE * 5;
-const int PIXMAP_WIDTH = ITEM_WIDTH + (int)PIXMAP_OVERLAP;
-
-const uint ONE_HUNDRED_KHZ = 100000;
-
-const char* DECIMAL_TEXT = ".0";
-
-#ifdef BUILD_WIN32
-    const int FREQUENCY_FONT_SIZE = 12;
-    const int DECIMAL_FONT_SIZE = 8;
-#else
-    const int FREQUENCY_FONT_SIZE = 6;
-    const int DECIMAL_FONT_SIZE = 4;
-#endif // BUILD_WIN32
-
-const QFont FREQUENCY_FONT( "", FREQUENCY_FONT_SIZE );
-const QFont DECIMAL_FONT( "", DECIMAL_FONT_SIZE );
-
-const char* SLIDE_TO_LEFT       = "SlideToLeft";
-const char* SLIDE_FROM_LEFT     = "SlideFromLeft";
-const char* SLIDE_TO_RIGHT      = "SlideToRight";
-const char* SLIDE_FROM_RIGHT    = "SlideFromRight";
-const char* LEFT_BUTTON         = "tv:left_button";
-const char* RIGHT_BUTTON        = "tv:right_button";
-
-const char* TEXT_COLOR_ATTRIBUTE = "text";
-const int MANUALSEEK_START_TIMEOUT = 400;
-const int MANUALSEEK_END_TIMEOUT = 2000;
-const int MANUALSEEK_SIGNAL_DELAY = 300;
-
-/*!
- *
- */
 RadioFrequencyStrip::RadioFrequencyStrip() :
-    RadioStripBase(),
-    mUiEngine( NULL ),
-    mItemHeight( 8 ),
-    mMinFrequency( 87500000 ),
-    mMaxFrequency( 108000000 ),
-    mFrequencyStepSize( 100000 ),
-    mFrequency( 87500000 ),
-    mSelectorImage( new QGraphicsPixmapItem( this ) ),
-    mSeparatorPos( 0.0 ),
-    mMaxWidth( 0 ),
-    mSelectorPos( 0.0 ),
-    mLeftButton( 0 ),
-    mRightButton( 0 ),
-    mManualSeekTimer( NULL ),
-    mManualSeekMode( false ),
-    mLastReportedFrequency( 0 ),
-    mManualSeekTimerId( 0 ),
-    mForegroundColor( Qt::white )//HbColorScheme::color( TEXT_COLOR_ATTRIBUTE ) )
+    RadioFrequencyStripBase(),
+    mUiEngine( NULL )
 {
     RadioUtil::setFrequencyStrip( this );
-
-    setScrollingStyle( HbScrollArea::PanWithFollowOn );
-    setItemSize( QSizeF( ITEM_WIDTH + PIXMAP_OVERLAP / 2, mItemHeight ) );
-    setOverlap( PIXMAP_OVERLAP / 2 );
-}
-
-/*!
- * Property
- */
-void RadioFrequencyStrip::setItemHeight( int itemHeight )
-{
-    mItemHeight = itemHeight;
-}
-
-/*!
- * Property
- */
-int RadioFrequencyStrip::itemHeight() const
-{
-    return mItemHeight;
 }
 
 /*!
@@ -133,46 +39,10 @@
 void RadioFrequencyStrip::init( RadioUiEngine* engine, RadioUiLoader& uiLoader )
 {
     mUiEngine = engine;
-    mMinFrequency       = mUiEngine->minFrequency();
-    mMaxFrequency       = mUiEngine->maxFrequency();
-    mFrequencyStepSize  = mUiEngine->frequencyStepSize();
-    mFrequency          = RadioUiEngine::lastTunedFrequency();
-
-    initModel();
-    initEmptyItems();
-    initPositions();
-
-    HbDeviceProfile deviceProfile;
-    mItemHeight = static_cast<int>( mItemHeight * deviceProfile.unitValue() );
-
-    mLeftButton = uiLoader.findWidget<HbPushButton>( DOCML::MV_NAME_PREV_BUTTON );
-    mRightButton = uiLoader.findWidget<HbPushButton>( DOCML::MV_NAME_NEXT_BUTTON );
-    initButtons();
+    initbase( mUiEngine->minFrequency(), mUiEngine->maxFrequency(),
+              mUiEngine->frequencyStepSize(), RadioUiEngine::lastTunedFrequency() );
 
-    mManualSeekTimer = new QTimer( this );
-    mManualSeekTimer->setInterval( MANUALSEEK_START_TIMEOUT );
-    mManualSeekTimer->setSingleShot( true );
-    Radio::connect( mManualSeekTimer,   SIGNAL(timeout()),
-                    this,               SLOT(toggleManualSeek()) );
-
-    Radio::connect( mLeftButton,    SIGNAL(clicked()),
-                    this,           SLOT(handleLeftButton()) );
-    Radio::connect( mRightButton,   SIGNAL(clicked()),
-                    this,           SLOT(handleRightButton()) );
-    Radio::connect( mLeftButton,    SIGNAL(longPress(QPointF)),
-                    this,           SLOT(handleLongLeftButton()) );
-    Radio::connect( mRightButton,   SIGNAL(longPress(QPointF)),
-                    this,           SLOT(handleLongRightButton()) );
-
-    Radio::connect( this,           SIGNAL(scrollingEnded()),
-                    this,           SLOT(handleScrollingEnd()) );
-
-    grabGesture( Qt::SwipeGesture );
-
-    //TODO: Remove. Stepsize hardcoded to 100 Khz in europe region during demo
-    if ( mFrequencyStepSize < ONE_HUNDRED_KHZ ) {
-        mFrequencyStepSize = ONE_HUNDRED_KHZ;
-    }
+    createButtonsFromDocml( uiLoader, DOCML::MV_NAME_PREV_BUTTON, DOCML::MV_NAME_NEXT_BUTTON );
 
     RadioStationModel* stationModel = &mUiEngine->stationModel();
     Radio::connect( stationModel,   SIGNAL(rowsInserted(QModelIndex,int,int)),
@@ -181,685 +51,118 @@
                     this,           SLOT(removeStation(QModelIndex,int,int)) );
     Radio::connect( stationModel,   SIGNAL(modelReset()),
                     this,           SLOT(initEmptyItems()) );
-
-    updateAllItems();
-
-    showButtons();
-}
-
-/*!
- *
- */
-void RadioFrequencyStrip::setFrequency( const uint frequency, int reason, Scroll::Direction direction )
-{
-    Q_UNUSED( reason );
-    LOG_FORMAT( "RadioFrequencyStrip::setFrequency, frequency: %d, reason: %d", frequency, reason );
-    if ( mFrequencies.contains( frequency ) ) {
-        if ( frequency != mFrequency || reason == TuneReason::Skip ) {
-            scrollToFrequency( frequency, direction, mAutoScrollTime, RadioUtil::tuneReason( reason ) );
-        }
-    }
-}
-
-/*!
- *
- */
-uint RadioFrequencyStrip::frequency() const
-{
-    return mFrequency;
-}
-
-/*!
- *
- */
-bool RadioFrequencyStrip::isInManualSeekMode() const
-{
-    return mManualSeekMode;
-}
-
-/*!
- *
- */
-void RadioFrequencyStrip::cancelManualSeek()
-{
-    mManualSeekTimer->stop();
-    if ( mManualSeekMode ) {
-        toggleManualSeek();
-    }
-}
-
-/*!
- *
- */
-void RadioFrequencyStrip::addScannedStation( const RadioStation& station )
-{
-    FrequencyPos pos = mFrequencies.value( station.frequency() );
-    updateItem( pos.mItem, station.frequency() );
 }
 
 /*!
  *
  */
-void RadioFrequencyStrip::updateFavorite( const RadioStation& station )
-{
-    LOG_SLOT_CALLER;
-    FrequencyPos pos = mFrequencies.value( station.frequency() );
-    updateItem( pos.mItem );
-}
-
-/*!
- * Public slot
- *
- */
-void RadioFrequencyStrip::setScanningMode( bool isScanning )
-{
-    mManualSeekTimer->stop();
-    if ( isScanning ) {
-        initEmptyItems();
-        hideButtons();
-        scrollToFrequency( mMinFrequency, Scroll::Shortest, mAutoScrollTime );
-    } else {
-        showButtons();
-    }
-    setEnabled( !isScanning );
-}
-
-/*!
- * Private slot
- *
- */
-void RadioFrequencyStrip::removeStation( const QModelIndex& parent, int first, int last )
-{
-    Q_UNUSED( parent );
-    updateStationsInRange( first, last, true );
-}
-
-/*!
- * Private slot
- *
- */
-void RadioFrequencyStrip::updateStation( const QModelIndex& parent, int first, int last )
-{
-    Q_UNUSED( parent );
-    updateStationsInRange( first, last );
-}
-
-/*!
- * Private slot
- *
- */
-void RadioFrequencyStrip::initEmptyItems()
-{
-    LOG_METHOD;
-    //TODO: Remove the weird hack of checking the sender
-    if ( !sender() || RadioUtil::scanStatus() != Scan::ScanningInMainView ) {
-        QList<RadioStation> emptyList;
-        foreach ( RadioFrequencyItem* item, mFrequencyItems ) {
-            QPixmap pixmap = drawPixmap( item->frequency(), emptyList, item );
-            item->setPixmap( pixmap );
-        }
-    }
-}
-
-/*!
- * Private slot
- */
-void RadioFrequencyStrip::handleLeftButton()
-{
-    emit skipRequested( StationSkip::PreviousFavorite );
-}
-
-/*!
- * Private slot
- */
-void RadioFrequencyStrip::handleLongLeftButton()
-{
-    emit seekRequested( Seek::Down );
-}
-
-/*!
- * Private slot
- */
-void RadioFrequencyStrip::handleRightButton()
-{
-    emit skipRequested( StationSkip::NextFavorite );
-}
-
-/*!
- * Private slot
- */
-void RadioFrequencyStrip::handleLongRightButton()
-{
-    emit seekRequested( Seek::Up );
-}
-
-/*!
- * Private slot
- *
- */
-void RadioFrequencyStrip::toggleManualSeek()
-{
-    mManualSeekMode = !mManualSeekMode;
-    emit manualSeekChanged( mManualSeekMode );
-
-    if ( mManualSeekMode ) {
-        grabMouse();
-        hideButtons();
-        mManualSeekTimerId = startTimer( MANUALSEEK_SIGNAL_DELAY );
-    } else {
-        ungrabMouse();
-        showButtons();
-        killTimer( mManualSeekTimerId );
-        mManualSeekTimerId = 0;
-    }
-}
-
-/*!
- * Private slot
- */
-void RadioFrequencyStrip::handleScrollingEnd()
+void RadioFrequencyStrip::setFrequency( const uint newFrequency, int reason, Scroll::Direction direction )
 {
-    // Check if the selector is in the invalid area where the strip loops around
-    const int selectorPosition = selectorPos();
-    if ( mManualSeekMode ) {
-        if ( !mPositions.contains( selectorPosition ) ) {
-            if ( selectorPosition < mMaxWidth - ITEM_WIDTH + mSeparatorPos ) {
-                scrollToFrequency( mMaxFrequency, Scroll::Shortest, 500 );
-                emit frequencyChanged( mMaxFrequency, TuneReason::ManualSeekUpdate, Scroll::Shortest );
-            } else {
-                scrollToFrequency( mMinFrequency, Scroll::Shortest, 500 );
-                emit frequencyChanged( mMinFrequency, TuneReason::ManualSeekUpdate, Scroll::Shortest );
-            }
-        }
-
-        mManualSeekTimer->start( MANUALSEEK_END_TIMEOUT );
-    }
-}
-
-/*!
- * \reimp
- */
-void RadioFrequencyStrip::updateItemPrimitive( QGraphicsItem* itemToUpdate, int itemIndex )
-{
-    QGraphicsPixmapItem* item = static_cast<QGraphicsPixmapItem*>( itemToUpdate );
-    if ( itemIndex < mFrequencyItems.count() ) {
-        item->setPixmap( mFrequencyItems.at( itemIndex )->updatePrimitive( item ) );
-    }
-}
-
-/*!
- * \reimp
- */
-QGraphicsItem* RadioFrequencyStrip::createItemPrimitive( QGraphicsItem* parent )
-{
-    return new QGraphicsPixmapItem( parent );
-}
-
-/*!
- * \reimp
- */
-void RadioFrequencyStrip::scrollPosChanged()
-{
-    if ( mManualSeekMode ) {
-        const int pos = selectorPos();
-        const uint frequency = mPositions.value( pos );
-        if ( frequency > 0 ) {
-            mFrequency = mPositions.value( pos );
-            emit frequencyChanged( mFrequency, TuneReason::ManualSeekUpdate, Scroll::Shortest );
-        }
-    }
-}
-
-/*!
- * \reimp
- */
-void RadioFrequencyStrip::resizeEvent ( QGraphicsSceneResizeEvent* event )
-{
-    LOG_METHOD;
-    RadioStripBase::resizeEvent( event );
-
-    initSelector();
-
-    const qreal height = event->newSize().height();
-    const qreal width = event->newSize().width();
-
-    mSelectorPos = width / 2;
-    mSelectorImage->setOffset( mSelectorPos - (INDICATOR_WIDTH / 2), 0.0 );
-
-    if ( mLeftButton && mRightButton ) {
-        mLeftButton->resize( height, height );
-        mRightButton->resize( height, height );
-        mRightButton->setPos( QPointF( width - height, 0 ) );
-    }
-
-    scrollToFrequency( mFrequency );
-}
-
-/*!
- * \reimp
- */
-//void RadioFrequencyStrip::showEvent( QShowEvent* event )
-//{
-//    RadioStripBase::showEvent( event );
-//    scrollToFrequency( mFrequency );
-//}
-
-/*!
- * \reimp
- */
-void RadioFrequencyStrip::changeEvent( QEvent* event )
-{
-    if ( event->type() == HbEvent::ThemeChanged ) {
-        // Update the foreground color and redraw each item
-        mForegroundColor = Qt::white;// HbColorScheme::color( TEXT_COLOR_ATTRIBUTE );
-        updateAllItems();
-    }
-
-    return RadioStripBase::changeEvent(event);
-}
-
-/*!
- * \reimp
- */
-void RadioFrequencyStrip::mousePressEvent( QGraphicsSceneMouseEvent* event )
-{
-    RadioStripBase::mousePressEvent( event );
-
-    mManualSeekTimer->stop();
-    if ( mManualSeekMode ) {
-        const bool insideStrip = rect().contains( event->pos() );
-        if ( !insideStrip ) {
-            toggleManualSeek();
-        }
-    } else {
-        mManualSeekTimer->start( MANUALSEEK_START_TIMEOUT );
-    }
-}
-
-/*!
- * \reimp
- */
-void RadioFrequencyStrip::mouseReleaseEvent( QGraphicsSceneMouseEvent* event )
-{
-    RadioStripBase::mouseReleaseEvent( event );
-
-    mManualSeekTimer->stop();
-    if ( mManualSeekMode && !isScrolling() ) {
-        mManualSeekTimer->start( MANUALSEEK_END_TIMEOUT );
-    }
-}
-
-/*!
- * \reimp
- */
-void RadioFrequencyStrip::gestureEvent( QGestureEvent* event )
-{
-    HbSwipeGesture* swipeGesture = static_cast<HbSwipeGesture*>( event->gesture( Qt::SwipeGesture ) );
-    if ( swipeGesture && !mManualSeekMode ) {
-        if ( swipeGesture->state() == Qt::GestureFinished ) {
-            if ( swipeGesture->horizontalDirection() == QSwipeGesture::Left ) {
-                emit skipRequested( StationSkip::Next );
-            } else if ( swipeGesture->horizontalDirection() == QSwipeGesture::Right ) {
-                emit skipRequested( StationSkip::Previous );
-            }
-        }
-    } else if ( mManualSeekMode ) {
-        RadioStripBase::gestureEvent( event );
+    Q_UNUSED( reason );
+    if ( newFrequency != frequency() || reason == TuneReason::Skip ) {
+        RadioFrequencyStripBase::setFrequency( newFrequency, reason, direction );
     }
 }
 
 /*!
  * \reimp
  */
-void RadioFrequencyStrip::timerEvent( QTimerEvent* event )
+bool RadioFrequencyStrip::isInitialized() const
 {
-    Q_UNUSED( event );
-    if ( mLastReportedFrequency != mFrequency ) {
-        mLastReportedFrequency = mFrequency;
-        emit frequencyChanged( mFrequency, TuneReason::ManualSeekTune, Scroll::Shortest );
-    }
+    return mUiEngine != NULL;
 }
 
 /*!
- *
+ * \reimp
  */
-void RadioFrequencyStrip::initModel()
+QList<FrequencyStrip::StationMarker> RadioFrequencyStrip::stationsInRange( uint minFrequency, uint maxFrequency ) const
 {
-    const uint minFreq = uint( qreal(mMinFrequency) / ONE_HERTZ + ROUNDER );
-    const uint maxFreq = uint( qreal(mMaxFrequency) / ONE_HERTZ + 0.9 ); // always round up
-
-    QStringList list;
-    QString freqText;
-    for ( uint i = minFreq; i <= maxFreq; ++i ) {
-        freqText = QString::number( i );
-        list.append( freqText );
-        mFrequencyItems.append( new RadioFrequencyItem( freqText ) );
+    QList<RadioStation> stations = mUiEngine->stationsInRange( minFrequency, maxFrequency );
+    QList<FrequencyStrip::StationMarker> markers;
+    foreach ( const RadioStation& station, stations ) {
+        markers.append( FrequencyStrip::StationMarker( station.frequency(), station.isFavorite() ) );
     }
-    mFrequencyItems.append( new RadioFrequencyItem( "" ) );
-    list.append( "" );
-
-    mMaxWidth = list.count() * ITEM_WIDTH;
-
-    mSeparatorPos = qreal(ITEM_WIDTH) / 2;
-    const uint minDrawableFreq = minFreq * ONE_HERTZ - HALF_HERTZ;;
-    const uint maxDrawableFreq = maxFreq * ONE_HERTZ + HALF_HERTZ;
-    mSeparatorPos += qreal( ( mMinFrequency  - minDrawableFreq ) / 2 ) / PIXEL_IN_HZ;
-    mSeparatorPos -= qreal( ( maxDrawableFreq - mMaxFrequency ) / 2 ) / PIXEL_IN_HZ;
-
-    setModel( new QStringListModel( list, this ) );
+    return markers;
 }
 
 /*!
- *
+ * \reimp
  */
-void RadioFrequencyStrip::initSelector()
-{
-    QPixmap selectorPixmap = QPixmap( QSize( SELECTOR_WIDTH, (int)size().height() ) );
-    selectorPixmap.fill( Qt::red );
-    mSelectorImage->setPixmap( selectorPixmap );
-    mSelectorImage->setZValue( SELECTOR_Z_POS );
-}
-
-/*!
- *
- */
-void RadioFrequencyStrip::initPositions()
+void RadioFrequencyStrip::emitFrequencyChanged( uint frequency, int reason, int direction )
 {
-    int prevPos = 0;
-    int nextPos = 0;
-    const int lastPos = mFrequencies.value( mMaxFrequency ).mPosition;
-    for ( int i = mFrequencies.value( mMinFrequency ).mPosition; i < lastPos; ++i ) {
-        if ( mPositions.contains( i ) ) {
-            prevPos = i;
-            const uint freq = mPositions.value( prevPos ) + mFrequencyStepSize;
-            if ( mFrequencies.contains( freq ) ) {
-                nextPos = mFrequencies.value( freq ).mPosition;
-            } else {
-                nextPos = prevPos;
-            }
-        } else {
-            const int nearestHit = ( i - prevPos ) < ( nextPos - i ) ? prevPos : nextPos;
-            mPositions.insert( i, mPositions.value( nearestHit ) );
-        }
+    int tuneReason = TuneReason::Unspecified;
+    if ( reason == FrequencyStrip::ManualSeekUpdate ) {
+        tuneReason = TuneReason::ManualSeekUpdate;
+    } else if ( reason == FrequencyStrip::ManualSeekTune ) {
+        tuneReason = TuneReason::ManualSeekTune;
     }
+
+    emit frequencyChanged( frequency, tuneReason, direction );
 }
 
 /*!
  *
  */
-void RadioFrequencyStrip::initButtons()
-{
-    mLeftButton->setZValue( SELECTOR_Z_POS );
-    mLeftButton->setObjectName( LEFT_BUTTON );
-    mRightButton->setZValue( SELECTOR_Z_POS );
-    mRightButton->setObjectName( RIGHT_BUTTON );
-
-    const qreal height = size().height();
-    const qreal width = size().width();
-    mLeftButton->resize( height, height );
-    mRightButton->resize( height, height );
-    mRightButton->setPos( QPointF( width - height, 0 ) );
-
-    QEffectList effectList;
-    effectList.append( EffectInfo( mLeftButton, ":/effects/slide_to_left.fxml", SLIDE_TO_LEFT ) );
-    effectList.append( EffectInfo( mLeftButton, ":/effects/slide_from_left.fxml", SLIDE_FROM_LEFT ) );
-    effectList.append( EffectInfo( mRightButton, ":/effects/slide_to_right.fxml", SLIDE_TO_RIGHT ) );
-    effectList.append( EffectInfo( mRightButton, ":/effects/slide_from_right.fxml", SLIDE_FROM_RIGHT ) );
-    RadioUtil::addEffects( effectList );
-}
-
-/*!
- *
- */
-void RadioFrequencyStrip::addFrequencyPos( int pos, uint frequency, RadioFrequencyItem* item )
-{
-    mFrequencies.insert( frequency, FrequencyPos( pos, item ) );
-    mPositions.insert( pos, frequency );
-}
-
-/*!
- *
- */
-void RadioFrequencyStrip::updateStationsInRange( int first, int last, bool stationRemoved )
+void RadioFrequencyStrip::skipToPrevious()
 {
-    if ( RadioUtil::scanStatus() != Scan::ScanningInMainView ) {
-        RadioStationModel& model = mUiEngine->stationModel();
-        uint frequency = 0;
-        for ( int i = first; i <= last; ++i ) {
-            frequency = model.data( model.index( i, 0, QModelIndex() ),
-                                    RadioRole::RadioStationRole ).value<RadioStation>().frequency();
-            if ( mFrequencies.contains( frequency ) ) {
-                FrequencyPos pos = mFrequencies.value( frequency );
-                updateItem( pos.mItem, 0, stationRemoved ? frequency : 0 );
-            }
-        }
-    }
-}
-
-/*!
- *
- */
-void RadioFrequencyStrip::updateItem( RadioFrequencyItem* item, uint upperRange, uint ignoredFrequency )
-{
-    if ( item ) {
-        uint frequency = item->frequency();
-        QList<RadioStation> stations;
-
-        if ( upperRange == 0 ) {
-            upperRange = frequency + HALF_HERTZ;
-        }
-
-        if ( mUiEngine ) {
-            stations = mUiEngine->stationsInRange( frequency - HALF_HERTZ, upperRange );
-            for ( int i = stations.count() - 1; ignoredFrequency > 0 && i >= 0; --i ) {
-                if ( stations[i].frequency() == ignoredFrequency ) {
-                    stations.removeAt( i );
-                    break;
-                }
-            }
-        }
-
-        QPixmap pixmap = drawPixmap( frequency, stations, item );
-        item->setPixmap( pixmap );
-
-        foreach ( const RadioStation& station, stations ) {
-            frequency = station.frequency();
-            FrequencyPos pos = mFrequencies.value( frequency );
-            mFrequencies.insert( frequency, pos );
-        }
-    }
-}
-
-/*!
- *
- */
-void RadioFrequencyStrip::updateAllItems()
-{
-    foreach ( RadioFrequencyItem* item, mFrequencyItems ) {
-        updateItem( item );
-    }
+    emit skipRequested( StationSkip::Previous );
 }
 
 /*!
  *
  */
-QPixmap RadioFrequencyStrip::drawPixmap( uint frequency, QList<RadioStation> stations, RadioFrequencyItem* item )
+void RadioFrequencyStrip::skipToPreviousFavorite()
 {
-    QPixmap pixmap( PIXMAP_WIDTH, mItemHeight );
-    pixmap.fill( Qt::transparent );
-    QPainter painter( &pixmap );
-    QPen normalPen = painter.pen();
-    QPen favoritePen = normalPen;
-    normalPen.setColor( mForegroundColor );
-    painter.setPen( normalPen );
-
-    if ( frequency == 0 ) {
-        painter.drawLine( makeTab( mSeparatorPos - 1 + ROUNDER, mItemHeight ) );
-        painter.drawLine( makeTab( mSeparatorPos + ROUNDER, mItemHeight ) );
-        return pixmap;
-    }
-
-    const QString itemText = QString::number( frequency / ONE_HERTZ );
-    const uint startFrequency = frequency - HALF_HERTZ;
-    const uint endFrequency = startFrequency + ONE_HERTZ;
-    const uint  roundedMin = int( qreal(mMinFrequency) / ONE_HERTZ + ROUNDER );
-    const uint freq = frequency / ONE_HERTZ;
-    const int diff = freq - roundedMin;
-    const qreal startPixel = diff * ITEM_WIDTH;
-    qreal pixels = 0.0;
-    const qreal leftOverlap = PIXMAP_OVERLAP / 2;
-
-    for ( uint frequency = startFrequency; frequency <= endFrequency; frequency += mFrequencyStepSize ) {
-
-        if ( frequency < mMinFrequency || frequency > mMaxFrequency ) {
-            continue;
-        }
-
-        pixels = qreal( frequency - startFrequency ) / PIXEL_IN_HZ;
-        if ( frequency % ONE_HERTZ == 0 ) {
-
-            // Draw the high frequency tab and the frequency text for the even number
-            normalPen.setWidth( 3 );
-            painter.setPen( normalPen );
-            painter.drawLine( makeTab( pixels + leftOverlap - 1, TAB_HEIGHT_BIG ) );
-            normalPen.setWidth( 1 );
-            painter.setPen( normalPen );
+    emit skipRequested( StationSkip::PreviousFavorite );
+}
 
-            // Draw the frequency text and its 00 decimals
-            painter.setFont( DECIMAL_FONT );
-            const int decimalWidth = painter.fontMetrics().width( DECIMAL_TEXT );
-            const int decimalSpace = painter.fontMetrics().leftBearing( '.' );
-            painter.setFont( FREQUENCY_FONT );
-            const int frequencyWidth = painter.fontMetrics().width( itemText );
-            const int textPosX = int( pixels + leftOverlap - ( frequencyWidth + decimalSpace + decimalWidth ) / 2 );
-            painter.drawText( QPoint( textPosX, 20 ), itemText );
-            painter.setFont( DECIMAL_FONT );
-            painter.drawText( QPoint( textPosX + frequencyWidth + decimalSpace, 20 ), DECIMAL_TEXT );
-
-        } else if ( frequency % ONE_TAB_IN_HZ == 0 ) {
-
-            // Draw the low frequency tab for the uneven number
-            painter.drawLine( makeTab( pixels + leftOverlap, TAB_HEIGHT_SMALL ) );
-
-        }
-
-        addFrequencyPos( int( startPixel + pixels + ROUNDER ), frequency, item );
-    }
+/*!
+ *
+ */
+void RadioFrequencyStrip::skipToNext()
+{
+    emit skipRequested( StationSkip::Next );
+}
 
-    // Draw favorites and local stations
-    favoritePen.setColor( Qt::yellow );
-
-    const int markerYPos = mItemHeight - 28;
-    foreach ( const RadioStation& station, stations ) {
-        const uint frequency = station.frequency();
-        pixels = qreal( frequency - startFrequency ) / PIXEL_IN_HZ;
-
-        if ( station.isFavorite() ) {
-            favoritePen.setWidth( PEN_WIDTH_FAVORITE );
-            painter.setPen( favoritePen );
-            painter.drawEllipse( int( pixels + leftOverlap - 3 ), markerYPos - 3, 6, 6 );
-        } else if ( station.isType( RadioStation::LocalStation ) ) {
-
-            favoritePen.setWidth( 1 );
-            painter.setPen( favoritePen );
-            painter.drawEllipse( int( pixels + leftOverlap - 4 ), markerYPos - 4, 8, 8 );
-        }
-    }
-
-    return pixmap;
+/*!
+ *
+ */
+void RadioFrequencyStrip::skipToNextFavorite()
+{
+    emit skipRequested( StationSkip::NextFavorite );
 }
 
 /*!
  *
  */
-QLineF RadioFrequencyStrip::makeTab( qreal pos, int height )
+void RadioFrequencyStrip::seekDown()
 {
-    return QLineF( pos, mItemHeight - height, pos, mItemHeight );
+    emit seekRequested( Seek::Down );
 }
 
-/*!
- *
- */
-void RadioFrequencyStrip::emitFrequencyChanged( uint frequency )
-{
-    if ( frequency > 0 && frequency != mFrequency ) {
-        mFrequency = frequency;
-        //TOD: Get direction
-        emit frequencyChanged( frequency, TuneReason::FrequencyStrip, Scroll::Shortest );
-    }
-}
-
-/*!
- *
- */
-int RadioFrequencyStrip::selectorPos() const
-{
-    const int pos = int( -contentWidget()->x() + mSelectorPos + ROUNDER );
-    return pos % mMaxWidth;
-}
 
 /*!
  *
  */
-void RadioFrequencyStrip::scrollToFrequency( uint frequency, Scroll::Direction direction, int time, TuneReason::Reason reason )
+void RadioFrequencyStrip::seekUp()
 {
-    int targetFreqPos = mFrequencies.value( frequency ).mPosition;
-    const int currentFreqPos = mFrequencies.value( mFrequency ).mPosition;
-    const int currentPos = int( -contentWidget()->x() + mSelectorPos + ROUNDER );
-    const bool isInSecondHalf = currentPos >= mMaxWidth - ITEM_WIDTH + mSeparatorPos;
-
-    // Special case: When there is only one favorite and the user presses skip
-    // the strip must scroll around to the same frequency.
-    if ( mFrequency == frequency && reason == TuneReason::Skip ) {
-        if ( direction == Scroll::Left ) {
-            targetFreqPos += mMaxWidth;
-        } else {
-        targetFreqPos -= mMaxWidth;
-        }
-    }
-
-    mFrequency = frequency;
-
-    qreal newPos = targetFreqPos;
-    if ( direction == Scroll::Left ) {
-
-        if ( currentFreqPos > targetFreqPos ) {
-            newPos += mMaxWidth;
-        }
-
-    } else if ( direction == Scroll::Right ) {
-
-        if ( currentFreqPos < targetFreqPos ) {
-            newPos -= mMaxWidth;
-        }
-
-    }
-
-    if ( isInSecondHalf ) {
-        newPos += mMaxWidth;
-    }
-
-    newPos -= mSelectorPos - ROUNDER;
-
-//    scrollContentsTo( QPointF( newPos, 0 ), time );
-// TODO: Remove this and uncomment the above line. This is a temporary workaround to get the strip to move
-    scrollContentsTo( QPointF( newPos, 0 ), 0 );
+    emit seekRequested( Seek::Up );
 }
 
 /*!
- *
+ * \reimp
  */
-void RadioFrequencyStrip::hideButtons()
+bool RadioFrequencyStrip::isScanning() const
 {
-    HbEffect::start( mLeftButton, SLIDE_TO_LEFT );
-    HbEffect::start( mRightButton, SLIDE_TO_RIGHT );
+    return RadioUtil::scanStatus() == Scan::ScanningInMainView;
 }
 
 /*!
- *
+ * \reimp
  */
-void RadioFrequencyStrip::showButtons()
+uint RadioFrequencyStrip::frequencyAtIndex( int index ) const
 {
-    HbEffect::start( mLeftButton, SLIDE_FROM_LEFT );
-    HbEffect::start( mRightButton, SLIDE_FROM_RIGHT );
+    RadioStationModel& model = mUiEngine->stationModel();
+    return model.data( model.index( index, 0, QModelIndex() ),
+                       RadioRole::RadioStationRole ).value<RadioStation>().frequency();
 }