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