From f78874f67171a15b047592d13c55876b854a17ee Mon Sep 17 00:00:00 2001 From: Leo Franchi Date: Tue, 25 Jan 2011 18:55:15 -0500 Subject: [PATCH] refactor the generator a bit to share code update the data in the echonest control when changing type --- .../dynamic/echonest/EchonestControl.cpp | 2 + .../dynamic/echonest/EchonestGenerator.cpp | 71 ++++++++++--------- .../dynamic/echonest/EchonestGenerator.h | 3 +- .../dynamic/widgets/DynamicControlList.cpp | 2 +- .../dynamic/widgets/DynamicWidget.cpp | 4 ++ 5 files changed, 45 insertions(+), 37 deletions(-) diff --git a/src/libtomahawk/playlist/dynamic/echonest/EchonestControl.cpp b/src/libtomahawk/playlist/dynamic/echonest/EchonestControl.cpp index 70a4f93cd..84e4d675b 100644 --- a/src/libtomahawk/playlist/dynamic/echonest/EchonestControl.cpp +++ b/src/libtomahawk/playlist/dynamic/echonest/EchonestControl.cpp @@ -60,6 +60,8 @@ Tomahawk::EchonestControl::setSelectedType ( const QString& type ) Tomahawk::DynamicControl::setSelectedType ( type ); updateWidgets(); + updateData(); + qDebug() << "Setting new type, set data to:" << m_data.first << m_data.second; } } diff --git a/src/libtomahawk/playlist/dynamic/echonest/EchonestGenerator.cpp b/src/libtomahawk/playlist/dynamic/echonest/EchonestGenerator.cpp index 4f0cb374b..f5366c197 100644 --- a/src/libtomahawk/playlist/dynamic/echonest/EchonestGenerator.cpp +++ b/src/libtomahawk/playlist/dynamic/echonest/EchonestGenerator.cpp @@ -76,6 +76,11 @@ void EchonestGenerator::generate ( int number ) { // convert to an echonest query, and fire it off + qDebug() << Q_FUNC_INFO; + qDebug() << "Generating playlist with " << m_controls.size(); + foreach( const dyncontrol_ptr& ctrl, m_controls ) + qDebug() << ctrl->selectedType() << ctrl->match() << ctrl->input(); + try { Echonest::DynamicPlaylist::PlaylistParams params = getParams(); @@ -153,7 +158,7 @@ EchonestGenerator::getParams() const throw( std::runtime_error ) foreach( const dyncontrol_ptr& control, m_controls ) { params.append( control.dynamicCast()->toENParam() ); } - params.append( Echonest::DynamicPlaylist::PlaylistParamData( Echonest::DynamicPlaylist::Type, determineRadioType() ) ); + appendRadioType( params ); return params; } @@ -193,50 +198,46 @@ EchonestGenerator::dynamicFetched() } } +bool +EchonestGenerator::onlyThisArtistType( Echonest::DynamicPlaylist::ArtistTypeEnum type ) const throw( std::runtime_error ) +{ + bool only = true; + bool some = false; + + foreach( const dyncontrol_ptr& control, m_controls ) { + if( control->selectedType() == "Artist" && static_cast( control->match().toInt() ) != type ) { + only = false; + } else if( control->selectedType() == "Artist" && static_cast( control->match().toInt() ) == type ) { + some = true; + } + } + if( some && only ) { + return true; + } else if( some && !only ) { + throw std::runtime_error( "All artist match types must be the same" ); + } + + return false; +} -Echonest::DynamicPlaylist::ArtistTypeEnum -EchonestGenerator::determineRadioType() const throw( std::runtime_error ) +void +EchonestGenerator::appendRadioType( Echonest::DynamicPlaylist::PlaylistParams& params ) const throw( std::runtime_error ) { /** * so we try to match the best type of echonest playlist, based on the controls * the types are artist, artist-radio, artist-description, catalog, catalog-radio, song-radio. we don't care about the catalog ones. * - * Fallback is artist-radio */ /// 1. artist: If all the artist controls are Limit-To. If some were but not all, error out. - bool artistOnly = true; - bool someArtist = false; - foreach( const dyncontrol_ptr& control, m_controls ) { - if( control->selectedType() == "Artist" && static_cast( control->match().toInt() ) != Echonest::DynamicPlaylist::ArtistType ) { - artistOnly = false; - } else if( control->selectedType() == "Artist" && static_cast( control->match().toInt() ) == Echonest::DynamicPlaylist::ArtistType ) { - someArtist = true; - } - } - if( someArtist && artistOnly ) { - return Echonest::DynamicPlaylist::ArtistType; - } else if( someArtist && !artistOnly ) { - throw std::runtime_error( "All artist match types must be the same" ); - } - /// 2. artist-description: If all the artist entries are Description. If some were but not all, error out. - bool artistDescOnly = true; - bool someArtistDescFound = false; - - foreach( const dyncontrol_ptr& control, m_controls ) { - if( control->selectedType() == "Artist" && static_cast( control->match().toInt() ) == Echonest::DynamicPlaylist::ArtistDescriptionType ) { - someArtistDescFound = true; - } else if( control->selectedType() == "Artist" && static_cast( control->match().toInt() ) != Echonest::DynamicPlaylist::ArtistDescriptionType ) { - artistDescOnly = false; - } - } - if( someArtistDescFound && artistDescOnly ) { - return Echonest::DynamicPlaylist::ArtistDescriptionType; - } else if( someArtistDescFound && !artistDescOnly ) // fail, must be all artist desc - throw std::runtime_error( "All artist match types must be the same" ); - - return Echonest::DynamicPlaylist::ArtistRadioType; + /// 3. Artist-Radio: If all the artist entries are Similar To. If some were but not all, error out. + if( onlyThisArtistType( Echonest::DynamicPlaylist::ArtistType ) ) + params.append( Echonest::DynamicPlaylist::PlaylistParamData( Echonest::DynamicPlaylist::Type, Echonest::DynamicPlaylist::ArtistType ) ); + else if( onlyThisArtistType( Echonest::DynamicPlaylist::ArtistDescriptionType ) ) + params.append( Echonest::DynamicPlaylist::PlaylistParamData( Echonest::DynamicPlaylist::Type, Echonest::DynamicPlaylist::ArtistDescriptionType ) ); + else if( onlyThisArtistType( Echonest::DynamicPlaylist::ArtistRadioType ) ) + params.append( Echonest::DynamicPlaylist::PlaylistParamData( Echonest::DynamicPlaylist::Type, Echonest::DynamicPlaylist::ArtistRadioType ) ); } query_ptr diff --git a/src/libtomahawk/playlist/dynamic/echonest/EchonestGenerator.h b/src/libtomahawk/playlist/dynamic/echonest/EchonestGenerator.h index 93d49e500..e941551f9 100644 --- a/src/libtomahawk/playlist/dynamic/echonest/EchonestGenerator.h +++ b/src/libtomahawk/playlist/dynamic/echonest/EchonestGenerator.h @@ -58,7 +58,8 @@ private slots: private: Echonest::DynamicPlaylist::PlaylistParams getParams() const throw( std::runtime_error ); query_ptr queryFromSong( const Echonest::Song& song ); - Echonest::DynamicPlaylist::ArtistTypeEnum determineRadioType() const throw( std::runtime_error ); + void appendRadioType( Echonest::DynamicPlaylist::PlaylistParams& params ) const throw( std::runtime_error ); + bool onlyThisArtistType( Echonest::DynamicPlaylist::ArtistTypeEnum type ) const throw( std::runtime_error ); Echonest::DynamicPlaylist* m_dynPlaylist; QPixmap m_logo; diff --git a/src/libtomahawk/playlist/dynamic/widgets/DynamicControlList.cpp b/src/libtomahawk/playlist/dynamic/widgets/DynamicControlList.cpp index 7f8cbcb90..3f7df374a 100644 --- a/src/libtomahawk/playlist/dynamic/widgets/DynamicControlList.cpp +++ b/src/libtomahawk/playlist/dynamic/widgets/DynamicControlList.cpp @@ -63,7 +63,7 @@ DynamicControlList::init() setLayout( m_layout ); m_layout->setColumnStretch( 2, 1 ); m_layout->setMargin( 0 ); - m_layout->setSpacing( 0 ); + m_layout->setVerticalSpacing( 0 ); m_layout->setContentsMargins( 0, 0, 0, 0 ); m_layout->setSizeConstraint( QLayout::SetMinimumSize ); diff --git a/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.cpp b/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.cpp index 553d688da..d7499f0e4 100644 --- a/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.cpp +++ b/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.cpp @@ -114,6 +114,10 @@ DynamicWidget::loadDynamicPlaylist( const Tomahawk::dynplaylist_ptr& playlist ) if( !m_playlist.isNull() && ( m_playlist.data() == playlist.data() ) // same playlist pointer && m_playlist->generator()->controls().size() == playlist->generator()->controls().size() ) { // 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->generator(), m_playlist->generator()->controls(), m_playlist->author()->isLocal() ); m_playlist = playlist;