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