mpdata/src/mpcollectiontbonelistdatamodel.cpp
author hgs
Fri, 03 Sep 2010 19:58:01 -0500
changeset 55 f3930dda3342
parent 51 560ce2306a17
permissions -rw-r--r--
201035
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
35
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: Music Player secondary collection abstract data model. This is
hgs
parents:
diff changeset
    15
*              primarily used to support Mediawall in Collection View. This
hgs
parents:
diff changeset
    16
*              model represents the list containing album songs.
hgs
parents:
diff changeset
    17
*
hgs
parents:
diff changeset
    18
*/
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
#include <hbnamespace.h>
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
#include "mpcollectiontbonelistdatamodel.h"
hgs
parents:
diff changeset
    23
#include "mpmpxcollectiondata.h"
36
hgs
parents: 35
diff changeset
    24
#include "mpplaybackdata.h"
35
hgs
parents:
diff changeset
    25
#include "mptrace.h"
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
/*!
hgs
parents:
diff changeset
    28
    \class MpCollectionTBoneListDataModel
hgs
parents:
diff changeset
    29
    \brief Music Player collection data model.
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
    Secondary collection data model implements the interface specified by
hgs
parents:
diff changeset
    32
    QAbstractListModel, which defines the standard interface that item models
hgs
parents:
diff changeset
    33
    must use to be able to interoperate with other components in the model/view
hgs
parents:
diff changeset
    34
    architecture.
hgs
parents:
diff changeset
    35
hgs
parents:
diff changeset
    36
    Every item of data that can be accessed via a model has an associated model
hgs
parents:
diff changeset
    37
    index.
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
    Each item has a number of data elements associated with it and they can be
hgs
parents:
diff changeset
    40
    retrieved by specifying a role (see Qt::ItemDataRole) to the model's data
hgs
parents:
diff changeset
    41
    returned by itemData() function.
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
    MpCollectionTBoneListDataModel is primarily used to support Mediawall in
hgs
parents:
diff changeset
    44
    Collection View. This model represents the list containing album songs.
hgs
parents:
diff changeset
    45
hgs
parents:
diff changeset
    46
    \sa QAbstractListModel
hgs
parents:
diff changeset
    47
*/
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
/*!
hgs
parents:
diff changeset
    50
    \fn void albumDataChanged()
hgs
parents:
diff changeset
    51
hgs
parents:
diff changeset
    52
    This signal is specific to views with TBone. This signal is emitted when
36
hgs
parents: 35
diff changeset
    53
    there's a change in album data. This is an indication that the container
hgs
parents: 35
diff changeset
    54
    should re-fetch the album content. Currently, the only operation that can
hgs
parents: 35
diff changeset
    55
    trigger this is the delete operation.
hgs
parents: 35
diff changeset
    56
 */
hgs
parents: 35
diff changeset
    57
hgs
parents: 35
diff changeset
    58
/*!
hgs
parents: 35
diff changeset
    59
    \fn void albumDataAvailable()
hgs
parents: 35
diff changeset
    60
hgs
parents: 35
diff changeset
    61
    This signal is specific to views with TBone. This signal is emitted when
hgs
parents: 35
diff changeset
    62
    a new data set is available for the list section of the TBone. This is
hgs
parents: 35
diff changeset
    63
    triggered as a result of container re-fetching the album content.
hgs
parents: 35
diff changeset
    64
hgs
parents: 35
diff changeset
    65
    \sa albumDataChanged
35
hgs
parents:
diff changeset
    66
 */
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
/*!
hgs
parents:
diff changeset
    69
 Constructs the collection data model.
hgs
parents:
diff changeset
    70
 */
36
hgs
parents: 35
diff changeset
    71
MpCollectionTBoneListDataModel::MpCollectionTBoneListDataModel( MpMpxCollectionData *collectionData, 
hgs
parents: 35
diff changeset
    72
        MpPlaybackData *playbackData, QObject *parent )
hgs
parents: 35
diff changeset
    73
    : QAbstractListModel( parent ),
hgs
parents: 35
diff changeset
    74
      mCollectionData( collectionData ),
hgs
parents: 35
diff changeset
    75
      mPlaybackData( playbackData ),
37
hgs
parents: 36
diff changeset
    76
      mRowCount( 0 ),
hgs
parents: 36
diff changeset
    77
      mCurrentSongId( 0 ),
51
hgs
parents: 45
diff changeset
    78
      mPlaybackActive( false ),
hgs
parents: 45
diff changeset
    79
      mPlaybackIndicatorEnabled( false )
35
hgs
parents:
diff changeset
    80
{
hgs
parents:
diff changeset
    81
    TX_ENTRY
hgs
parents:
diff changeset
    82
    connect( mCollectionData, SIGNAL(refreshAlbumSongs()),
hgs
parents:
diff changeset
    83
             this, SLOT(refreshModel()) );
hgs
parents:
diff changeset
    84
    connect( mCollectionData, SIGNAL(albumDataChanged()),
hgs
parents:
diff changeset
    85
             this, SIGNAL(albumDataChanged()) );
36
hgs
parents: 35
diff changeset
    86
    
hgs
parents: 35
diff changeset
    87
    if ( mPlaybackData ) {
55
hgs
parents: 51
diff changeset
    88
        connect( mPlaybackData, SIGNAL(fileCorrupted( int )), 
hgs
parents: 51
diff changeset
    89
                this, SLOT(fileCorrupted( int )));
36
hgs
parents: 35
diff changeset
    90
    }
hgs
parents: 35
diff changeset
    91
    
35
hgs
parents:
diff changeset
    92
    TX_EXIT
hgs
parents:
diff changeset
    93
}
hgs
parents:
diff changeset
    94
hgs
parents:
diff changeset
    95
/*!
hgs
parents:
diff changeset
    96
 Destructs the collection data model.
hgs
parents:
diff changeset
    97
 */
hgs
parents:
diff changeset
    98
MpCollectionTBoneListDataModel::~MpCollectionTBoneListDataModel()
hgs
parents:
diff changeset
    99
{
hgs
parents:
diff changeset
   100
    TX_LOG
hgs
parents:
diff changeset
   101
}
hgs
parents:
diff changeset
   102
hgs
parents:
diff changeset
   103
/*!
hgs
parents:
diff changeset
   104
 Returns the number of rows under the given \a parent.
hgs
parents:
diff changeset
   105
hgs
parents:
diff changeset
   106
 \reimp
hgs
parents:
diff changeset
   107
 */
hgs
parents:
diff changeset
   108
int MpCollectionTBoneListDataModel::rowCount( const QModelIndex &parent ) const
hgs
parents:
diff changeset
   109
{
hgs
parents:
diff changeset
   110
    TX_LOG
hgs
parents:
diff changeset
   111
    Q_UNUSED(parent);
hgs
parents:
diff changeset
   112
    return mRowCount;
hgs
parents:
diff changeset
   113
}
hgs
parents:
diff changeset
   114
hgs
parents:
diff changeset
   115
/*!
hgs
parents:
diff changeset
   116
 Returns the data stored for the item referred to by the \a index.
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
 \reimp
hgs
parents:
diff changeset
   119
 */
hgs
parents:
diff changeset
   120
QVariant MpCollectionTBoneListDataModel::data(const QModelIndex &index, int role) const
hgs
parents:
diff changeset
   121
{
hgs
parents:
diff changeset
   122
    TX_ENTRY
hgs
parents:
diff changeset
   123
    QVariant returnValue = QVariant();
hgs
parents:
diff changeset
   124
    if ( !index.isValid() ) {
hgs
parents:
diff changeset
   125
        return returnValue;
hgs
parents:
diff changeset
   126
    }
hgs
parents:
diff changeset
   127
hgs
parents:
diff changeset
   128
    int row = index.row();
hgs
parents:
diff changeset
   129
    TX_LOG_ARGS("index=" << row << ", role=" << role);
hgs
parents:
diff changeset
   130
    if ( role == Qt::DisplayRole ) {
hgs
parents:
diff changeset
   131
        // Fetch the primary text, which is the title, if available.
hgs
parents:
diff changeset
   132
        QString songTitle = mCollectionData->albumSongData(row, MpMpxCollectionData::Title);
hgs
parents:
diff changeset
   133
        if ( !songTitle.isEmpty() ) {
hgs
parents:
diff changeset
   134
            returnValue = songTitle;
hgs
parents:
diff changeset
   135
        }
hgs
parents:
diff changeset
   136
        else {
hgs
parents:
diff changeset
   137
            returnValue = hbTrId("txt_mus_other_unknown4");
hgs
parents:
diff changeset
   138
        }
hgs
parents:
diff changeset
   139
    }
36
hgs
parents: 35
diff changeset
   140
    else if ( role == Qt::DecorationRole ) {
51
hgs
parents: 45
diff changeset
   141
        if ( mCollectionData->hasAlbumSongProperty(row, MpMpxCollectionData::Corrupted) ) {
hgs
parents: 45
diff changeset
   142
                QList<QVariant> iconList;
hgs
parents: 45
diff changeset
   143
                iconList << QVariant();
hgs
parents: 45
diff changeset
   144
                iconList << HbIcon("qtg_mono_corrupted");
hgs
parents: 45
diff changeset
   145
                returnValue = iconList;
hgs
parents: 45
diff changeset
   146
        }
hgs
parents: 45
diff changeset
   147
        else if ( mCollectionData->hasAlbumSongProperty(row, MpMpxCollectionData::DrmExpired) ) {
hgs
parents: 45
diff changeset
   148
            QList<QVariant> iconList;
hgs
parents: 45
diff changeset
   149
            iconList << QVariant();
hgs
parents: 45
diff changeset
   150
            iconList << HbIcon("qtg_small_drm_rights_expired");
hgs
parents: 45
diff changeset
   151
            returnValue = iconList;
hgs
parents: 45
diff changeset
   152
        }
hgs
parents: 45
diff changeset
   153
        else if ( mPlaybackActive && mPlaybackIndicatorEnabled
37
hgs
parents: 36
diff changeset
   154
                && mPlaybackData->id() == mCollectionData->albumSongId( row ) ) {
36
hgs
parents: 35
diff changeset
   155
            QList<QVariant> iconList;
hgs
parents: 35
diff changeset
   156
            iconList << QVariant(); //primary icon is not used.
55
hgs
parents: 51
diff changeset
   157
            if ( mPlaybackData->playbackState() == MpPlaybackData::Playing ) {
hgs
parents: 51
diff changeset
   158
                iconList << HbIcon("qtg_mono_play");
hgs
parents: 51
diff changeset
   159
            }
hgs
parents: 51
diff changeset
   160
            else {
hgs
parents: 51
diff changeset
   161
                iconList << HbIcon("qtg_mono_pause");
hgs
parents: 51
diff changeset
   162
            }
36
hgs
parents: 35
diff changeset
   163
            returnValue = iconList;
hgs
parents: 35
diff changeset
   164
        }
hgs
parents: 35
diff changeset
   165
    }
35
hgs
parents:
diff changeset
   166
    TX_EXIT
hgs
parents:
diff changeset
   167
    return returnValue;
hgs
parents:
diff changeset
   168
}
hgs
parents:
diff changeset
   169
hgs
parents:
diff changeset
   170
/*!
51
hgs
parents: 45
diff changeset
   171
 Set Playback Indicator in TBone List Model 
hgs
parents: 45
diff changeset
   172
 */
hgs
parents: 45
diff changeset
   173
void MpCollectionTBoneListDataModel::enablePlaybackIndicatorEnable(bool enable)
hgs
parents: 45
diff changeset
   174
{   
hgs
parents: 45
diff changeset
   175
    TX_ENTRY
hgs
parents: 45
diff changeset
   176
    if ( !mPlaybackData ) {
hgs
parents: 45
diff changeset
   177
        return;
hgs
parents: 45
diff changeset
   178
    }
hgs
parents: 45
diff changeset
   179
    if ( enable ){
hgs
parents: 45
diff changeset
   180
        connect( mPlaybackData, SIGNAL(playbackInfoChanged()),
hgs
parents: 45
diff changeset
   181
                        this, SLOT(updateSong()));
hgs
parents: 45
diff changeset
   182
                
hgs
parents: 45
diff changeset
   183
        connect( mPlaybackData, SIGNAL(playbackStateChanged()), 
hgs
parents: 45
diff changeset
   184
                this, SLOT(updatePlaybackState()));
hgs
parents: 45
diff changeset
   185
        mPlaybackActive = mPlaybackData->playbackState() != MpPlaybackData::NotPlaying;
hgs
parents: 45
diff changeset
   186
        mPlaybackIndicatorEnabled = true;
hgs
parents: 45
diff changeset
   187
    }
hgs
parents: 45
diff changeset
   188
    else{
hgs
parents: 45
diff changeset
   189
        disconnect( mPlaybackData, SIGNAL(playbackInfoChanged()),
hgs
parents: 45
diff changeset
   190
                        this, SLOT(updateSong()));
hgs
parents: 45
diff changeset
   191
                
hgs
parents: 45
diff changeset
   192
        disconnect( mPlaybackData, SIGNAL(playbackStateChanged()), 
hgs
parents: 45
diff changeset
   193
                this, SLOT(updatePlaybackState()));
hgs
parents: 45
diff changeset
   194
        mPlaybackActive = false;
hgs
parents: 45
diff changeset
   195
        mPlaybackIndicatorEnabled = false;
hgs
parents: 45
diff changeset
   196
    }
hgs
parents: 45
diff changeset
   197
    TX_EXIT
hgs
parents: 45
diff changeset
   198
}
hgs
parents: 45
diff changeset
   199
hgs
parents: 45
diff changeset
   200
/*!
35
hgs
parents:
diff changeset
   201
 Slot to be called when data has changed and model needs to be refreshed
hgs
parents:
diff changeset
   202
 to reflect the new data.
hgs
parents:
diff changeset
   203
 */
hgs
parents:
diff changeset
   204
void MpCollectionTBoneListDataModel::refreshModel()
hgs
parents:
diff changeset
   205
{
hgs
parents:
diff changeset
   206
    TX_ENTRY
hgs
parents:
diff changeset
   207
    mRowCount = mCollectionData->albumSongsCount();
hgs
parents:
diff changeset
   208
    reset();
36
hgs
parents: 35
diff changeset
   209
    emit albumDataAvailable();
35
hgs
parents:
diff changeset
   210
    TX_EXIT
hgs
parents:
diff changeset
   211
}
hgs
parents:
diff changeset
   212
36
hgs
parents: 35
diff changeset
   213
/*!
hgs
parents: 35
diff changeset
   214
 Slot to be called when playing song status has changed.
hgs
parents: 35
diff changeset
   215
 */
hgs
parents: 35
diff changeset
   216
void MpCollectionTBoneListDataModel::updateSong()
hgs
parents: 35
diff changeset
   217
{
hgs
parents: 35
diff changeset
   218
    TX_ENTRY
45
hgs
parents: 37
diff changeset
   219
    if( mPlaybackActive ) {
hgs
parents: 37
diff changeset
   220
        int newSongId = mPlaybackData->id();
hgs
parents: 37
diff changeset
   221
hgs
parents: 37
diff changeset
   222
        if ( mCurrentSongId && newSongId != mCurrentSongId) {
hgs
parents: 37
diff changeset
   223
            //Attempt to remove old song icon.
hgs
parents: 37
diff changeset
   224
            QModelIndex oldSongIndex;
hgs
parents: 37
diff changeset
   225
            oldSongIndex = index( mCollectionData->albumSongIndex( mCurrentSongId ) );
hgs
parents: 37
diff changeset
   226
            if ( oldSongIndex.isValid() ) {
hgs
parents: 37
diff changeset
   227
               emit dataChanged( oldSongIndex, oldSongIndex );
hgs
parents: 37
diff changeset
   228
            } 
hgs
parents: 37
diff changeset
   229
        }
hgs
parents: 37
diff changeset
   230
hgs
parents: 37
diff changeset
   231
        //Attempt to update current song data and state.
hgs
parents: 37
diff changeset
   232
        QModelIndex songIndex;
hgs
parents: 37
diff changeset
   233
        songIndex = index( mCollectionData->albumSongIndex( newSongId ) );
hgs
parents: 37
diff changeset
   234
        if ( songIndex.isValid() ) {
hgs
parents: 37
diff changeset
   235
            emit dataChanged( songIndex, songIndex );
hgs
parents: 37
diff changeset
   236
        }
hgs
parents: 37
diff changeset
   237
        mCurrentSongId = newSongId;
36
hgs
parents: 35
diff changeset
   238
    }
hgs
parents: 35
diff changeset
   239
    TX_EXIT
hgs
parents: 35
diff changeset
   240
}
hgs
parents: 35
diff changeset
   241
hgs
parents: 35
diff changeset
   242
/*!
hgs
parents: 35
diff changeset
   243
 Slot to be called when playback state has changed.
hgs
parents: 35
diff changeset
   244
 */
hgs
parents: 35
diff changeset
   245
void MpCollectionTBoneListDataModel::updatePlaybackState()
hgs
parents: 35
diff changeset
   246
{
hgs
parents: 35
diff changeset
   247
    mPlaybackActive = mPlaybackData->playbackState() != MpPlaybackData::NotPlaying;
55
hgs
parents: 51
diff changeset
   248
    updateSong();
36
hgs
parents: 35
diff changeset
   249
}    
51
hgs
parents: 45
diff changeset
   250
hgs
parents: 45
diff changeset
   251
/*!
hgs
parents: 45
diff changeset
   252
 Slot to be called when a song is marked as corrupted
hgs
parents: 45
diff changeset
   253
 */
hgs
parents: 45
diff changeset
   254
void MpCollectionTBoneListDataModel::fileCorrupted(int songId)
hgs
parents: 45
diff changeset
   255
{
hgs
parents: 45
diff changeset
   256
    TX_ENTRY
hgs
parents: 45
diff changeset
   257
    QModelIndex corruptedSongIndex;
hgs
parents: 45
diff changeset
   258
    corruptedSongIndex = index( mCollectionData->albumSongIndex( songId ) );
hgs
parents: 45
diff changeset
   259
    if ( !(corruptedSongIndex.isValid()) ){
hgs
parents: 45
diff changeset
   260
        mCollectionData->setReloadAlbumContent( true );
hgs
parents: 45
diff changeset
   261
    }
hgs
parents: 45
diff changeset
   262
    else if (!(mCollectionData->hasAlbumSongProperty(corruptedSongIndex.row(),
hgs
parents: 45
diff changeset
   263
            MpMpxCollectionData::Corrupted))) {   
hgs
parents: 45
diff changeset
   264
        mCollectionData->setCorruptValue(corruptedSongIndex, true);
hgs
parents: 45
diff changeset
   265
        emit dataChanged( corruptedSongIndex, corruptedSongIndex );
hgs
parents: 45
diff changeset
   266
    }
hgs
parents: 45
diff changeset
   267
    TX_EXIT
hgs
parents: 45
diff changeset
   268
}
36
hgs
parents: 35
diff changeset
   269
    
hgs
parents: 35
diff changeset
   270
hgs
parents: 35
diff changeset
   271
//EOF
hgs
parents: 35
diff changeset
   272
hgs
parents: 35
diff changeset
   273