1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-08-06 22:26:32 +02:00

better logic for clearing and reloading the playlist

This commit is contained in:
Leo Franchi
2011-02-06 20:05:20 -05:00
parent 1f169e0c24
commit 738d462545
6 changed files with 30 additions and 17 deletions

View File

@@ -46,7 +46,7 @@ DynamicModel::loadPlaylist( const Tomahawk::dynplaylist_ptr& playlist )
connect( m_playlist->generator().data(), SIGNAL( nextTrackGenerated( Tomahawk::query_ptr ) ), this, SLOT( newTrackGenerated( Tomahawk::query_ptr ) ) ); connect( m_playlist->generator().data(), SIGNAL( nextTrackGenerated( Tomahawk::query_ptr ) ), this, SLOT( newTrackGenerated( Tomahawk::query_ptr ) ) );
PlaylistModel::loadPlaylist( m_playlist ); PlaylistModel::loadPlaylist( m_playlist, m_onDemandRunning );
} }
void void
@@ -54,6 +54,9 @@ DynamicModel::startOnDemand()
{ {
connect( AudioEngine::instance(), SIGNAL( loading( Tomahawk::result_ptr ) ), this, SLOT( newTrackLoading() ) ); connect( AudioEngine::instance(), SIGNAL( loading( Tomahawk::result_ptr ) ), this, SLOT( newTrackLoading() ) );
// delete all the tracks
clear();
m_playlist->generator()->startOnDemand(); m_playlist->generator()->startOnDemand();
m_onDemandRunning = true; m_onDemandRunning = true;
@@ -79,8 +82,6 @@ DynamicModel::stopOnDemand()
m_onDemandRunning = false; m_onDemandRunning = false;
AudioEngine::instance()->stop(); AudioEngine::instance()->stop();
// delete all the tracks
clear();
disconnect( AudioEngine::instance(), SIGNAL( loading( Tomahawk::result_ptr ) ), this, SLOT( newTrackLoading() ) ); disconnect( AudioEngine::instance(), SIGNAL( loading( Tomahawk::result_ptr ) ), this, SLOT( newTrackLoading() ) );
} }
@@ -112,7 +113,7 @@ DynamicModel::trackResolveFinished( bool success )
if( m_currentAttempts < 30 ) { if( m_currentAttempts < 30 ) {
m_playlist->generator()->fetchNext(); m_playlist->generator()->fetchNext();
} else { } else {
emit trackGenerationFailure( tr( "Could not find a playable track.\n\nPlease change the filters and try again." ) ); emit trackGenerationFailure( tr( "Could not find a playable track.\n\nPlease change the filters or try again." ) );
} }
} }
} }

View File

@@ -48,7 +48,6 @@ EchonestFactory::typeSelectors() const
EchonestGenerator::EchonestGenerator ( QObject* parent ) EchonestGenerator::EchonestGenerator ( QObject* parent )
: GeneratorInterface ( parent ) : GeneratorInterface ( parent )
, m_dynPlaylist( new Echonest::DynamicPlaylist() ) , m_dynPlaylist( new Echonest::DynamicPlaylist() )
, m_steerer( 0 )
, m_steeredSinceLastTrack( false ) , m_steeredSinceLastTrack( false )
{ {
m_type = "echonest"; m_type = "echonest";
@@ -201,8 +200,8 @@ EchonestGenerator::dynamicFetched()
m_steerData.first = Echonest::DynamicPlaylist::Steer; m_steerData.first = Echonest::DynamicPlaylist::Steer;
m_steerData.second = QString(); m_steerData.second = QString();
if( m_steerer ) if( !m_steerer.isNull() )
m_steerer->resetSteering( true ); m_steerer.data()->resetSteering( true );
try try
{ {
@@ -289,14 +288,14 @@ EchonestGenerator::queryFromSong(const Echonest::Song& song)
QWidget* QWidget*
EchonestGenerator::steeringWidget() EchonestGenerator::steeringWidget()
{ {
if( !m_steerer ) { if( m_steerer.isNull() ) {
m_steerer = new EchonestSteerer(); m_steerer = QWeakPointer< EchonestSteerer >( new EchonestSteerer );
connect( m_steerer, SIGNAL( steerField( QString ) ), this, SLOT( steerField( QString ) ) ); connect( m_steerer.data(), SIGNAL( steerField( QString ) ), this, SLOT( steerField( QString ) ) );
connect( m_steerer, SIGNAL( steerDescription( QString ) ), this, SLOT( steerDescription( QString ) ) ); connect( m_steerer.data(), SIGNAL( steerDescription( QString ) ), this, SLOT( steerDescription( QString ) ) );
} }
return m_steerer; return m_steerer.data();
} }

View File

@@ -73,7 +73,7 @@ private:
Echonest::DynamicPlaylist* m_dynPlaylist; Echonest::DynamicPlaylist* m_dynPlaylist;
QPixmap m_logo; QPixmap m_logo;
EchonestSteerer* m_steerer; QWeakPointer<EchonestSteerer> m_steerer;
bool m_steeredSinceLastTrack; bool m_steeredSinceLastTrack;
Echonest::DynamicPlaylist::DynamicControl m_steerData; Echonest::DynamicPlaylist::DynamicControl m_steerData;
}; };

View File

@@ -118,11 +118,12 @@ DynamicWidget::loadDynamicPlaylist( const Tomahawk::dynplaylist_ptr& playlist )
return; return;
} }
m_seqRevLaunched = 0; m_seqRevLaunched = 0;
// if we're being told to load the same dynamic playlist over again, only do it if the controls have a different number // if we're being told to load the same dynamic playlist over again, only do it if the controls have a different number
if( !m_playlist.isNull() && ( m_playlist.data() == playlist.data() ) // same playlist pointer if( !m_playlist.isNull() && ( m_playlist.data() == playlist.data() ) // same playlist pointer
&& m_playlist->generator()->controls().size() == playlist->generator()->controls().size() ) { && m_playlist->generator()->controls().size() == playlist->generator()->controls().size() ) {
// we can skip our work. just let the dynamiccontrollist show the difference // we can skip our work. just let the dynamiccontrollist show the difference
qDebug() << "SKIPPING SETTING:" << playlist->generator()->controls().size(); // qDebug() << "SKIPPING SETTING:" << playlist->generator()->controls().size();
foreach( const dyncontrol_ptr& control, playlist->generator()->controls() ) { foreach( const dyncontrol_ptr& control, playlist->generator()->controls() ) {
qDebug() << "CONTROL:" << control->selectedType() << control->match() << control->input(); qDebug() << "CONTROL:" << control->selectedType() << control->match() << control->input();
} }
@@ -236,6 +237,7 @@ DynamicWidget::generateOrStart()
} else { // stop } else { // stop
m_model->stopOnDemand(); m_model->stopOnDemand();
m_runningOnDemand = false; m_runningOnDemand = false;
delete m_steering;
m_steering = 0; m_steering = 0;
m_generateButton->setText( tr( "Start" ) ); m_generateButton->setText( tr( "Start" ) );
} }
@@ -275,6 +277,10 @@ DynamicWidget::tracksGenerated( const QList< query_ptr >& queries )
void void
DynamicWidget::controlsChanged() DynamicWidget::controlsChanged()
{ {
// if we're playing a station, stop it in either case
if( m_runningOnDemand )
generateOrStart(); // as if the stop button were pressed
m_playlist->createNewRevision(); m_playlist->createNewRevision();
m_seqRevLaunched++; m_seqRevLaunched++;
} }
@@ -282,6 +288,10 @@ DynamicWidget::controlsChanged()
void void
DynamicWidget::controlChanged( const Tomahawk::dyncontrol_ptr& control ) DynamicWidget::controlChanged( const Tomahawk::dyncontrol_ptr& control )
{ {
// if we're playing a station, stop it in either case
if( m_runningOnDemand )
generateOrStart(); // as if the stop button were pressed
m_playlist->createNewRevision(); m_playlist->createNewRevision();
m_seqRevLaunched++; m_seqRevLaunched++;
} }

View File

@@ -50,12 +50,12 @@ PlaylistModel::headerData( int section, Qt::Orientation orientation, int role )
void void
PlaylistModel::loadPlaylist( const Tomahawk::playlist_ptr& playlist ) PlaylistModel::loadPlaylist( const Tomahawk::playlist_ptr& playlist, bool loadEntries )
{ {
if ( !m_playlist.isNull() ) if ( !m_playlist.isNull() )
disconnect( m_playlist.data(), SIGNAL( revisionLoaded( Tomahawk::PlaylistRevision ) ), this, SLOT( onRevisionLoaded( Tomahawk::PlaylistRevision ) ) ); disconnect( m_playlist.data(), SIGNAL( revisionLoaded( Tomahawk::PlaylistRevision ) ), this, SLOT( onRevisionLoaded( Tomahawk::PlaylistRevision ) ) );
if ( rowCount( QModelIndex() ) ) if ( rowCount( QModelIndex() ) && loadEntries )
{ {
emit beginRemoveRows( QModelIndex(), 0, rowCount( QModelIndex() ) - 1 ); emit beginRemoveRows( QModelIndex(), 0, rowCount( QModelIndex() ) - 1 );
delete m_rootItem; delete m_rootItem;
@@ -68,6 +68,9 @@ PlaylistModel::loadPlaylist( const Tomahawk::playlist_ptr& playlist )
setReadOnly( !m_playlist->author()->isLocal() ); setReadOnly( !m_playlist->author()->isLocal() );
if( !loadEntries )
return;
PlItem* plitem; PlItem* plitem;
QList<plentry_ptr> entries = playlist->entries(); QList<plentry_ptr> entries = playlist->entries();
if ( entries.count() ) if ( entries.count() )

View File

@@ -33,7 +33,7 @@ public:
Tomahawk::playlist_ptr playlist() const { return m_playlist; } Tomahawk::playlist_ptr playlist() const { return m_playlist; }
void loadPlaylist( const Tomahawk::playlist_ptr& playlist ); void loadPlaylist( const Tomahawk::playlist_ptr& playlist, bool loadEntries = true );
void loadHistory( const Tomahawk::source_ptr& source, unsigned int amount = 100 ); void loadHistory( const Tomahawk::source_ptr& source, unsigned int amount = 100 );
void clear(); void clear();