diff --git a/src/libtomahawk/playlist/dynamic/GeneratorInterface.h b/src/libtomahawk/playlist/dynamic/GeneratorInterface.h index 3f7d11873..8cc620bfd 100644 --- a/src/libtomahawk/playlist/dynamic/GeneratorInterface.h +++ b/src/libtomahawk/playlist/dynamic/GeneratorInterface.h @@ -102,6 +102,10 @@ public: * If this generator doesn't support this (and returns false for * \c onDemandSteerable) this will be null. The generator is responsible * for reacting to changes in the widget. + * + * Steering widgets may emit a \c steeringChanged() signal, which will cause the model to toss any + * upcoming tracks and re-fetch them. + * */ virtual QWidget* steeringWidget() { return 0; } diff --git a/src/libtomahawk/playlist/dynamic/echonest/EchonestSteerer.cpp b/src/libtomahawk/playlist/dynamic/echonest/EchonestSteerer.cpp index 4b11f2d80..683b097a0 100644 --- a/src/libtomahawk/playlist/dynamic/echonest/EchonestSteerer.cpp +++ b/src/libtomahawk/playlist/dynamic/echonest/EchonestSteerer.cpp @@ -218,6 +218,8 @@ EchonestSteerer::applySteering() } } + emit steeringChanged(); + resetSteering( true ); } diff --git a/src/libtomahawk/playlist/dynamic/echonest/EchonestSteerer.h b/src/libtomahawk/playlist/dynamic/echonest/EchonestSteerer.h index d1786d209..2b42c5ca0 100644 --- a/src/libtomahawk/playlist/dynamic/echonest/EchonestSteerer.h +++ b/src/libtomahawk/playlist/dynamic/echonest/EchonestSteerer.h @@ -57,6 +57,9 @@ signals: void reset(); void resized(); + + // interface to DynamicWidget + void steeringChanged(); private slots: void changed(); diff --git a/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.cpp b/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.cpp index 4482a2389..7f7224d8f 100644 --- a/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.cpp +++ b/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.cpp @@ -324,6 +324,8 @@ DynamicWidget::startStation() m_steering = m_playlist->generator()->steeringWidget(); Q_ASSERT( m_steering ); + connect( m_steering, SIGNAL( steeringChanged() ), this, SLOT( steeringChanged() ) ); + int x = ( width() / 2 ) - ( m_steering->size().width() / 2 ); int y = height() - m_steering->size().height() - 40; // padding @@ -394,6 +396,25 @@ DynamicWidget::controlChanged( const Tomahawk::dyncontrol_ptr& control ) emit descriptionChanged( m_playlist->generator()->sentenceSummary() ); } +void +DynamicWidget::steeringChanged() +{ + // When steering changes, toss all the tracks that are upcoming, and re-fetch. + QModelIndex cur = m_view->currentIndex(); + const int upcoming = m_view->proxyModel()->rowCount( QModelIndex() ) - 1 - cur.row(); + tDebug() << "Removing tracks after current in station, found" << upcoming; + + QModelIndexList toRemove; + for ( int i = cur.row() + 1; i < m_view->proxyModel()->rowCount( QModelIndex() ); i++ ) + { + toRemove << m_view->proxyModel()->index( i, 0, QModelIndex() ); + } + + m_view->proxyModel()->removeIndexes( toRemove ); + + m_playlist->generator()->fetchNext(); +} + void DynamicWidget::showPreview() diff --git a/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.h b/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.h index 8715aa84a..659e42963 100644 --- a/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.h +++ b/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.h @@ -103,6 +103,7 @@ private slots: void controlsChanged( bool added ); void controlChanged( const Tomahawk::dyncontrol_ptr& control ); + void steeringChanged(); void showPreview(); void layoutFloatingWidgets();