diff --git a/src/libtomahawk/playlist/dynamic/echonest/EchonestControl.cpp b/src/libtomahawk/playlist/dynamic/echonest/EchonestControl.cpp index d73b1194c..c65596ede 100644 --- a/src/libtomahawk/playlist/dynamic/echonest/EchonestControl.cpp +++ b/src/libtomahawk/playlist/dynamic/echonest/EchonestControl.cpp @@ -160,12 +160,44 @@ Tomahawk::EchonestControl::updateWidgets() input->hide(); m_match = QWeakPointer< QWidget >( match ); m_input = QWeakPointer< QWidget >( input ); + } else if( selectedType() == "Tempo" ) { + m_currentType = Echonest::DynamicPlaylist::MinTempo; + + setupMinMaxWidgets( Echonest::DynamicPlaylist::MinTempo, Echonest::DynamicPlaylist::MaxTempo, tr( "0 BPM" ), tr( "500 BPM" ), 500 ); } else { m_match = QWeakPointer( new QWidget ); m_input = QWeakPointer( new QWidget ); } } +void +Tomahawk::EchonestControl::setupMinMaxWidgets( Echonest::DynamicPlaylist::PlaylistParam min, Echonest::DynamicPlaylist::PlaylistParam max, const QString& leftL, const QString& rightL, int maxRange ) +{ + QComboBox* match = new QComboBox; + match->addItem( "At Least", min ); + match->addItem( "At Most", max ); + + LabeledSlider* input = new LabeledSlider( leftL, rightL ); + input->slider()->setRange( 0, maxRange ); + input->slider()->setTickInterval( 1 ); + input->slider()->setTracking( false ); + input->slider()->setTickPosition( QSlider::TicksBelow ); + + m_matchString = match->currentText(); + m_matchData = match->itemData( match->currentIndex() ).toString(); + + + connect( input->slider(), SIGNAL( valueChanged( int ) ), this, SLOT( updateData() ) ); + connect( input->slider(), SIGNAL( sliderMoved( int ) ), this, SLOT( editingFinished() ) ); + connect( input->slider(), SIGNAL( sliderMoved( int ) ), &m_editingTimer, SLOT( stop() ) ); + + match->hide(); + input->hide(); + m_match = QWeakPointer< QWidget >( match ); + m_input = QWeakPointer< QWidget >( input ); +} + + void Tomahawk::EchonestControl::updateData() { @@ -190,9 +222,27 @@ Tomahawk::EchonestControl::updateData() m_data.first = m_currentType; m_data.second = (qreal)s->slider()->value() / 10000.0; } + } else if( selectedType() == "Tempo" ) { + updateFromComboAndSlider(); } } +void +Tomahawk::EchonestControl::updateFromComboAndSlider() +{ + QComboBox* combo = qobject_cast( m_match.data() ); + if( combo ) { + m_matchString = combo->currentText(); + m_matchData = combo->itemData( combo->currentIndex() ).toString(); + } + LabeledSlider* ls = qobject_cast( m_input.data() ); + if( ls && ls->slider() ) { + m_data.first = static_cast< Echonest::DynamicPlaylist::PlaylistParam >( combo->itemData( combo->currentIndex() ).toInt() ); + m_data.second = ls->slider()->value(); + } +} + + // fills in the current widget with the data from json or dbcmd (m_data.second and m_matchData) void Tomahawk::EchonestControl::updateWidgetsFromData() @@ -208,9 +258,23 @@ Tomahawk::EchonestControl::updateWidgetsFromData() LabeledSlider* s = qobject_cast( m_input.data() ); if( s ) s->slider()->setValue( m_data.second.toDouble() * 10000 ); + } else if( selectedType() == "Tempo" ) { + updateToComboAndSlider(); } } +void +Tomahawk::EchonestControl::updateToComboAndSlider() +{ + QComboBox* combo = qobject_cast( m_match.data() ); + if( combo ) + combo->setCurrentIndex( combo->findData( m_matchData ) ); + LabeledSlider* ls = qobject_cast( m_input.data() ); + if( ls ) + ls->slider()->setValue( m_data.second.toDouble() ); +} + + void Tomahawk::EchonestControl::editingFinished() { diff --git a/src/libtomahawk/playlist/dynamic/echonest/EchonestControl.h b/src/libtomahawk/playlist/dynamic/echonest/EchonestControl.h index 07ac91d70..a3077f2cd 100644 --- a/src/libtomahawk/playlist/dynamic/echonest/EchonestControl.h +++ b/src/libtomahawk/playlist/dynamic/echonest/EchonestControl.h @@ -56,6 +56,11 @@ private: void updateWidgets(); void updateWidgetsFromData(); + // utility + void setupMinMaxWidgets( Echonest::DynamicPlaylist::PlaylistParam min, Echonest::DynamicPlaylist::PlaylistParam max, const QString& leftL, const QString& rightL, int maxRange ); + void updateFromComboAndSlider(); + void updateToComboAndSlider(); + Echonest::DynamicPlaylist::PlaylistParam m_currentType; int m_overrideType; diff --git a/src/libtomahawk/playlist/dynamic/echonest/EchonestGenerator.cpp b/src/libtomahawk/playlist/dynamic/echonest/EchonestGenerator.cpp index c91be71cc..bc20767f7 100644 --- a/src/libtomahawk/playlist/dynamic/echonest/EchonestGenerator.cpp +++ b/src/libtomahawk/playlist/dynamic/echonest/EchonestGenerator.cpp @@ -39,7 +39,7 @@ EchonestFactory::createControl( const QString& controlType ) QStringList EchonestFactory::typeSelectors() const { - return QStringList() << "Artist" << "Variety" << "Description" << "Tempo" << "Duration" << "Loudness" + return QStringList() << "Artist" << "Variety" << "Tempo" << "Duration" << "Loudness" << "Danceability" << "Energy" << "Artist Familiarity" << "Artist Hotttnesss" << "Song Familiarity" << "Longitude" << "Latitude" << "Mode" << "Key" << "Sorting"; }