1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-08-10 16:14:40 +02:00

Handle changing the stations when they are running elegantly. Now they will just change what is upcoming,

rather than starting from scratch and being confusing
This commit is contained in:
Leo Franchi
2011-02-07 23:49:43 -05:00
parent 2987356410
commit 901a40a814
4 changed files with 33 additions and 15 deletions

View File

@@ -24,6 +24,7 @@ DynamicModel::DynamicModel( QObject* parent )
: PlaylistModel( parent ) : PlaylistModel( parent )
, m_startOnResolved( false ) , m_startOnResolved( false )
, m_onDemandRunning( false ) , m_onDemandRunning( false )
, m_changeOnNext( false )
, m_currentAttempts( 0 ) , m_currentAttempts( 0 )
, m_lastResolvedRow( 0 ) , m_lastResolvedRow( 0 )
{ {
@@ -84,6 +85,15 @@ DynamicModel::stopOnDemand()
disconnect( AudioEngine::instance(), SIGNAL( loading( Tomahawk::result_ptr ) ), this, SLOT( newTrackLoading() ) ); disconnect( AudioEngine::instance(), SIGNAL( loading( Tomahawk::result_ptr ) ), this, SLOT( newTrackLoading() ) );
} }
void
DynamicModel::changeStation()
{
if( m_onDemandRunning )
m_changeOnNext = true;
else // if we're not running, just start
m_playlist->generator()->startOnDemand();
}
void void
DynamicModel::trackResolved() DynamicModel::trackResolved()
@@ -121,7 +131,10 @@ DynamicModel::trackResolveFinished( bool success )
void void
DynamicModel::newTrackLoading() DynamicModel::newTrackLoading()
{ {
if( m_onDemandRunning && m_currentAttempts == 0 ) { // if we're in dynamic mode and we're also currently idle if( m_changeOnNext ) { // reset instead of getting the next one
m_lastResolvedRow = rowCount( QModelIndex() );
m_playlist->generator()->startOnDemand();
} else if( m_onDemandRunning && m_currentAttempts == 0 ) { // if we're in dynamic mode and we're also currently idle
m_lastResolvedRow = rowCount( QModelIndex() ); m_lastResolvedRow = rowCount( QModelIndex() );
m_playlist->generator()->fetchNext(); m_playlist->generator()->fetchNext();
} }

View File

@@ -38,6 +38,7 @@ public:
void startOnDemand(); void startOnDemand();
void stopOnDemand(); void stopOnDemand();
void changeStation();
void loadPlaylist( const dynplaylist_ptr& playlist ); void loadPlaylist( const dynplaylist_ptr& playlist );
@@ -58,6 +59,7 @@ private:
dynplaylist_ptr m_playlist; dynplaylist_ptr m_playlist;
bool m_startOnResolved; bool m_startOnResolved;
bool m_onDemandRunning; bool m_onDemandRunning;
bool m_changeOnNext;
int m_currentAttempts; int m_currentAttempts;
int m_lastResolvedRow; int m_lastResolvedRow;
}; };

View File

@@ -42,6 +42,7 @@ DynamicWidget::DynamicWidget( const Tomahawk::dynplaylist_ptr& playlist, QWidget
, m_resolveOnNextLoad( false ) , m_resolveOnNextLoad( false )
, m_seqRevLaunched( 0 ) , m_seqRevLaunched( 0 )
, m_runningOnDemand( false ) , m_runningOnDemand( false )
, m_controlsChanged( false )
, m_steering( 0 ) , m_steering( 0 )
, m_headerText( 0 ) , m_headerText( 0 )
, m_headerLayout( 0 ) , m_headerLayout( 0 )
@@ -123,15 +124,16 @@ DynamicWidget::loadDynamicPlaylist( const Tomahawk::dynplaylist_ptr& playlist )
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();
foreach( const dyncontrol_ptr& control, playlist->generator()->controls() ) {
qDebug() << "CONTROL:" << control->selectedType() << control->match() << control->input();
}
m_controls->setControls( m_playlist, m_playlist->author()->isLocal() ); m_controls->setControls( m_playlist, m_playlist->author()->isLocal() );
m_playlist = playlist; m_playlist = playlist;
m_view->setOnDemand( m_playlist->mode() == OnDemand );
if( !m_runningOnDemand ) {
m_model->loadPlaylist( m_playlist ); m_model->loadPlaylist( m_playlist );
} else if( !m_controlsChanged ) { // if the controls changed, we already dealt with that and don't want to change station yet
m_model->changeStation();
}
m_controlsChanged = false;
return; return;
} }
@@ -145,6 +147,7 @@ DynamicWidget::loadDynamicPlaylist( const Tomahawk::dynplaylist_ptr& playlist )
m_playlist = playlist; m_playlist = playlist;
m_view->setOnDemand( m_playlist->mode() == OnDemand ); m_view->setOnDemand( m_playlist->mode() == OnDemand );
m_model->loadPlaylist( m_playlist ); m_model->loadPlaylist( m_playlist );
m_controlsChanged = false;
if( !m_playlist.isNull() ) if( !m_playlist.isNull() )
m_controls->setControls( m_playlist, m_playlist->author()->isLocal() ); m_controls->setControls( m_playlist, m_playlist->author()->isLocal() );
@@ -277,9 +280,12 @@ DynamicWidget::tracksGenerated( const QList< query_ptr >& queries )
void void
DynamicWidget::controlsChanged() DynamicWidget::controlsChanged()
{ {
// if we're playing a station, stop it in either case // controlsChanged() is emitted when a control is added or removed
if( m_runningOnDemand ) // in the case of addition, it's blank by default... so to avoid an error
generateOrStart(); // as if the stop button were pressed // when playing a station just ignore it till we're ready and get a controlChanged()
/* if( m_runningOnDemand )
m_model->changeStation();*/
m_controlsChanged = true;
if( !m_playlist->author()->isLocal() ) if( !m_playlist->author()->isLocal() )
return; return;
@@ -290,10 +296,6 @@ 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
if( !m_playlist->author()->isLocal() ) if( !m_playlist->author()->isLocal() )
return; return;
m_playlist->createNewRevision(); m_playlist->createNewRevision();

View File

@@ -86,6 +86,7 @@ private:
// used in OnDemand mode // used in OnDemand mode
bool m_runningOnDemand; bool m_runningOnDemand;
bool m_controlsChanged;
QWidget* m_steering; QWidget* m_steering;
// layout and stuff // layout and stuff