radioapp/radiowidgets/src/radiofrequencystripbase.cpp
author hgs
Mon, 23 Aug 2010 14:17:50 +0300
changeset 44 0a3ad94fc71c
parent 39 ac7857bd5fdb
child 47 74b7c6e79031
permissions -rw-r--r--
201033
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
39
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
// System includes
hgs
parents:
diff changeset
    19
#include <HbDocumentLoader>
hgs
parents:
diff changeset
    20
#include <HbEffect>
hgs
parents:
diff changeset
    21
#include <QPainter>
hgs
parents:
diff changeset
    22
#include <QStringListModel>
hgs
parents:
diff changeset
    23
#include <QGraphicsSceneResizeEvent>
hgs
parents:
diff changeset
    24
#include <QPen>
hgs
parents:
diff changeset
    25
#include <HbPushButton>
hgs
parents:
diff changeset
    26
#include <QTimer>
hgs
parents:
diff changeset
    27
#include <HbColorScheme>
hgs
parents:
diff changeset
    28
#include <HbEvent>
hgs
parents:
diff changeset
    29
#include <HbSwipeGesture>
hgs
parents:
diff changeset
    30
#include <HbDeviceProfile>
hgs
parents:
diff changeset
    31
#include <QDebug>
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
// User includes
hgs
parents:
diff changeset
    34
#include "radiofrequencystripbase.h"
hgs
parents:
diff changeset
    35
#include "radiofrequencystripdef.h"
hgs
parents:
diff changeset
    36
#include "radiofrequencyitem.h"
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
/*!
hgs
parents:
diff changeset
    39
 * Convenience function to check signal-slot connections
hgs
parents:
diff changeset
    40
 */
hgs
parents:
diff changeset
    41
//#define CHECK_SIGNAL_CONNECTIONS
hgs
parents:
diff changeset
    42
static bool connectAndCheck( const QObject* sender, const char* signal,
hgs
parents:
diff changeset
    43
                             const QObject* receiver, const char* member,
hgs
parents:
diff changeset
    44
                             Qt::ConnectionType type = Qt::AutoConnection )
hgs
parents:
diff changeset
    45
{
hgs
parents:
diff changeset
    46
    bool connected = QObject::connect( sender, signal, receiver, member, type );
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
    #ifdef CHECK_SIGNAL_CONNECTIONS
hgs
parents:
diff changeset
    49
hgs
parents:
diff changeset
    50
    if ( !connected ) {
hgs
parents:
diff changeset
    51
        qDebug() << "Failed to make a signal-slot connection!";
hgs
parents:
diff changeset
    52
        qDebug() << "sender: " << sender->metaObject()->className();
hgs
parents:
diff changeset
    53
        qDebug() << "signal: " << signal;
hgs
parents:
diff changeset
    54
        qDebug() << "receiver: " << receiver->metaObject()->className();
hgs
parents:
diff changeset
    55
        qDebug() << "slot/signal: " << signal;
hgs
parents:
diff changeset
    56
hgs
parents:
diff changeset
    57
        Q_ASSERT( false );
hgs
parents:
diff changeset
    58
hgs
parents:
diff changeset
    59
        // ----------------------------------------------------------------
hgs
parents:
diff changeset
    60
        // SIGNAL-SLOT CONNECT FAILED!
hgs
parents:
diff changeset
    61
        // ----------------------------------------------------------------
hgs
parents:
diff changeset
    62
    }
hgs
parents:
diff changeset
    63
hgs
parents:
diff changeset
    64
    #endif // CHECK_SIGNAL_CONNECTIONS
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
    return connected;
hgs
parents:
diff changeset
    67
}
hgs
parents:
diff changeset
    68
hgs
parents:
diff changeset
    69
/*!
hgs
parents:
diff changeset
    70
 *
hgs
parents:
diff changeset
    71
 */
hgs
parents:
diff changeset
    72
RadioFrequencyStripBase::RadioFrequencyStripBase( QGraphicsItem* parent ) :
hgs
parents:
diff changeset
    73
    RadioStripBase( parent ),
hgs
parents:
diff changeset
    74
    mItemHeight( 8 ),
hgs
parents:
diff changeset
    75
    mMinFrequency( 87500000 ),
hgs
parents:
diff changeset
    76
    mMaxFrequency( 108000000 ),
hgs
parents:
diff changeset
    77
    mFrequencyStepSize( 100000 ),
hgs
parents:
diff changeset
    78
    mFrequency( 87500000 ),
hgs
parents:
diff changeset
    79
    mSelectorImage( new QGraphicsPixmapItem( this ) ),
hgs
parents:
diff changeset
    80
    mSeparatorPos( 0.0 ),
hgs
parents:
diff changeset
    81
    mMaxWidth( 0 ),
hgs
parents:
diff changeset
    82
    mSelectorPos( 0.0 ),
hgs
parents:
diff changeset
    83
    mLeftButton( 0 ),
hgs
parents:
diff changeset
    84
    mRightButton( 0 ),
hgs
parents:
diff changeset
    85
    mManualSeekTimer( NULL ),
hgs
parents:
diff changeset
    86
    mManualSeekMode( false ),
hgs
parents:
diff changeset
    87
    mLastReportedFrequency( 0 ),
hgs
parents:
diff changeset
    88
    mManualSeekTimerId( 0 ),
hgs
parents:
diff changeset
    89
    mForegroundColor( Qt::white )//HbColorScheme::color( FrequencyStrip::TEXT_COLOR_ATTRIBUTE ) )
hgs
parents:
diff changeset
    90
{
hgs
parents:
diff changeset
    91
    setScrollingStyle( HbScrollArea::PanWithFollowOn );
hgs
parents:
diff changeset
    92
    setItemSize( QSizeF( FrequencyStrip::ITEM_WIDTH + FrequencyStrip::PIXMAP_OVERLAP / 2, mItemHeight ) );
hgs
parents:
diff changeset
    93
    setOverlap( FrequencyStrip::PIXMAP_OVERLAP / 2 );
hgs
parents:
diff changeset
    94
}
hgs
parents:
diff changeset
    95
hgs
parents:
diff changeset
    96
/*!
hgs
parents:
diff changeset
    97
 * Property
hgs
parents:
diff changeset
    98
 */
hgs
parents:
diff changeset
    99
void RadioFrequencyStripBase::setItemHeight( int itemHeight )
hgs
parents:
diff changeset
   100
{
hgs
parents:
diff changeset
   101
    mItemHeight = itemHeight;
hgs
parents:
diff changeset
   102
}
hgs
parents:
diff changeset
   103
hgs
parents:
diff changeset
   104
/*!
hgs
parents:
diff changeset
   105
 * Property
hgs
parents:
diff changeset
   106
 */
hgs
parents:
diff changeset
   107
int RadioFrequencyStripBase::itemHeight() const
hgs
parents:
diff changeset
   108
{
hgs
parents:
diff changeset
   109
    return mItemHeight;
hgs
parents:
diff changeset
   110
}
hgs
parents:
diff changeset
   111
hgs
parents:
diff changeset
   112
/*!
hgs
parents:
diff changeset
   113
 *
hgs
parents:
diff changeset
   114
 */
hgs
parents:
diff changeset
   115
void RadioFrequencyStripBase::initbase( uint minFrequency, uint maxFrequency, uint stepSize, uint frequency )
hgs
parents:
diff changeset
   116
{
hgs
parents:
diff changeset
   117
    mMinFrequency       = minFrequency;
hgs
parents:
diff changeset
   118
    mMaxFrequency       = maxFrequency;
hgs
parents:
diff changeset
   119
    mFrequencyStepSize  = stepSize;
hgs
parents:
diff changeset
   120
    mFrequency          = frequency;
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
    initModel();
hgs
parents:
diff changeset
   123
    initEmptyItems();
hgs
parents:
diff changeset
   124
    initPositions();
hgs
parents:
diff changeset
   125
hgs
parents:
diff changeset
   126
    HbDeviceProfile deviceProfile;
hgs
parents:
diff changeset
   127
    mItemHeight = static_cast<int>( mItemHeight * deviceProfile.unitValue() );
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
    mManualSeekTimer = new QTimer( this );
hgs
parents:
diff changeset
   130
    mManualSeekTimer->setInterval( FrequencyStrip::MANUALSEEK_START_TIMEOUT );
hgs
parents:
diff changeset
   131
    mManualSeekTimer->setSingleShot( true );
hgs
parents:
diff changeset
   132
    connectAndCheck( mManualSeekTimer,   SIGNAL(timeout()),
hgs
parents:
diff changeset
   133
                     this,               SLOT(toggleManualSeek()) );
hgs
parents:
diff changeset
   134
hgs
parents:
diff changeset
   135
    connectAndCheck( this,           SIGNAL(scrollingEnded()),
hgs
parents:
diff changeset
   136
                     this,           SLOT(handleScrollingEnd()) );
hgs
parents:
diff changeset
   137
hgs
parents:
diff changeset
   138
    grabGesture( Qt::SwipeGesture );
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
    //TODO: Remove. Stepsize temporarily hardcoded to 100 Khz in europe region
hgs
parents:
diff changeset
   141
    if ( mFrequencyStepSize < FrequencyStrip::ONE_HUNDRED_KHZ ) {
hgs
parents:
diff changeset
   142
        mFrequencyStepSize = FrequencyStrip::ONE_HUNDRED_KHZ;
hgs
parents:
diff changeset
   143
    }
hgs
parents:
diff changeset
   144
hgs
parents:
diff changeset
   145
    updateAllItems();
hgs
parents:
diff changeset
   146
hgs
parents:
diff changeset
   147
    showButtons();
hgs
parents:
diff changeset
   148
}
hgs
parents:
diff changeset
   149
hgs
parents:
diff changeset
   150
/*!
hgs
parents:
diff changeset
   151
 *
hgs
parents:
diff changeset
   152
 */
hgs
parents:
diff changeset
   153
void RadioFrequencyStripBase::createButtonsFromDocml( HbDocumentLoader& uiLoader, const QString& leftButtonName, const QString& rightButtonName )
hgs
parents:
diff changeset
   154
{
hgs
parents:
diff changeset
   155
    Q_ASSERT( !mLeftButton && !mRightButton );
hgs
parents:
diff changeset
   156
    mLeftButton = qobject_cast<HbPushButton*>( uiLoader.findWidget( leftButtonName ) );
hgs
parents:
diff changeset
   157
    mRightButton = qobject_cast<HbPushButton*>( uiLoader.findWidget( rightButtonName ) );
hgs
parents:
diff changeset
   158
hgs
parents:
diff changeset
   159
    initButtons();
hgs
parents:
diff changeset
   160
}
hgs
parents:
diff changeset
   161
hgs
parents:
diff changeset
   162
/*!
hgs
parents:
diff changeset
   163
 *
hgs
parents:
diff changeset
   164
 */
hgs
parents:
diff changeset
   165
void RadioFrequencyStripBase::createButtons()
hgs
parents:
diff changeset
   166
{
hgs
parents:
diff changeset
   167
    Q_ASSERT( !mLeftButton && !mRightButton );
hgs
parents:
diff changeset
   168
    mLeftButton = new HbPushButton( this );
hgs
parents:
diff changeset
   169
    mRightButton = new HbPushButton( this );
hgs
parents:
diff changeset
   170
hgs
parents:
diff changeset
   171
    mLeftButton->setIcon( HbIcon( "qtg_mono_previous" ) );
hgs
parents:
diff changeset
   172
    mRightButton->setIcon( HbIcon( "qtg_mono_next" ) );
hgs
parents:
diff changeset
   173
hgs
parents:
diff changeset
   174
    initButtons();
hgs
parents:
diff changeset
   175
}
hgs
parents:
diff changeset
   176
hgs
parents:
diff changeset
   177
/*!
hgs
parents:
diff changeset
   178
 *
hgs
parents:
diff changeset
   179
 */
hgs
parents:
diff changeset
   180
void RadioFrequencyStripBase::setFrequency( const uint frequency, int reason, Scroll::Direction direction )
hgs
parents:
diff changeset
   181
{
hgs
parents:
diff changeset
   182
    if ( mFrequencies.contains( frequency ) ) {
hgs
parents:
diff changeset
   183
        scrollToFrequency( frequency, direction, mAutoScrollTime );
hgs
parents:
diff changeset
   184
    }
hgs
parents:
diff changeset
   185
}
hgs
parents:
diff changeset
   186
hgs
parents:
diff changeset
   187
/*!
hgs
parents:
diff changeset
   188
 *
hgs
parents:
diff changeset
   189
 */
hgs
parents:
diff changeset
   190
uint RadioFrequencyStripBase::frequency() const
hgs
parents:
diff changeset
   191
{
hgs
parents:
diff changeset
   192
    return mFrequency;
hgs
parents:
diff changeset
   193
}
hgs
parents:
diff changeset
   194
hgs
parents:
diff changeset
   195
/*!
hgs
parents:
diff changeset
   196
 *
hgs
parents:
diff changeset
   197
 */
hgs
parents:
diff changeset
   198
bool RadioFrequencyStripBase::isInManualSeekMode() const
hgs
parents:
diff changeset
   199
{
hgs
parents:
diff changeset
   200
    return mManualSeekMode;
hgs
parents:
diff changeset
   201
}
hgs
parents:
diff changeset
   202
hgs
parents:
diff changeset
   203
/*!
hgs
parents:
diff changeset
   204
 *
hgs
parents:
diff changeset
   205
 */
hgs
parents:
diff changeset
   206
void RadioFrequencyStripBase::cancelManualSeek()
hgs
parents:
diff changeset
   207
{
hgs
parents:
diff changeset
   208
    mManualSeekTimer->stop();
hgs
parents:
diff changeset
   209
    if ( mManualSeekMode ) {
hgs
parents:
diff changeset
   210
        toggleManualSeek();
hgs
parents:
diff changeset
   211
    }
hgs
parents:
diff changeset
   212
}
hgs
parents:
diff changeset
   213
hgs
parents:
diff changeset
   214
/*!
hgs
parents:
diff changeset
   215
 *
hgs
parents:
diff changeset
   216
 */
hgs
parents:
diff changeset
   217
void RadioFrequencyStripBase::addScannedStation( uint frequency )
hgs
parents:
diff changeset
   218
{
hgs
parents:
diff changeset
   219
    FrequencyPos pos = mFrequencies.value( frequency );
hgs
parents:
diff changeset
   220
    updateItem( pos.mItem, frequency );
hgs
parents:
diff changeset
   221
}
hgs
parents:
diff changeset
   222
hgs
parents:
diff changeset
   223
/*!
hgs
parents:
diff changeset
   224
 *
hgs
parents:
diff changeset
   225
 */
hgs
parents:
diff changeset
   226
void RadioFrequencyStripBase::updateFavorite( uint frequency )
hgs
parents:
diff changeset
   227
{
hgs
parents:
diff changeset
   228
    FrequencyPos pos = mFrequencies.value( frequency );
hgs
parents:
diff changeset
   229
    updateItem( pos.mItem );
hgs
parents:
diff changeset
   230
}
hgs
parents:
diff changeset
   231
hgs
parents:
diff changeset
   232
/*!
hgs
parents:
diff changeset
   233
 * Public slot
hgs
parents:
diff changeset
   234
 *
hgs
parents:
diff changeset
   235
 */
hgs
parents:
diff changeset
   236
void RadioFrequencyStripBase::setScanningMode( bool isScanning )
hgs
parents:
diff changeset
   237
{
hgs
parents:
diff changeset
   238
    mManualSeekTimer->stop();
hgs
parents:
diff changeset
   239
    if ( isScanning ) {
hgs
parents:
diff changeset
   240
        initEmptyItems();
hgs
parents:
diff changeset
   241
        hideButtons();
hgs
parents:
diff changeset
   242
        scrollToFrequency( mMinFrequency, Scroll::Shortest, mAutoScrollTime );
hgs
parents:
diff changeset
   243
    } else {
hgs
parents:
diff changeset
   244
        showButtons();
hgs
parents:
diff changeset
   245
    }
hgs
parents:
diff changeset
   246
    setEnabled( !isScanning );
hgs
parents:
diff changeset
   247
}
hgs
parents:
diff changeset
   248
hgs
parents:
diff changeset
   249
/*!
hgs
parents:
diff changeset
   250
 * Private slot
hgs
parents:
diff changeset
   251
 *
hgs
parents:
diff changeset
   252
 */
hgs
parents:
diff changeset
   253
void RadioFrequencyStripBase::initEmptyItems()
hgs
parents:
diff changeset
   254
{
hgs
parents:
diff changeset
   255
    //TODO: Remove the weird hack of checking the sender
hgs
parents:
diff changeset
   256
    if ( !sender() || !isScanning() ) {
hgs
parents:
diff changeset
   257
        QList<FrequencyStrip::StationMarker> emptyList;
hgs
parents:
diff changeset
   258
        foreach ( RadioFrequencyItem* item, mFrequencyItems ) {
hgs
parents:
diff changeset
   259
            QPixmap pixmap = drawPixmap( item->frequency(), emptyList, item );
hgs
parents:
diff changeset
   260
            item->setPixmap( pixmap );
hgs
parents:
diff changeset
   261
        }
hgs
parents:
diff changeset
   262
    }
hgs
parents:
diff changeset
   263
}
hgs
parents:
diff changeset
   264
hgs
parents:
diff changeset
   265
/*!
hgs
parents:
diff changeset
   266
 * Private slot
hgs
parents:
diff changeset
   267
 *
hgs
parents:
diff changeset
   268
 */
hgs
parents:
diff changeset
   269
void RadioFrequencyStripBase::removeStation( const QModelIndex& parent, int first, int last )
hgs
parents:
diff changeset
   270
{
hgs
parents:
diff changeset
   271
    Q_UNUSED( parent );
hgs
parents:
diff changeset
   272
    updateStationsInRange( first, last, true );
hgs
parents:
diff changeset
   273
}
hgs
parents:
diff changeset
   274
hgs
parents:
diff changeset
   275
/*!
hgs
parents:
diff changeset
   276
 * Private slot
hgs
parents:
diff changeset
   277
 *
hgs
parents:
diff changeset
   278
 */
hgs
parents:
diff changeset
   279
void RadioFrequencyStripBase::updateStation( const QModelIndex& parent, int first, int last )
hgs
parents:
diff changeset
   280
{
hgs
parents:
diff changeset
   281
    Q_UNUSED( parent );
hgs
parents:
diff changeset
   282
    updateStationsInRange( first, last );
hgs
parents:
diff changeset
   283
}
hgs
parents:
diff changeset
   284
hgs
parents:
diff changeset
   285
/*!
hgs
parents:
diff changeset
   286
 * Private slot
hgs
parents:
diff changeset
   287
 */
hgs
parents:
diff changeset
   288
void RadioFrequencyStripBase::handleLeftButton()
hgs
parents:
diff changeset
   289
{
44
hgs
parents: 39
diff changeset
   290
    skipToPrevious();
39
hgs
parents:
diff changeset
   291
}
hgs
parents:
diff changeset
   292
hgs
parents:
diff changeset
   293
/*!
hgs
parents:
diff changeset
   294
 * Private slot
hgs
parents:
diff changeset
   295
 */
hgs
parents:
diff changeset
   296
void RadioFrequencyStripBase::handleRightButton()
hgs
parents:
diff changeset
   297
{
44
hgs
parents: 39
diff changeset
   298
    skipToNext();
39
hgs
parents:
diff changeset
   299
}
hgs
parents:
diff changeset
   300
hgs
parents:
diff changeset
   301
/*!
hgs
parents:
diff changeset
   302
 * Private slot
hgs
parents:
diff changeset
   303
 */
hgs
parents:
diff changeset
   304
void RadioFrequencyStripBase::handleLongLeftButton()
hgs
parents:
diff changeset
   305
{
hgs
parents:
diff changeset
   306
    seekDown();
hgs
parents:
diff changeset
   307
}
hgs
parents:
diff changeset
   308
hgs
parents:
diff changeset
   309
/*!
hgs
parents:
diff changeset
   310
 * Private slot
hgs
parents:
diff changeset
   311
 */
hgs
parents:
diff changeset
   312
void RadioFrequencyStripBase::handleLongRightButton()
hgs
parents:
diff changeset
   313
{
hgs
parents:
diff changeset
   314
    seekUp();
hgs
parents:
diff changeset
   315
}
hgs
parents:
diff changeset
   316
hgs
parents:
diff changeset
   317
/*!
hgs
parents:
diff changeset
   318
 * Private slot
hgs
parents:
diff changeset
   319
 *
hgs
parents:
diff changeset
   320
 */
hgs
parents:
diff changeset
   321
void RadioFrequencyStripBase::toggleManualSeek()
hgs
parents:
diff changeset
   322
{
hgs
parents:
diff changeset
   323
    mManualSeekMode = !mManualSeekMode;
hgs
parents:
diff changeset
   324
    emit manualSeekChanged( mManualSeekMode );
hgs
parents:
diff changeset
   325
hgs
parents:
diff changeset
   326
    if ( mManualSeekMode ) {
hgs
parents:
diff changeset
   327
        grabMouse();
hgs
parents:
diff changeset
   328
        hideButtons();
hgs
parents:
diff changeset
   329
        mManualSeekTimerId = startTimer( FrequencyStrip::MANUALSEEK_SIGNAL_DELAY );
hgs
parents:
diff changeset
   330
    } else {
hgs
parents:
diff changeset
   331
        ungrabMouse();
hgs
parents:
diff changeset
   332
        showButtons();
hgs
parents:
diff changeset
   333
        killTimer( mManualSeekTimerId );
hgs
parents:
diff changeset
   334
        mManualSeekTimerId = 0;
hgs
parents:
diff changeset
   335
    }
hgs
parents:
diff changeset
   336
}
hgs
parents:
diff changeset
   337
hgs
parents:
diff changeset
   338
/*!
hgs
parents:
diff changeset
   339
 * Private slot
hgs
parents:
diff changeset
   340
 */
hgs
parents:
diff changeset
   341
void RadioFrequencyStripBase::handleScrollingEnd()
hgs
parents:
diff changeset
   342
{
hgs
parents:
diff changeset
   343
    // Check if the selector is in the invalid area where the strip loops around
hgs
parents:
diff changeset
   344
    const int selectorPosition = selectorPos();
hgs
parents:
diff changeset
   345
    if ( mManualSeekMode ) {
hgs
parents:
diff changeset
   346
        if ( !mPositions.contains( selectorPosition ) ) {
hgs
parents:
diff changeset
   347
            if ( selectorPosition < mMaxWidth - FrequencyStrip::ITEM_WIDTH + mSeparatorPos ) {
hgs
parents:
diff changeset
   348
                scrollToFrequency( mMaxFrequency, Scroll::Shortest, 500 );
hgs
parents:
diff changeset
   349
                emitFrequencyChanged( mMaxFrequency, FrequencyStrip::ManualSeekUpdate, Scroll::Shortest );
hgs
parents:
diff changeset
   350
            } else {
hgs
parents:
diff changeset
   351
                scrollToFrequency( mMinFrequency, Scroll::Shortest, 500 );
hgs
parents:
diff changeset
   352
                emitFrequencyChanged( mMinFrequency, FrequencyStrip::ManualSeekUpdate, Scroll::Shortest );
hgs
parents:
diff changeset
   353
            }
hgs
parents:
diff changeset
   354
        }
hgs
parents:
diff changeset
   355
hgs
parents:
diff changeset
   356
        mManualSeekTimer->start( FrequencyStrip::MANUALSEEK_END_TIMEOUT );
hgs
parents:
diff changeset
   357
    }
hgs
parents:
diff changeset
   358
}
hgs
parents:
diff changeset
   359
hgs
parents:
diff changeset
   360
/*!
hgs
parents:
diff changeset
   361
 * \reimp
hgs
parents:
diff changeset
   362
 */
hgs
parents:
diff changeset
   363
void RadioFrequencyStripBase::updateItemPrimitive( QGraphicsItem* itemToUpdate, int itemIndex )
hgs
parents:
diff changeset
   364
{
hgs
parents:
diff changeset
   365
    QGraphicsPixmapItem* item = static_cast<QGraphicsPixmapItem*>( itemToUpdate );
hgs
parents:
diff changeset
   366
    if ( itemIndex < mFrequencyItems.count() ) {
hgs
parents:
diff changeset
   367
        item->setPixmap( mFrequencyItems.at( itemIndex )->updatePrimitive( item ) );
hgs
parents:
diff changeset
   368
    }
hgs
parents:
diff changeset
   369
}
hgs
parents:
diff changeset
   370
hgs
parents:
diff changeset
   371
/*!
hgs
parents:
diff changeset
   372
 * \reimp
hgs
parents:
diff changeset
   373
 */
hgs
parents:
diff changeset
   374
QGraphicsItem* RadioFrequencyStripBase::createItemPrimitive( QGraphicsItem* parent )
hgs
parents:
diff changeset
   375
{
hgs
parents:
diff changeset
   376
    return new QGraphicsPixmapItem( parent );
hgs
parents:
diff changeset
   377
}
hgs
parents:
diff changeset
   378
hgs
parents:
diff changeset
   379
/*!
hgs
parents:
diff changeset
   380
 * \reimp
hgs
parents:
diff changeset
   381
 */
hgs
parents:
diff changeset
   382
void RadioFrequencyStripBase::scrollPosChanged()
hgs
parents:
diff changeset
   383
{
hgs
parents:
diff changeset
   384
    if ( mManualSeekMode ) {
hgs
parents:
diff changeset
   385
        const int pos = selectorPos();
hgs
parents:
diff changeset
   386
        const uint frequency = mPositions.value( pos );
hgs
parents:
diff changeset
   387
        if ( frequency > 0 ) {
hgs
parents:
diff changeset
   388
            mFrequency = mPositions.value( pos );
hgs
parents:
diff changeset
   389
            emitFrequencyChanged( mFrequency, FrequencyStrip::ManualSeekUpdate, Scroll::Shortest );
hgs
parents:
diff changeset
   390
        }
hgs
parents:
diff changeset
   391
    }
hgs
parents:
diff changeset
   392
}
hgs
parents:
diff changeset
   393
hgs
parents:
diff changeset
   394
/*!
hgs
parents:
diff changeset
   395
 * \reimp
hgs
parents:
diff changeset
   396
 */
hgs
parents:
diff changeset
   397
void RadioFrequencyStripBase::resizeEvent ( QGraphicsSceneResizeEvent* event )
hgs
parents:
diff changeset
   398
{
hgs
parents:
diff changeset
   399
    RadioStripBase::resizeEvent( event );
hgs
parents:
diff changeset
   400
hgs
parents:
diff changeset
   401
    initSelector();
hgs
parents:
diff changeset
   402
hgs
parents:
diff changeset
   403
    const qreal height = event->newSize().height();
hgs
parents:
diff changeset
   404
    const qreal width = event->newSize().width();
hgs
parents:
diff changeset
   405
hgs
parents:
diff changeset
   406
    mSelectorPos = width / 2;
hgs
parents:
diff changeset
   407
    mSelectorImage->setOffset( mSelectorPos - ( FrequencyStrip::INDICATOR_WIDTH / 2 ), 0.0 );
hgs
parents:
diff changeset
   408
hgs
parents:
diff changeset
   409
    if ( mLeftButton && mRightButton ) {
hgs
parents:
diff changeset
   410
        mLeftButton->resize( height, height );
hgs
parents:
diff changeset
   411
        mRightButton->resize( height, height );
hgs
parents:
diff changeset
   412
        mRightButton->setPos( QPointF( width - height, 0 ) );
hgs
parents:
diff changeset
   413
    }
hgs
parents:
diff changeset
   414
hgs
parents:
diff changeset
   415
    scrollToFrequency( mFrequency );
hgs
parents:
diff changeset
   416
}
hgs
parents:
diff changeset
   417
hgs
parents:
diff changeset
   418
/*!
hgs
parents:
diff changeset
   419
 * \reimp
hgs
parents:
diff changeset
   420
 */
hgs
parents:
diff changeset
   421
void RadioFrequencyStripBase::changeEvent( QEvent* event )
hgs
parents:
diff changeset
   422
{
hgs
parents:
diff changeset
   423
    if ( event->type() == HbEvent::ThemeChanged ) {
hgs
parents:
diff changeset
   424
        // Update the foreground color and redraw each item
hgs
parents:
diff changeset
   425
        mForegroundColor = Qt::white;// HbColorScheme::color( FrequencyStrip::TEXT_COLOR_ATTRIBUTE );
hgs
parents:
diff changeset
   426
        updateAllItems();
hgs
parents:
diff changeset
   427
    }
hgs
parents:
diff changeset
   428
hgs
parents:
diff changeset
   429
    return RadioStripBase::changeEvent(event);
hgs
parents:
diff changeset
   430
}
hgs
parents:
diff changeset
   431
hgs
parents:
diff changeset
   432
/*!
hgs
parents:
diff changeset
   433
 * \reimp
hgs
parents:
diff changeset
   434
 */
hgs
parents:
diff changeset
   435
void RadioFrequencyStripBase::mousePressEvent( QGraphicsSceneMouseEvent* event )
hgs
parents:
diff changeset
   436
{
hgs
parents:
diff changeset
   437
    RadioStripBase::mousePressEvent( event );
hgs
parents:
diff changeset
   438
hgs
parents:
diff changeset
   439
    mManualSeekTimer->stop();
hgs
parents:
diff changeset
   440
    if ( mManualSeekMode ) {
hgs
parents:
diff changeset
   441
        const bool insideStrip = rect().contains( event->pos() );
hgs
parents:
diff changeset
   442
        if ( !insideStrip ) {
hgs
parents:
diff changeset
   443
            toggleManualSeek();
hgs
parents:
diff changeset
   444
        }
hgs
parents:
diff changeset
   445
    } else {
hgs
parents:
diff changeset
   446
        mManualSeekTimer->start( FrequencyStrip::MANUALSEEK_START_TIMEOUT );
hgs
parents:
diff changeset
   447
    }
hgs
parents:
diff changeset
   448
}
hgs
parents:
diff changeset
   449
hgs
parents:
diff changeset
   450
/*!
hgs
parents:
diff changeset
   451
 * \reimp
hgs
parents:
diff changeset
   452
 */
hgs
parents:
diff changeset
   453
void RadioFrequencyStripBase::mouseReleaseEvent( QGraphicsSceneMouseEvent* event )
hgs
parents:
diff changeset
   454
{
hgs
parents:
diff changeset
   455
    RadioStripBase::mouseReleaseEvent( event );
hgs
parents:
diff changeset
   456
hgs
parents:
diff changeset
   457
    mManualSeekTimer->stop();
44
hgs
parents: 39
diff changeset
   458
    if ( mManualSeekMode ) {
39
hgs
parents:
diff changeset
   459
        mManualSeekTimer->start( FrequencyStrip::MANUALSEEK_END_TIMEOUT );
hgs
parents:
diff changeset
   460
    }
hgs
parents:
diff changeset
   461
}
hgs
parents:
diff changeset
   462
hgs
parents:
diff changeset
   463
/*!
hgs
parents:
diff changeset
   464
 * \reimp
hgs
parents:
diff changeset
   465
 */
hgs
parents:
diff changeset
   466
void RadioFrequencyStripBase::gestureEvent( QGestureEvent* event )
hgs
parents:
diff changeset
   467
{
hgs
parents:
diff changeset
   468
    HbSwipeGesture* swipeGesture = static_cast<HbSwipeGesture*>( event->gesture( Qt::SwipeGesture ) );
hgs
parents:
diff changeset
   469
    if ( swipeGesture && !mManualSeekMode ) {
hgs
parents:
diff changeset
   470
        if ( swipeGesture->state() == Qt::GestureFinished ) {
hgs
parents:
diff changeset
   471
            if ( swipeGesture->horizontalDirection() == QSwipeGesture::Left ) {
hgs
parents:
diff changeset
   472
                skipToNext();
hgs
parents:
diff changeset
   473
            } else if ( swipeGesture->horizontalDirection() == QSwipeGesture::Right ) {
hgs
parents:
diff changeset
   474
                skipToPrevious();
hgs
parents:
diff changeset
   475
            }
hgs
parents:
diff changeset
   476
        }
hgs
parents:
diff changeset
   477
    } else if ( mManualSeekMode ) {
hgs
parents:
diff changeset
   478
        RadioStripBase::gestureEvent( event );
hgs
parents:
diff changeset
   479
    }
hgs
parents:
diff changeset
   480
}
hgs
parents:
diff changeset
   481
hgs
parents:
diff changeset
   482
/*!
hgs
parents:
diff changeset
   483
 * \reimp
hgs
parents:
diff changeset
   484
 */
hgs
parents:
diff changeset
   485
void RadioFrequencyStripBase::timerEvent( QTimerEvent* event )
hgs
parents:
diff changeset
   486
{
hgs
parents:
diff changeset
   487
    Q_UNUSED( event );
hgs
parents:
diff changeset
   488
    if ( mLastReportedFrequency != mFrequency ) {
hgs
parents:
diff changeset
   489
        mLastReportedFrequency = mFrequency;
hgs
parents:
diff changeset
   490
        emitFrequencyChanged( mFrequency, FrequencyStrip::ManualSeekTune, Scroll::Shortest );
hgs
parents:
diff changeset
   491
    }
hgs
parents:
diff changeset
   492
}
hgs
parents:
diff changeset
   493
hgs
parents:
diff changeset
   494
/*!
hgs
parents:
diff changeset
   495
 *
hgs
parents:
diff changeset
   496
 */
hgs
parents:
diff changeset
   497
void RadioFrequencyStripBase::initModel()
hgs
parents:
diff changeset
   498
{
hgs
parents:
diff changeset
   499
    const uint minFreq = uint( qreal(mMinFrequency) / FrequencyStrip::ONE_HERTZ + FrequencyStrip::ROUNDER );
hgs
parents:
diff changeset
   500
    const uint maxFreq = uint( qreal(mMaxFrequency) / FrequencyStrip::ONE_HERTZ + 0.9 ); // always round up
hgs
parents:
diff changeset
   501
hgs
parents:
diff changeset
   502
    QStringList list;
hgs
parents:
diff changeset
   503
    QString freqText;
hgs
parents:
diff changeset
   504
    for ( uint i = minFreq; i <= maxFreq; ++i ) {
hgs
parents:
diff changeset
   505
        freqText = QString::number( i );
hgs
parents:
diff changeset
   506
        list.append( freqText );
hgs
parents:
diff changeset
   507
        mFrequencyItems.append( new RadioFrequencyItem( freqText ) );
hgs
parents:
diff changeset
   508
    }
hgs
parents:
diff changeset
   509
    mFrequencyItems.append( new RadioFrequencyItem( "" ) );
hgs
parents:
diff changeset
   510
    list.append( "" );
hgs
parents:
diff changeset
   511
hgs
parents:
diff changeset
   512
    mMaxWidth = list.count() * FrequencyStrip::ITEM_WIDTH;
hgs
parents:
diff changeset
   513
hgs
parents:
diff changeset
   514
    mSeparatorPos = qreal(FrequencyStrip::ITEM_WIDTH) / 2;
hgs
parents:
diff changeset
   515
    const uint minDrawableFreq = minFreq * FrequencyStrip::ONE_HERTZ - FrequencyStrip::HALF_HERTZ;;
hgs
parents:
diff changeset
   516
    const uint maxDrawableFreq = maxFreq * FrequencyStrip::ONE_HERTZ + FrequencyStrip::HALF_HERTZ;
hgs
parents:
diff changeset
   517
    mSeparatorPos += qreal( ( mMinFrequency  - minDrawableFreq ) / 2 ) / FrequencyStrip::PIXEL_IN_HZ;
hgs
parents:
diff changeset
   518
    mSeparatorPos -= qreal( ( maxDrawableFreq - mMaxFrequency ) / 2 ) / FrequencyStrip::PIXEL_IN_HZ;
hgs
parents:
diff changeset
   519
hgs
parents:
diff changeset
   520
    setModel( new QStringListModel( list, this ) );
hgs
parents:
diff changeset
   521
}
hgs
parents:
diff changeset
   522
hgs
parents:
diff changeset
   523
/*!
hgs
parents:
diff changeset
   524
 *
hgs
parents:
diff changeset
   525
 */
hgs
parents:
diff changeset
   526
void RadioFrequencyStripBase::initSelector()
hgs
parents:
diff changeset
   527
{
hgs
parents:
diff changeset
   528
    QPixmap selectorPixmap = QPixmap( QSize( FrequencyStrip::SELECTOR_WIDTH, (int)size().height() ) );
hgs
parents:
diff changeset
   529
    selectorPixmap.fill( Qt::red );
hgs
parents:
diff changeset
   530
    mSelectorImage->setPixmap( selectorPixmap );
hgs
parents:
diff changeset
   531
    mSelectorImage->setZValue( FrequencyStrip::SELECTOR_Z_POS );
hgs
parents:
diff changeset
   532
}
hgs
parents:
diff changeset
   533
hgs
parents:
diff changeset
   534
/*!
hgs
parents:
diff changeset
   535
 *
hgs
parents:
diff changeset
   536
 */
hgs
parents:
diff changeset
   537
void RadioFrequencyStripBase::initPositions()
hgs
parents:
diff changeset
   538
{
hgs
parents:
diff changeset
   539
    int prevPos = 0;
hgs
parents:
diff changeset
   540
    int nextPos = 0;
hgs
parents:
diff changeset
   541
    const int lastPos = mFrequencies.value( mMaxFrequency ).mPosition;
hgs
parents:
diff changeset
   542
    for ( int i = mFrequencies.value( mMinFrequency ).mPosition; i < lastPos; ++i ) {
hgs
parents:
diff changeset
   543
        if ( mPositions.contains( i ) ) {
hgs
parents:
diff changeset
   544
            prevPos = i;
hgs
parents:
diff changeset
   545
            const uint freq = mPositions.value( prevPos ) + mFrequencyStepSize;
hgs
parents:
diff changeset
   546
            if ( mFrequencies.contains( freq ) ) {
hgs
parents:
diff changeset
   547
                nextPos = mFrequencies.value( freq ).mPosition;
hgs
parents:
diff changeset
   548
            } else {
hgs
parents:
diff changeset
   549
                nextPos = prevPos;
hgs
parents:
diff changeset
   550
            }
hgs
parents:
diff changeset
   551
        } else {
hgs
parents:
diff changeset
   552
            const int nearestHit = ( i - prevPos ) < ( nextPos - i ) ? prevPos : nextPos;
hgs
parents:
diff changeset
   553
            mPositions.insert( i, mPositions.value( nearestHit ) );
hgs
parents:
diff changeset
   554
        }
hgs
parents:
diff changeset
   555
    }
hgs
parents:
diff changeset
   556
}
hgs
parents:
diff changeset
   557
hgs
parents:
diff changeset
   558
/*!
hgs
parents:
diff changeset
   559
 *
hgs
parents:
diff changeset
   560
 */
hgs
parents:
diff changeset
   561
void RadioFrequencyStripBase::initButtons()
hgs
parents:
diff changeset
   562
{
hgs
parents:
diff changeset
   563
    Q_ASSERT( mLeftButton && mRightButton );
hgs
parents:
diff changeset
   564
    connectAndCheck( mLeftButton,    SIGNAL(clicked()),
hgs
parents:
diff changeset
   565
                     this,           SLOT(handleLeftButton()) );
hgs
parents:
diff changeset
   566
    connectAndCheck( mRightButton,   SIGNAL(clicked()),
hgs
parents:
diff changeset
   567
                     this,           SLOT(handleRightButton()) );
hgs
parents:
diff changeset
   568
    connectAndCheck( mLeftButton,    SIGNAL(longPress(QPointF)),
hgs
parents:
diff changeset
   569
                     this,           SLOT(handleLongLeftButton()) );
hgs
parents:
diff changeset
   570
    connectAndCheck( mRightButton,   SIGNAL(longPress(QPointF)),
hgs
parents:
diff changeset
   571
                     this,           SLOT(handleLongRightButton()) );
hgs
parents:
diff changeset
   572
hgs
parents:
diff changeset
   573
    mLeftButton->setZValue( FrequencyStrip::SELECTOR_Z_POS );
hgs
parents:
diff changeset
   574
    mLeftButton->setObjectName( FrequencyStrip::LEFT_BUTTON );
hgs
parents:
diff changeset
   575
    mRightButton->setZValue( FrequencyStrip::SELECTOR_Z_POS );
hgs
parents:
diff changeset
   576
    mRightButton->setObjectName( FrequencyStrip::RIGHT_BUTTON );
hgs
parents:
diff changeset
   577
hgs
parents:
diff changeset
   578
    const qreal height = size().height();
hgs
parents:
diff changeset
   579
    const qreal width = size().width();
hgs
parents:
diff changeset
   580
    mLeftButton->resize( height, height );
hgs
parents:
diff changeset
   581
    mRightButton->resize( height, height );
hgs
parents:
diff changeset
   582
    mRightButton->setPos( QPointF( width - height, 0 ) );
hgs
parents:
diff changeset
   583
hgs
parents:
diff changeset
   584
    // Add left button effects
hgs
parents:
diff changeset
   585
    QStringList pathList;
hgs
parents:
diff changeset
   586
    pathList << ":/effects/slide_to_left.fxml" << ":/effects/slide_from_left.fxml";
hgs
parents:
diff changeset
   587
    QStringList eventList;
hgs
parents:
diff changeset
   588
    eventList << FrequencyStrip::SLIDE_TO_LEFT << FrequencyStrip::SLIDE_FROM_LEFT;
hgs
parents:
diff changeset
   589
    HbEffect::add( mLeftButton, pathList, eventList );
hgs
parents:
diff changeset
   590
hgs
parents:
diff changeset
   591
    // Add right button effects
hgs
parents:
diff changeset
   592
    pathList.clear();
hgs
parents:
diff changeset
   593
    pathList << ":/effects/slide_to_right.fxml" << ":/effects/slide_from_right.fxml";
hgs
parents:
diff changeset
   594
    eventList.clear();
hgs
parents:
diff changeset
   595
    eventList << FrequencyStrip::SLIDE_TO_RIGHT << FrequencyStrip::SLIDE_FROM_RIGHT;
hgs
parents:
diff changeset
   596
    HbEffect::add( mRightButton, pathList, eventList );
hgs
parents:
diff changeset
   597
}
hgs
parents:
diff changeset
   598
hgs
parents:
diff changeset
   599
/*!
hgs
parents:
diff changeset
   600
 *
hgs
parents:
diff changeset
   601
 */
hgs
parents:
diff changeset
   602
void RadioFrequencyStripBase::addFrequencyPos( int pos, uint frequency, RadioFrequencyItem* item )
hgs
parents:
diff changeset
   603
{
hgs
parents:
diff changeset
   604
    mFrequencies.insert( frequency, FrequencyPos( pos, item ) );
hgs
parents:
diff changeset
   605
    mPositions.insert( pos, frequency );
hgs
parents:
diff changeset
   606
}
hgs
parents:
diff changeset
   607
hgs
parents:
diff changeset
   608
/*!
hgs
parents:
diff changeset
   609
 *
hgs
parents:
diff changeset
   610
 */
hgs
parents:
diff changeset
   611
void RadioFrequencyStripBase::updateStationsInRange( int first, int last, bool stationRemoved )
hgs
parents:
diff changeset
   612
{
hgs
parents:
diff changeset
   613
    if ( !isScanning() ) {
hgs
parents:
diff changeset
   614
        uint frequency = 0;
hgs
parents:
diff changeset
   615
        for ( int i = first; i <= last; ++i ) {
hgs
parents:
diff changeset
   616
            frequency = frequencyAtIndex( i );
hgs
parents:
diff changeset
   617
            if ( mFrequencies.contains( frequency ) ) {
hgs
parents:
diff changeset
   618
                FrequencyPos pos = mFrequencies.value( frequency );
hgs
parents:
diff changeset
   619
                updateItem( pos.mItem, 0, stationRemoved ? frequency : 0 );
hgs
parents:
diff changeset
   620
            }
hgs
parents:
diff changeset
   621
        }
hgs
parents:
diff changeset
   622
    }
hgs
parents:
diff changeset
   623
}
hgs
parents:
diff changeset
   624
hgs
parents:
diff changeset
   625
/*!
hgs
parents:
diff changeset
   626
 *
hgs
parents:
diff changeset
   627
 */
hgs
parents:
diff changeset
   628
void RadioFrequencyStripBase::updateItem( RadioFrequencyItem* item, uint upperRange, uint ignoredFrequency )
hgs
parents:
diff changeset
   629
{
hgs
parents:
diff changeset
   630
    if ( item ) {
hgs
parents:
diff changeset
   631
        uint frequency = item->frequency();
hgs
parents:
diff changeset
   632
        QList<FrequencyStrip::StationMarker> markers;
hgs
parents:
diff changeset
   633
hgs
parents:
diff changeset
   634
        if ( upperRange == 0 ) {
hgs
parents:
diff changeset
   635
            upperRange = frequency + FrequencyStrip::HALF_HERTZ;
hgs
parents:
diff changeset
   636
        }
hgs
parents:
diff changeset
   637
hgs
parents:
diff changeset
   638
        if ( isInitialized() ) {
hgs
parents:
diff changeset
   639
            markers = stationsInRange( frequency - FrequencyStrip::HALF_HERTZ, upperRange );
hgs
parents:
diff changeset
   640
            for ( int i = markers.count() - 1; ignoredFrequency > 0 && i >= 0; --i ) {
hgs
parents:
diff changeset
   641
                if ( markers[i].mFrequency == ignoredFrequency ) {
hgs
parents:
diff changeset
   642
                    markers.removeAt( i );
hgs
parents:
diff changeset
   643
                    break;
hgs
parents:
diff changeset
   644
                }
hgs
parents:
diff changeset
   645
            }
hgs
parents:
diff changeset
   646
        }
hgs
parents:
diff changeset
   647
hgs
parents:
diff changeset
   648
        QPixmap pixmap = drawPixmap( frequency, markers, item );
hgs
parents:
diff changeset
   649
        item->setPixmap( pixmap );
hgs
parents:
diff changeset
   650
hgs
parents:
diff changeset
   651
        foreach ( const FrequencyStrip::StationMarker& marker, markers ) {
hgs
parents:
diff changeset
   652
            FrequencyPos pos = mFrequencies.value( marker.mFrequency );
hgs
parents:
diff changeset
   653
            mFrequencies.insert( marker.mFrequency, pos );
hgs
parents:
diff changeset
   654
        }
hgs
parents:
diff changeset
   655
    }
hgs
parents:
diff changeset
   656
}
hgs
parents:
diff changeset
   657
hgs
parents:
diff changeset
   658
/*!
hgs
parents:
diff changeset
   659
 *
hgs
parents:
diff changeset
   660
 */
hgs
parents:
diff changeset
   661
void RadioFrequencyStripBase::updateAllItems()
hgs
parents:
diff changeset
   662
{
hgs
parents:
diff changeset
   663
    foreach ( RadioFrequencyItem* item, mFrequencyItems ) {
hgs
parents:
diff changeset
   664
        updateItem( item );
hgs
parents:
diff changeset
   665
    }
hgs
parents:
diff changeset
   666
}
hgs
parents:
diff changeset
   667
hgs
parents:
diff changeset
   668
/*!
hgs
parents:
diff changeset
   669
 *
hgs
parents:
diff changeset
   670
 */
hgs
parents:
diff changeset
   671
QPixmap RadioFrequencyStripBase::drawPixmap( uint frequency, QList<FrequencyStrip::StationMarker> stations, RadioFrequencyItem* item )
hgs
parents:
diff changeset
   672
{
hgs
parents:
diff changeset
   673
    QPixmap pixmap( FrequencyStrip::PIXMAP_WIDTH, mItemHeight );
hgs
parents:
diff changeset
   674
    pixmap.fill( Qt::transparent );
hgs
parents:
diff changeset
   675
    QPainter painter( &pixmap );
hgs
parents:
diff changeset
   676
    QPen normalPen = painter.pen();
hgs
parents:
diff changeset
   677
    QPen favoritePen = normalPen;
hgs
parents:
diff changeset
   678
    normalPen.setColor( mForegroundColor );
hgs
parents:
diff changeset
   679
    painter.setPen( normalPen );
hgs
parents:
diff changeset
   680
hgs
parents:
diff changeset
   681
    if ( frequency == 0 ) {
hgs
parents:
diff changeset
   682
        painter.drawLine( makeTab( mSeparatorPos - 1 + FrequencyStrip::ROUNDER, mItemHeight ) );
hgs
parents:
diff changeset
   683
        painter.drawLine( makeTab( mSeparatorPos + FrequencyStrip::ROUNDER, mItemHeight ) );
hgs
parents:
diff changeset
   684
        return pixmap;
hgs
parents:
diff changeset
   685
    }
hgs
parents:
diff changeset
   686
hgs
parents:
diff changeset
   687
    const QString itemText = QString::number( frequency / FrequencyStrip::ONE_HERTZ );
hgs
parents:
diff changeset
   688
    const uint startFrequency = frequency - FrequencyStrip::HALF_HERTZ;
hgs
parents:
diff changeset
   689
    const uint endFrequency = startFrequency + FrequencyStrip::ONE_HERTZ;
hgs
parents:
diff changeset
   690
    const uint  roundedMin = int( qreal(mMinFrequency) / FrequencyStrip::ONE_HERTZ + FrequencyStrip::ROUNDER );
hgs
parents:
diff changeset
   691
    const uint freq = frequency / FrequencyStrip::ONE_HERTZ;
hgs
parents:
diff changeset
   692
    const int diff = freq - roundedMin;
hgs
parents:
diff changeset
   693
    const qreal startPixel = diff * FrequencyStrip::ITEM_WIDTH;
hgs
parents:
diff changeset
   694
    qreal pixels = 0.0;
hgs
parents:
diff changeset
   695
    const qreal leftOverlap = FrequencyStrip::PIXMAP_OVERLAP / 2;
hgs
parents:
diff changeset
   696
hgs
parents:
diff changeset
   697
    for ( uint frequency = startFrequency; frequency <= endFrequency; frequency += mFrequencyStepSize ) {
hgs
parents:
diff changeset
   698
hgs
parents:
diff changeset
   699
        if ( frequency < mMinFrequency || frequency > mMaxFrequency ) {
hgs
parents:
diff changeset
   700
            continue;
hgs
parents:
diff changeset
   701
        }
hgs
parents:
diff changeset
   702
hgs
parents:
diff changeset
   703
        pixels = qreal( frequency - startFrequency ) / FrequencyStrip::PIXEL_IN_HZ;
hgs
parents:
diff changeset
   704
        if ( frequency % FrequencyStrip::ONE_HERTZ == 0 ) {
hgs
parents:
diff changeset
   705
hgs
parents:
diff changeset
   706
            // Draw the high frequency tab and the frequency text for the even number
hgs
parents:
diff changeset
   707
            normalPen.setWidth( 3 );
hgs
parents:
diff changeset
   708
            painter.setPen( normalPen );
hgs
parents:
diff changeset
   709
            painter.drawLine( makeTab( pixels + leftOverlap - 1, FrequencyStrip::TAB_HEIGHT_BIG ) );
hgs
parents:
diff changeset
   710
            normalPen.setWidth( 1 );
hgs
parents:
diff changeset
   711
            painter.setPen( normalPen );
hgs
parents:
diff changeset
   712
hgs
parents:
diff changeset
   713
            // Draw the frequency text and its 00 decimals
hgs
parents:
diff changeset
   714
            painter.setFont( FrequencyStrip::DECIMAL_FONT );
hgs
parents:
diff changeset
   715
            const int decimalWidth = painter.fontMetrics().width( FrequencyStrip::DECIMAL_TEXT );
hgs
parents:
diff changeset
   716
            const int decimalSpace = painter.fontMetrics().leftBearing( '.' );
hgs
parents:
diff changeset
   717
            painter.setFont( FrequencyStrip::FREQUENCY_FONT );
hgs
parents:
diff changeset
   718
            const int frequencyWidth = painter.fontMetrics().width( itemText );
hgs
parents:
diff changeset
   719
            const int textPosX = int( pixels + leftOverlap - ( frequencyWidth + decimalSpace + decimalWidth ) / 2 );
hgs
parents:
diff changeset
   720
            painter.drawText( QPoint( textPosX, FrequencyStrip::FREQUENCY_TEXT_Y_POS ), itemText );
hgs
parents:
diff changeset
   721
            painter.setFont( FrequencyStrip::DECIMAL_FONT );
hgs
parents:
diff changeset
   722
            painter.drawText( QPoint( textPosX + frequencyWidth + decimalSpace, FrequencyStrip::FREQUENCY_TEXT_Y_POS ), FrequencyStrip::DECIMAL_TEXT );
hgs
parents:
diff changeset
   723
hgs
parents:
diff changeset
   724
        } else if ( frequency % FrequencyStrip::ONE_TAB_IN_HZ == 0 ) {
hgs
parents:
diff changeset
   725
hgs
parents:
diff changeset
   726
            // Draw the low frequency tab for the uneven number
hgs
parents:
diff changeset
   727
            painter.drawLine( makeTab( pixels + leftOverlap, FrequencyStrip::TAB_HEIGHT_SMALL ) );
hgs
parents:
diff changeset
   728
hgs
parents:
diff changeset
   729
        }
hgs
parents:
diff changeset
   730
hgs
parents:
diff changeset
   731
        addFrequencyPos( int( startPixel + pixels + FrequencyStrip::ROUNDER ), frequency, item );
hgs
parents:
diff changeset
   732
    }
hgs
parents:
diff changeset
   733
hgs
parents:
diff changeset
   734
    // Draw favorites and local stations
hgs
parents:
diff changeset
   735
    favoritePen.setColor( Qt::yellow );
hgs
parents:
diff changeset
   736
hgs
parents:
diff changeset
   737
    foreach ( const FrequencyStrip::StationMarker& station, stations ) {
hgs
parents:
diff changeset
   738
        const uint frequency = station.mFrequency;
hgs
parents:
diff changeset
   739
        pixels = qreal( frequency - startFrequency ) / FrequencyStrip::PIXEL_IN_HZ;
hgs
parents:
diff changeset
   740
hgs
parents:
diff changeset
   741
        if ( station.mIsFavorite ) {
hgs
parents:
diff changeset
   742
            favoritePen.setWidth( FrequencyStrip::PEN_WIDTH_FAVORITE );
hgs
parents:
diff changeset
   743
            painter.setPen( favoritePen );
hgs
parents:
diff changeset
   744
            painter.drawEllipse( int( pixels + leftOverlap - 3 ), FrequencyStrip::STATION_MARKER_Y_POS - 3, 6, 6 );
hgs
parents:
diff changeset
   745
        } else {
hgs
parents:
diff changeset
   746
            favoritePen.setWidth( 1 );
hgs
parents:
diff changeset
   747
            painter.setPen( favoritePen );
hgs
parents:
diff changeset
   748
            painter.drawEllipse( int( pixels + leftOverlap - 4 ), FrequencyStrip::STATION_MARKER_Y_POS - 4, 8, 8 );
hgs
parents:
diff changeset
   749
        }
hgs
parents:
diff changeset
   750
    }
hgs
parents:
diff changeset
   751
hgs
parents:
diff changeset
   752
    return pixmap;
hgs
parents:
diff changeset
   753
}
hgs
parents:
diff changeset
   754
hgs
parents:
diff changeset
   755
/*!
hgs
parents:
diff changeset
   756
 *
hgs
parents:
diff changeset
   757
 */
hgs
parents:
diff changeset
   758
QLineF RadioFrequencyStripBase::makeTab( qreal pos, int height )
hgs
parents:
diff changeset
   759
{
hgs
parents:
diff changeset
   760
    return QLineF( pos, mItemHeight - height, pos, mItemHeight );
hgs
parents:
diff changeset
   761
}
hgs
parents:
diff changeset
   762
hgs
parents:
diff changeset
   763
/*!
hgs
parents:
diff changeset
   764
 *
hgs
parents:
diff changeset
   765
 */
hgs
parents:
diff changeset
   766
int RadioFrequencyStripBase::selectorPos() const
hgs
parents:
diff changeset
   767
{
hgs
parents:
diff changeset
   768
    const int pos = int( -contentWidget()->x() + mSelectorPos + FrequencyStrip::ROUNDER );
hgs
parents:
diff changeset
   769
    return pos % mMaxWidth;
hgs
parents:
diff changeset
   770
}
hgs
parents:
diff changeset
   771
hgs
parents:
diff changeset
   772
/*!
hgs
parents:
diff changeset
   773
 *
hgs
parents:
diff changeset
   774
 */
hgs
parents:
diff changeset
   775
void RadioFrequencyStripBase::scrollToFrequency( uint frequency, Scroll::Direction direction, int time )
hgs
parents:
diff changeset
   776
{
hgs
parents:
diff changeset
   777
    int targetFreqPos = mFrequencies.value( frequency ).mPosition;
hgs
parents:
diff changeset
   778
    const int currentFreqPos = mFrequencies.value( mFrequency ).mPosition;
hgs
parents:
diff changeset
   779
    const int currentPos = int( -contentWidget()->x() + mSelectorPos + FrequencyStrip::ROUNDER );
hgs
parents:
diff changeset
   780
    const bool isInSecondHalf = currentPos >= mMaxWidth - FrequencyStrip::ITEM_WIDTH + mSeparatorPos;
hgs
parents:
diff changeset
   781
hgs
parents:
diff changeset
   782
    // Special case: When there is only one favorite and the user presses skip
hgs
parents:
diff changeset
   783
    // the strip must scroll around to the same frequency.
hgs
parents:
diff changeset
   784
    if ( mFrequency == frequency && direction != Scroll::Shortest ) {
hgs
parents:
diff changeset
   785
        if ( direction == Scroll::Left ) {
hgs
parents:
diff changeset
   786
            targetFreqPos += mMaxWidth;
hgs
parents:
diff changeset
   787
        } else {
hgs
parents:
diff changeset
   788
            targetFreqPos -= mMaxWidth;
hgs
parents:
diff changeset
   789
        }
hgs
parents:
diff changeset
   790
    }
hgs
parents:
diff changeset
   791
hgs
parents:
diff changeset
   792
    mFrequency = frequency;
hgs
parents:
diff changeset
   793
hgs
parents:
diff changeset
   794
    qreal newPos = targetFreqPos;
hgs
parents:
diff changeset
   795
    if ( direction == Scroll::Left ) {
hgs
parents:
diff changeset
   796
hgs
parents:
diff changeset
   797
        if ( currentFreqPos > targetFreqPos ) {
hgs
parents:
diff changeset
   798
            newPos += mMaxWidth;
hgs
parents:
diff changeset
   799
        }
hgs
parents:
diff changeset
   800
hgs
parents:
diff changeset
   801
    } else if ( direction == Scroll::Right ) {
hgs
parents:
diff changeset
   802
hgs
parents:
diff changeset
   803
        if ( currentFreqPos < targetFreqPos ) {
hgs
parents:
diff changeset
   804
            newPos -= mMaxWidth;
hgs
parents:
diff changeset
   805
        }
hgs
parents:
diff changeset
   806
hgs
parents:
diff changeset
   807
    }
hgs
parents:
diff changeset
   808
hgs
parents:
diff changeset
   809
    if ( isInSecondHalf ) {
hgs
parents:
diff changeset
   810
        newPos += mMaxWidth;
hgs
parents:
diff changeset
   811
    }
hgs
parents:
diff changeset
   812
hgs
parents:
diff changeset
   813
    newPos -= mSelectorPos - FrequencyStrip::ROUNDER;
hgs
parents:
diff changeset
   814
hgs
parents:
diff changeset
   815
//    scrollContentsTo( QPointF( newPos, 0 ), time );
hgs
parents:
diff changeset
   816
// TODO: Remove this and uncomment the above line. This is a temporary workaround to get the strip to move
hgs
parents:
diff changeset
   817
    scrollContentsTo( QPointF( newPos, 0 ), 0 );
hgs
parents:
diff changeset
   818
}
hgs
parents:
diff changeset
   819
hgs
parents:
diff changeset
   820
/*!
hgs
parents:
diff changeset
   821
 *
hgs
parents:
diff changeset
   822
 */
hgs
parents:
diff changeset
   823
void RadioFrequencyStripBase::hideButtons()
hgs
parents:
diff changeset
   824
{
hgs
parents:
diff changeset
   825
    HbEffect::start( mLeftButton, FrequencyStrip::SLIDE_TO_LEFT );
hgs
parents:
diff changeset
   826
    HbEffect::start( mRightButton, FrequencyStrip::SLIDE_TO_RIGHT );
hgs
parents:
diff changeset
   827
}
hgs
parents:
diff changeset
   828
hgs
parents:
diff changeset
   829
/*!
hgs
parents:
diff changeset
   830
 *
hgs
parents:
diff changeset
   831
 */
hgs
parents:
diff changeset
   832
void RadioFrequencyStripBase::showButtons()
hgs
parents:
diff changeset
   833
{
hgs
parents:
diff changeset
   834
    HbEffect::start( mLeftButton, FrequencyStrip::SLIDE_FROM_LEFT );
hgs
parents:
diff changeset
   835
    HbEffect::start( mRightButton, FrequencyStrip::SLIDE_FROM_RIGHT );
hgs
parents:
diff changeset
   836
}