QMimeData* TrackModel::mimeData( const QModelIndexList &indexes ) const { qDebug() << Q_FUNC_INFO; QByteArray queryData; QDataStream queryStream( &queryData, QIODevice::WriteOnly ); foreach ( const QModelIndex& i, indexes ) { if ( i.column() > 0 ) continue; QModelIndex idx = index( i.row(), 0, i.parent() ); PlItem* item = itemFromIndex( idx ); if ( item ) { const query_ptr& query = item->query(); queryStream << qlonglong( &query ); } } QMimeData* mimeData = new QMimeData(); mimeData->setData( "application/tomahawk.query.list", queryData ); return mimeData; }
QList< Tomahawk::query_ptr > TrackProxyModel::tracks() { QList<Tomahawk::query_ptr> queries; for ( int i = 0; i < rowCount( QModelIndex() ); i++ ) { PlItem* item = itemFromIndex( mapToSource( index( i, 0 ) ) ); if ( item ) queries << item->query(); } return queries; }
bool TrackProxyModel::filterAcceptsRow( int sourceRow, const QModelIndex& sourceParent ) const { PlItem* pi = itemFromIndex( sourceModel()->index( sourceRow, 0, sourceParent ) ); if ( !pi ) return false; const Tomahawk::query_ptr& q = pi->query(); Tomahawk::result_ptr r; if ( q->numResults() ) r = q->results().first(); // if ( !r.isNull() && !r->collection()->source()->isOnline() ) // return false; if ( filterRegExp().isEmpty() ) return true; QStringList sl = filterRegExp().pattern().split( " ", QString::SkipEmptyParts ); foreach( QString s, sl ) { s = s.toLower(); if ( !r.isNull() ) { if ( !r->artist()->name().toLower().contains( s ) && !r->album()->name().toLower().contains( s ) && !r->track().toLower().contains( s ) ) { return false; } } else { if ( !q->artist().toLower().contains( s ) && !q->album().toLower().contains( s ) && !q->track().toLower().contains( s ) ) { return false; } } }
void TrackModel::setCurrentItem( const QModelIndex& index ) { qDebug() << Q_FUNC_INFO; PlItem* oldEntry = itemFromIndex( m_currentIndex ); if ( oldEntry ) { oldEntry->setIsPlaying( false ); } PlItem* entry = itemFromIndex( index ); if ( entry ) { m_currentIndex = index; entry->setIsPlaying( true ); } else { m_currentIndex = QModelIndex(); } }
Tomahawk::result_ptr TrackProxyModel::siblingItem( int itemsAway ) { qDebug() << Q_FUNC_INFO; QModelIndex idx = index( 0, 0 ); if( rowCount() ) { if ( m_shuffled ) { // random mode is enabled // TODO come up with a clever random logic, that keeps track of previously played items idx = index( qrand() % rowCount(), 0 ); } else if ( currentItem().isValid() ) { idx = currentItem(); // random mode is disabled if ( m_repeatMode == PlaylistInterface::RepeatOne ) { // repeat one track idx = index( idx.row(), 0 ); } else { // keep progressing through the playlist normally idx = index( idx.row() + itemsAway, 0 ); } } } if ( !idx.isValid() && m_repeatMode == PlaylistInterface::RepeatAll ) { // repeat all tracks if ( itemsAway > 0 ) { // reset to first item idx = index( 0, 0 ); } else { // reset to last item idx = index( rowCount() - 1, 0 ); } } // Try to find the next available PlaylistItem (with results) if ( idx.isValid() ) do { PlItem* item = itemFromIndex( mapToSource( idx ) ); qDebug() << item->query()->toString(); if ( item && item->query()->solved() ) { qDebug() << "Next PlaylistItem found:" << item->query()->toString() << item->query()->results().at( 0 )->url(); setCurrentItem( idx ); return item->query()->results().at( 0 ); } idx = index( idx.row() + ( itemsAway > 0 ? 1 : -1 ), 0 ); } while ( idx.isValid() ); setCurrentItem( QModelIndex() ); return Tomahawk::result_ptr(); }
QVariant TrackModel::data( const QModelIndex& index, int role ) const { PlItem* entry = itemFromIndex( index ); if ( !entry ) return QVariant(); if ( role == Qt::DecorationRole ) { return QVariant(); } if ( role == Qt::SizeHintRole ) { return QSize( 0, 18 ); } if ( role != Qt::DisplayRole ) // && role != Qt::ToolTipRole ) return QVariant(); const query_ptr& query = entry->query(); if ( query.isNull() ) { if ( !index.column() ) { return entry->caption.isEmpty() ? "Unknown" : entry->caption; } if ( index.column() == 1 ) { return entry->childCount; } return QVariant( "" ); } if ( !query->numResults() ) { switch( index.column() ) { case Artist: return query->artist(); break; case Track: return query->track(); break; case Album: return query->album(); break; } } else { switch( index.column() ) { case Artist: return query->results().first()->artist()->name(); break; case Track: return query->results().first()->track(); break; case Album: return query->results().first()->album()->name(); break; case Duration: return TomahawkUtils::timeToString( query->results().first()->duration() ); break; case Bitrate: return query->results().first()->bitrate(); break; case Age: return TomahawkUtils::ageToString( QDateTime::fromTime_t( query->results().first()->modificationTime() ) ); break; case Year: return query->results().first()->year(); break; case Filesize: return TomahawkUtils::filesizeToString( query->results().first()->size() ); break; case Origin: return query->results().first()->friendlySource(); break; } } return QVariant(); }