diff -r f3d95d9c00ab -r 46974bebc798 radioapp/radiouiengine/src/radioplaylogmodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/radioapp/radiouiengine/src/radioplaylogmodel.cpp Fri Mar 19 09:29:04 2010 +0200 @@ -0,0 +1,249 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +// System includes +#include + +// User includes +#include "radioplaylogmodel.h" +#include "radioplaylogmodel_p.h" +#include "radiouiengine.h" +#include "radioplaylogitem.h" +#include "radio_global.h" +#include "radiologger.h" + +/*! + * + */ +RadioPlayLogModel::RadioPlayLogModel( RadioUiEngine& uiEngine ) : + QAbstractListModel( &uiEngine ), + d_ptr( new RadioPlayLogModelPrivate( this, uiEngine ) ) +{ + connectAndTest( &uiEngine, SIGNAL(tunedToFrequency(uint,int)), + this, SLOT(resetCurrentSong()) ); + connectAndTest( &uiEngine, SIGNAL(seekingStarted(int)), + this, SLOT(resetCurrentSong()) ); +} + +/*! + * + */ +RadioPlayLogModel::~RadioPlayLogModel() +{ + Q_D( RadioPlayLogModel ); + d->mItems.clear(); +} + +/*! + * \reimp + */ +Qt::ItemFlags RadioPlayLogModel::flags ( const QModelIndex& index ) const +{ + Qt::ItemFlags flags = QAbstractListModel::flags( index ); + flags |= Qt::ItemIsEditable; + return flags; +} + +/*! + * \reimp + */ +int RadioPlayLogModel::rowCount( const QModelIndex& parent ) const +{ + Q_UNUSED( parent ); + Q_D( const RadioPlayLogModel ); + return d->mItems.count(); +} + +/*! + * \reimp + */ +QVariant RadioPlayLogModel::data( const QModelIndex& index, int role ) const +{ + if ( !index.isValid() ) { + return QVariant(); + } + + Q_D( const RadioPlayLogModel ); + if ( role == Qt::DisplayRole ) { + RadioPlayLogItem item = d->mItems.at( index.row() ); + + QStringList list; + list.append( item.artist() + " - " + item.title() ); + QString secondLine = QString( "Count: %1. Favorite: %2" ).arg( item.playCount() ).arg( item.isFavorite() ); + list.append( secondLine ); + + return list; + } + + return QVariant(); +} + +/*! + * \reimp + */ +bool RadioPlayLogModel::setData( const QModelIndex& index, const QVariant& value, int role ) +{ + Q_UNUSED( value ); + if ( !index.isValid() ) { + return false; + } + + if ( role == RadioPlayLogModel::SetFavoriteRole ) { + Q_D( RadioPlayLogModel ); + RadioPlayLogItem item = d->mItems.at( index.row() ); + item.setFavorite(); + updateItem( index.row(), item ); + return true; + } + + return false; +} + +/*! + * Public slot + */ +void RadioPlayLogModel::resetCurrentSong() +{ + Q_D( RadioPlayLogModel ); + d->mTopItemIsPlaying = false; + emit currentSongReset(); +} + +/*! + * Public slot + */ +void RadioPlayLogModel::setFavorite() +{ + Q_D( RadioPlayLogModel ); + RadioPlayLogItem item = d->mItems.first(); + item.setFavorite(); + updateItem( 0, item ); +} + +/*! + * Public slot + */ +void RadioPlayLogModel::removeAll() +{ + Q_D( RadioPlayLogModel ); + + beginRemoveRows( QModelIndex(), 0, rowCount() - 1 ); + + d->mItems.clear(); + + endRemoveRows(); +} + +/*! + * + */ +bool RadioPlayLogModel::isCurrentSongRecognized() const +{ + Q_D( const RadioPlayLogModel ); + return d->mTopItemIsPlaying; +} + +/*! + * + */ +void RadioPlayLogModel::addItem( const QString& artist, const QString& title ) +{ + Q_D( RadioPlayLogModel ); + + RadioPlayLogItem item; + const int itemIndex = findItem( artist, title, item ); + if ( itemIndex != -1 ) { + item.increasePlayCount(); + updateItem( itemIndex, item, true ); + } else { + item.setArtist( artist ); + item.setTitle( title ); + + beginInsertRows( QModelIndex(), 0, 0 ); + + d->mItems.prepend( item ); + + endInsertRows(); + } + + d->mTopItemIsPlaying = true; + emit itemAdded(); +} + +/*! + * + */ +void RadioPlayLogModel::clearRadioTextPlus() +{ + Q_D( RadioPlayLogModel ); + d->mRtItemHolder = ""; + resetCurrentSong(); +} + +/*! + * + */ +void RadioPlayLogModel::addRadioTextPlus( int rtClass, const QString& rtItem ) +{ + if ( rtClass == RtPlus::Artist || rtClass == RtPlus::Title ) { + Q_D( RadioPlayLogModel ); + if ( d->mRtItemHolder.isEmpty() ) { + d->mRtItemHolder = rtItem; + } else { + if ( rtClass == RtPlus::Title ) { + addItem( d->mRtItemHolder, rtItem ); + } else { + addItem( rtItem, d->mRtItemHolder ); + } + d->mRtItemHolder = ""; + } + } +} + +/*! + * + */ +int RadioPlayLogModel::findItem( const QString& artist, const QString& title, RadioPlayLogItem& item ) +{ + Q_D( RadioPlayLogModel ); + const int itemCount = d->mItems.count(); + for ( int i = 0; i < itemCount; ++i ) { + RadioPlayLogItem existingItem = d->mItems.at( i ); + if ( existingItem.artist().compare( artist ) == 0 + && existingItem.title().compare( title ) == 0 ) { + item = existingItem; + return i; + } + } + + return -1; +} + +/*! + * + */ +void RadioPlayLogModel::updateItem( int index, const RadioPlayLogItem& item, bool prepend ) +{ + Q_D( RadioPlayLogModel ); + d->mItems.removeAt( index ); + + if ( prepend ) { + d->mItems.prepend( item ); + } else { + d->mItems.insert( index, item ); + } +}