mpdata/src/mpcollectiontbonelistdatamodel.cpp
author hgs
Fri, 23 Jul 2010 17:31:12 -0500
changeset 45 612c4815aebe
parent 37 eb79a7c355bf
child 51 560ce2306a17
permissions -rw-r--r--
201029
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 ),
hgs
parents: 36
diff changeset
    78
      mPlaybackActive( false )
35
hgs
parents:
diff changeset
    79
{
hgs
parents:
diff changeset
    80
    TX_ENTRY
hgs
parents:
diff changeset
    81
    connect( mCollectionData, SIGNAL(refreshAlbumSongs()),
hgs
parents:
diff changeset
    82
             this, SLOT(refreshModel()) );
hgs
parents:
diff changeset
    83
    connect( mCollectionData, SIGNAL(albumDataChanged()),
hgs
parents:
diff changeset
    84
             this, SIGNAL(albumDataChanged()) );
36
hgs
parents: 35
diff changeset
    85
    
hgs
parents: 35
diff changeset
    86
    if ( mPlaybackData ) {
hgs
parents: 35
diff changeset
    87
        connect( mPlaybackData, SIGNAL(playbackInfoChanged()),
hgs
parents: 35
diff changeset
    88
                this, SLOT(updateSong()));
hgs
parents: 35
diff changeset
    89
        
hgs
parents: 35
diff changeset
    90
        connect( mPlaybackData, SIGNAL(playbackStateChanged()), 
hgs
parents: 35
diff changeset
    91
                this, SLOT(updatePlaybackState()));
hgs
parents: 35
diff changeset
    92
        mPlaybackActive = mPlaybackData->playbackState() != MpPlaybackData::NotPlaying;
hgs
parents: 35
diff changeset
    93
    }
hgs
parents: 35
diff changeset
    94
    
35
hgs
parents:
diff changeset
    95
    TX_EXIT
hgs
parents:
diff changeset
    96
}
hgs
parents:
diff changeset
    97
hgs
parents:
diff changeset
    98
/*!
hgs
parents:
diff changeset
    99
 Destructs the collection data model.
hgs
parents:
diff changeset
   100
 */
hgs
parents:
diff changeset
   101
MpCollectionTBoneListDataModel::~MpCollectionTBoneListDataModel()
hgs
parents:
diff changeset
   102
{
hgs
parents:
diff changeset
   103
    TX_LOG
hgs
parents:
diff changeset
   104
}
hgs
parents:
diff changeset
   105
hgs
parents:
diff changeset
   106
/*!
hgs
parents:
diff changeset
   107
 Returns the number of rows under the given \a parent.
hgs
parents:
diff changeset
   108
hgs
parents:
diff changeset
   109
 \reimp
hgs
parents:
diff changeset
   110
 */
hgs
parents:
diff changeset
   111
int MpCollectionTBoneListDataModel::rowCount( const QModelIndex &parent ) const
hgs
parents:
diff changeset
   112
{
hgs
parents:
diff changeset
   113
    TX_LOG
hgs
parents:
diff changeset
   114
    Q_UNUSED(parent);
hgs
parents:
diff changeset
   115
    return mRowCount;
hgs
parents:
diff changeset
   116
}
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
/*!
hgs
parents:
diff changeset
   119
 Returns the data stored for the item referred to by the \a index.
hgs
parents:
diff changeset
   120
hgs
parents:
diff changeset
   121
 \reimp
hgs
parents:
diff changeset
   122
 */
hgs
parents:
diff changeset
   123
QVariant MpCollectionTBoneListDataModel::data(const QModelIndex &index, int role) const
hgs
parents:
diff changeset
   124
{
hgs
parents:
diff changeset
   125
    TX_ENTRY
hgs
parents:
diff changeset
   126
    QVariant returnValue = QVariant();
hgs
parents:
diff changeset
   127
    if ( !index.isValid() ) {
hgs
parents:
diff changeset
   128
        return returnValue;
hgs
parents:
diff changeset
   129
    }
hgs
parents:
diff changeset
   130
hgs
parents:
diff changeset
   131
    int row = index.row();
hgs
parents:
diff changeset
   132
    TX_LOG_ARGS("index=" << row << ", role=" << role);
hgs
parents:
diff changeset
   133
    if ( role == Qt::DisplayRole ) {
hgs
parents:
diff changeset
   134
        // Fetch the primary text, which is the title, if available.
hgs
parents:
diff changeset
   135
        QString songTitle = mCollectionData->albumSongData(row, MpMpxCollectionData::Title);
hgs
parents:
diff changeset
   136
        if ( !songTitle.isEmpty() ) {
hgs
parents:
diff changeset
   137
            returnValue = songTitle;
hgs
parents:
diff changeset
   138
        }
hgs
parents:
diff changeset
   139
        else {
hgs
parents:
diff changeset
   140
            returnValue = hbTrId("txt_mus_other_unknown4");
hgs
parents:
diff changeset
   141
        }
hgs
parents:
diff changeset
   142
    }
36
hgs
parents: 35
diff changeset
   143
    else if ( role == Qt::DecorationRole ) {
37
hgs
parents: 36
diff changeset
   144
        if ( mPlaybackActive
hgs
parents: 36
diff changeset
   145
                && mPlaybackData->id() == mCollectionData->albumSongId( row ) ) {
36
hgs
parents: 35
diff changeset
   146
            QList<QVariant> iconList;
hgs
parents: 35
diff changeset
   147
            iconList << QVariant(); //primary icon is not used.
37
hgs
parents: 36
diff changeset
   148
hgs
parents: 36
diff changeset
   149
            iconList << HbIcon("qtg_small_speaker");
36
hgs
parents: 35
diff changeset
   150
            returnValue = iconList;
hgs
parents: 35
diff changeset
   151
        }
hgs
parents: 35
diff changeset
   152
    }
35
hgs
parents:
diff changeset
   153
    TX_EXIT
hgs
parents:
diff changeset
   154
    return returnValue;
hgs
parents:
diff changeset
   155
}
hgs
parents:
diff changeset
   156
hgs
parents:
diff changeset
   157
/*!
hgs
parents:
diff changeset
   158
 Slot to be called when data has changed and model needs to be refreshed
hgs
parents:
diff changeset
   159
 to reflect the new data.
hgs
parents:
diff changeset
   160
 */
hgs
parents:
diff changeset
   161
void MpCollectionTBoneListDataModel::refreshModel()
hgs
parents:
diff changeset
   162
{
hgs
parents:
diff changeset
   163
    TX_ENTRY
hgs
parents:
diff changeset
   164
    mRowCount = mCollectionData->albumSongsCount();
hgs
parents:
diff changeset
   165
    reset();
36
hgs
parents: 35
diff changeset
   166
    emit albumDataAvailable();
35
hgs
parents:
diff changeset
   167
    TX_EXIT
hgs
parents:
diff changeset
   168
}
hgs
parents:
diff changeset
   169
36
hgs
parents: 35
diff changeset
   170
/*!
hgs
parents: 35
diff changeset
   171
 Slot to be called when playing song status has changed.
hgs
parents: 35
diff changeset
   172
 */
hgs
parents: 35
diff changeset
   173
void MpCollectionTBoneListDataModel::updateSong()
hgs
parents: 35
diff changeset
   174
{
hgs
parents: 35
diff changeset
   175
    TX_ENTRY
45
hgs
parents: 37
diff changeset
   176
    if( mPlaybackActive ) {
hgs
parents: 37
diff changeset
   177
        int newSongId = mPlaybackData->id();
hgs
parents: 37
diff changeset
   178
hgs
parents: 37
diff changeset
   179
        if ( mCurrentSongId && newSongId != mCurrentSongId) {
hgs
parents: 37
diff changeset
   180
            //Attempt to remove old song icon.
hgs
parents: 37
diff changeset
   181
            QModelIndex oldSongIndex;
hgs
parents: 37
diff changeset
   182
            oldSongIndex = index( mCollectionData->albumSongIndex( mCurrentSongId ) );
hgs
parents: 37
diff changeset
   183
            if ( oldSongIndex.isValid() ) {
hgs
parents: 37
diff changeset
   184
               emit dataChanged( oldSongIndex, oldSongIndex );
hgs
parents: 37
diff changeset
   185
            } 
hgs
parents: 37
diff changeset
   186
        }
hgs
parents: 37
diff changeset
   187
hgs
parents: 37
diff changeset
   188
        //Attempt to update current song data and state.
hgs
parents: 37
diff changeset
   189
        QModelIndex songIndex;
hgs
parents: 37
diff changeset
   190
        songIndex = index( mCollectionData->albumSongIndex( newSongId ) );
hgs
parents: 37
diff changeset
   191
        if ( songIndex.isValid() ) {
hgs
parents: 37
diff changeset
   192
            emit dataChanged( songIndex, songIndex );
hgs
parents: 37
diff changeset
   193
        }
hgs
parents: 37
diff changeset
   194
        mCurrentSongId = newSongId;
36
hgs
parents: 35
diff changeset
   195
    }
hgs
parents: 35
diff changeset
   196
    TX_EXIT
hgs
parents: 35
diff changeset
   197
}
hgs
parents: 35
diff changeset
   198
hgs
parents: 35
diff changeset
   199
/*!
hgs
parents: 35
diff changeset
   200
 Slot to be called when playback state has changed.
hgs
parents: 35
diff changeset
   201
 */
hgs
parents: 35
diff changeset
   202
void MpCollectionTBoneListDataModel::updatePlaybackState()
hgs
parents: 35
diff changeset
   203
{
hgs
parents: 35
diff changeset
   204
    //This logic is to account for when song plays the very first time, we get
hgs
parents: 35
diff changeset
   205
    //media before playback is active.
hgs
parents: 35
diff changeset
   206
    bool playbackWasActive = mPlaybackActive;
hgs
parents: 35
diff changeset
   207
    mPlaybackActive = mPlaybackData->playbackState() != MpPlaybackData::NotPlaying;
hgs
parents: 35
diff changeset
   208
    if ( mPlaybackActive && !playbackWasActive ) {
hgs
parents: 35
diff changeset
   209
        updateSong();
hgs
parents: 35
diff changeset
   210
    }
hgs
parents: 35
diff changeset
   211
}    
hgs
parents: 35
diff changeset
   212
    
hgs
parents: 35
diff changeset
   213
hgs
parents: 35
diff changeset
   214
//EOF
hgs
parents: 35
diff changeset
   215
hgs
parents: 35
diff changeset
   216