1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-03-23 01:09:42 +01:00

* ModelMode specific AlbumPlaylistInterfaces.

This commit is contained in:
Christian Muehlhaeuser 2012-05-18 12:13:23 +02:00
parent 2d34a69e0c
commit ee7986180f
2 changed files with 167 additions and 13 deletions

View File

@ -23,7 +23,10 @@
#include "database/Database.h"
#include "database/DatabaseImpl.h"
#include "database/DatabaseCommand_AllTracks.h"
#include "Pipeline.h"
#include "Query.h"
#include "Source.h"
#include "SourceList.h"
#include "utils/Logger.h"
@ -31,10 +34,14 @@ using namespace Tomahawk;
AlbumPlaylistInterface::AlbumPlaylistInterface() {}
AlbumPlaylistInterface::AlbumPlaylistInterface( Tomahawk::Album *album )
AlbumPlaylistInterface::AlbumPlaylistInterface( Tomahawk::Album* album, Tomahawk::ModelMode mode, const Tomahawk::collection_ptr& collection )
: Tomahawk::PlaylistInterface()
, m_currentItem( 0 )
, m_currentTrack( 0 )
, m_infoSystemLoaded( false )
, m_databaseLoaded( false )
, m_mode( mode )
, m_collection( collection )
, m_album( QWeakPointer< Tomahawk::Album >( album ) )
{
}
@ -88,15 +95,35 @@ AlbumPlaylistInterface::tracks()
{
if ( m_queries.isEmpty() && m_album )
{
DatabaseCommand_AllTracks* cmd = new DatabaseCommand_AllTracks();
cmd->setAlbum( m_album );
cmd->setSortOrder( DatabaseCommand_AllTracks::AlbumPosition );
//this takes discnumber into account as well
if ( ( m_mode == Mixed || m_mode == InfoSystemMode ) && !m_infoSystemLoaded )
{
Tomahawk::InfoSystem::InfoStringHash artistInfo;
artistInfo["artist"] = m_album.data()->artist()->name();
artistInfo["album"] = m_album.data()->name();
connect( cmd, SIGNAL( tracks( QList<Tomahawk::query_ptr>, QVariant ) ),
m_album.data(), SLOT( onTracksAdded( QList<Tomahawk::query_ptr> ) ) );
Tomahawk::InfoSystem::InfoRequestData requestData;
requestData.caller = uuid();
requestData.input = QVariant::fromValue< Tomahawk::InfoSystem::InfoStringHash >( artistInfo );
requestData.type = Tomahawk::InfoSystem::InfoAlbumSongs;
requestData.timeoutMillis = 0;
requestData.allSources = true;
Tomahawk::InfoSystem::InfoSystem::instance()->getInfo( requestData );
Database::instance()->enqueue( QSharedPointer<DatabaseCommand>( cmd ) );
connect( Tomahawk::InfoSystem::InfoSystem::instance(),
SIGNAL( info( Tomahawk::InfoSystem::InfoRequestData, QVariant ) ),
SLOT( infoSystemInfo( Tomahawk::InfoSystem::InfoRequestData, QVariant ) ) );
}
else if ( m_mode == DatabaseMode && !m_databaseLoaded )
{
DatabaseCommand_AllTracks* cmd = new DatabaseCommand_AllTracks( m_collection );
cmd->setAlbum( m_album );
cmd->setSortOrder( DatabaseCommand_AllTracks::AlbumPosition );
connect( cmd, SIGNAL( tracks( QList<Tomahawk::query_ptr>, QVariant ) ),
SLOT( onTracksLoaded( QList<Tomahawk::query_ptr> ) ) );
Database::instance()->enqueue( QSharedPointer<DatabaseCommand>( cmd ) );
}
}
return m_queries;
@ -104,7 +131,121 @@ AlbumPlaylistInterface::tracks()
void
AlbumPlaylistInterface::addQueries( const QList< query_ptr >& tracks )
AlbumPlaylistInterface::infoSystemInfo( Tomahawk::InfoSystem::InfoRequestData requestData, QVariant output )
{
m_queries << tracks;
switch ( requestData.type )
{
case Tomahawk::InfoSystem::InfoAlbumSongs:
{
QVariantMap returnedData = output.value< QVariantMap >();
if ( !returnedData.isEmpty() )
{
Tomahawk::InfoSystem::InfoStringHash inputInfo;
inputInfo = requestData.input.value< Tomahawk::InfoSystem::InfoStringHash >();
QStringList tracks = returnedData[ "tracks" ].toStringList();
QList<query_ptr> ql;
//TODO: Figure out how to do this with a multi-disk album without breaking the
// current behaviour. I just know too little about InfoSystem to deal with
// it right now, I've only taken the liberty of adding Query::setDiscNumber
// which should make this easier. --Teo 11/2011
unsigned int trackNo = 1;
foreach ( const QString& trackName, tracks )
{
query_ptr query = Query::get( inputInfo[ "artist" ], trackName, inputInfo[ "album" ] );
query->setAlbumPos( trackNo++ );
ql << query;
tDebug() << Q_FUNC_INFO << query->toString();
}
Pipeline::instance()->resolve( ql );
m_queries << ql;
}
break;
}
default:
{
Q_ASSERT( false );
break;
}
}
m_infoSystemLoaded = true;
disconnect( Tomahawk::InfoSystem::InfoSystem::instance(), SIGNAL( info( Tomahawk::InfoSystem::InfoRequestData, QVariant ) ),
this, SLOT( infoSystemInfo( Tomahawk::InfoSystem::InfoRequestData, QVariant ) ) );
if ( m_queries.isEmpty() && m_mode == Mixed )
{
DatabaseCommand_AllTracks* cmd = new DatabaseCommand_AllTracks( m_collection );
cmd->setAlbum( m_album );
//this takes discnumber into account as well
cmd->setSortOrder( DatabaseCommand_AllTracks::AlbumPosition );
connect( cmd, SIGNAL( tracks( QList<Tomahawk::query_ptr>, QVariant ) ),
SLOT( onTracksLoaded( QList<Tomahawk::query_ptr> ) ) );
Database::instance()->enqueue( QSharedPointer<DatabaseCommand>( cmd ) );
}
else
{
emit tracksLoaded( m_mode, m_collection );
}
}
void
AlbumPlaylistInterface::onTracksLoaded( const QList< query_ptr >& tracks )
{
m_databaseLoaded = true;
if ( m_collection.isNull() )
m_queries << filterTracks( tracks );
else
m_queries << tracks;
emit tracksLoaded( m_mode, m_collection );
}
QList<Tomahawk::query_ptr>
AlbumPlaylistInterface::filterTracks( const QList<Tomahawk::query_ptr>& queries )
{
QList<Tomahawk::query_ptr> result;
for ( int i = 0; i < queries.count(); i++ )
{
bool picked = true;
const query_ptr q1 = queries.at( i );
for ( int j = 0; j < result.count(); j++ )
{
if ( !picked )
break;
const query_ptr& q2 = result.at( j );
if ( q1->track() == q2->track() )
{
picked = false;
}
}
if ( picked )
{
query_ptr q = Query::get( q1->artist(), q1->track(), q1->album(), uuid(), true );
q->setAlbumPos( q1->results().first()->albumpos() );
q->setDiscNumber( q1->discnumber() );
result << q;
}
}
foreach ( const query_ptr& q, result )
{
tDebug() << q->albumpos() << q->track();
}
return result;
}

View File

@ -26,6 +26,7 @@
#include "Album.h"
#include "Typedefs.h"
#include "PlaylistInterface.h"
#include "infosystem/InfoSystem.h"
#include "DllMacro.h"
namespace Tomahawk
@ -36,7 +37,7 @@ class DLLEXPORT AlbumPlaylistInterface : public Tomahawk::PlaylistInterface
Q_OBJECT
public:
AlbumPlaylistInterface( Tomahawk::Album *album );
AlbumPlaylistInterface( Tomahawk::Album* album, Tomahawk::ModelMode mode, const Tomahawk::collection_ptr& collection );
virtual ~AlbumPlaylistInterface();
QList<Tomahawk::query_ptr> tracks();
@ -57,8 +58,6 @@ public:
virtual void setFilter( const QString& /*pattern*/ ) {}
virtual void addQueries( const QList<Tomahawk::query_ptr>& tracks );
signals:
void repeatModeChanged( Tomahawk::PlaylistInterface::RepeatMode mode );
void shuffleModeChanged( bool enabled );
@ -68,12 +67,26 @@ signals:
void nextTrackReady();
void tracksLoaded( Tomahawk::ModelMode mode, const Tomahawk::collection_ptr& collection );
private slots:
void onTracksLoaded( const QList< Tomahawk::query_ptr >& tracks );
void infoSystemInfo( Tomahawk::InfoSystem::InfoRequestData requestData, QVariant output );
private:
AlbumPlaylistInterface();
QList<Tomahawk::query_ptr> filterTracks( const QList<Tomahawk::query_ptr>& queries );
QList< Tomahawk::query_ptr > m_queries;
result_ptr m_currentItem;
unsigned int m_currentTrack;
bool m_infoSystemLoaded;
bool m_databaseLoaded;
Tomahawk::ModelMode m_mode;
Tomahawk::collection_ptr m_collection;
QWeakPointer< Tomahawk::Album > m_album;
};