From 8e519534277478b787ceb9626ed6aab3b88eec22 Mon Sep 17 00:00:00 2001 From: Leo Franchi Date: Sun, 31 Jul 2011 11:44:23 -0400 Subject: [PATCH] Switch to using direct GenericSelect command --- src/libtomahawk/playlist/albummodel.cpp | 15 +- src/libtomahawk/playlist/albummodel.h | 5 +- .../widgets/SocialPlaylistWidget.cpp | 151 ++++++++++-------- .../widgets/SocialPlaylistWidget.h | 20 +-- .../widgets/SocialPlaylistWidget.ui | 85 ++++++++-- 5 files changed, 178 insertions(+), 98 deletions(-) diff --git a/src/libtomahawk/playlist/albummodel.cpp b/src/libtomahawk/playlist/albummodel.cpp index 1d215040d..972ac372f 100644 --- a/src/libtomahawk/playlist/albummodel.cpp +++ b/src/libtomahawk/playlist/albummodel.cpp @@ -244,7 +244,7 @@ AlbumModel::addCollection( const collection_ptr& collection ) DatabaseCommand_AllAlbums* cmd = new DatabaseCommand_AllAlbums( collection ); connect( cmd, SIGNAL( albums( QList, QVariant ) ), - SLOT( onAlbumsAdded( QList ) ) ); + SLOT( addAlbums( QList ) ) ); Database::instance()->enqueue( QSharedPointer( cmd ) ); @@ -266,7 +266,7 @@ AlbumModel::addFilteredCollection( const collection_ptr& collection, unsigned in cmd->setSortDescending( true ); connect( cmd, SIGNAL( albums( QList, QVariant ) ), - SLOT( onAlbumsAdded( QList ) ) ); + SLOT( addAlbums( QList ) ) ); Database::instance()->enqueue( QSharedPointer( cmd ) ); @@ -278,7 +278,7 @@ AlbumModel::addFilteredCollection( const collection_ptr& collection, unsigned in void -AlbumModel::onAlbumsAdded( const QList& albums ) +AlbumModel::addAlbums( const QList& albums ) { if ( !albums.count() ) return; @@ -303,6 +303,15 @@ AlbumModel::onAlbumsAdded( const QList& albums ) qDebug() << rowCount( QModelIndex() ); } +void +AlbumModel::clear() +{ + beginResetModel(); + delete m_rootItem; + m_rootItem = new AlbumItem( 0, this ); + endResetModel(); +} + void AlbumModel::infoSystemInfo( Tomahawk::InfoSystem::InfoRequestData requestData, QVariant output ) diff --git a/src/libtomahawk/playlist/albummodel.h b/src/libtomahawk/playlist/albummodel.h index 9265440e5..3730acde4 100644 --- a/src/libtomahawk/playlist/albummodel.h +++ b/src/libtomahawk/playlist/albummodel.h @@ -66,6 +66,8 @@ public: void addCollection( const Tomahawk::collection_ptr& collection ); void addFilteredCollection( const Tomahawk::collection_ptr& collection, unsigned int amount, DatabaseCommand_AllAlbums::SortOrder order ); + void clear(); + virtual QString title() const { return m_title; } virtual QString description() const { return m_description; } virtual void setTitle( const QString& title ) { m_title = title; } @@ -85,6 +87,8 @@ public slots: virtual void setRepeatMode( Tomahawk::PlaylistInterface::RepeatMode /*mode*/ ) {} virtual void setShuffled( bool /*shuffled*/ ) {} + void addAlbums( const QList& albums ); + signals: void repeatModeChanged( Tomahawk::PlaylistInterface::RepeatMode mode ); void shuffleModeChanged( bool enabled ); @@ -94,7 +98,6 @@ signals: protected: private slots: - void onAlbumsAdded( const QList& albums ); void onDataChanged(); void infoSystemInfo( Tomahawk::InfoSystem::InfoRequestData requestData, QVariant output ); diff --git a/src/libtomahawk/widgets/SocialPlaylistWidget.cpp b/src/libtomahawk/widgets/SocialPlaylistWidget.cpp index 965d6f552..86877acde 100644 --- a/src/libtomahawk/widgets/SocialPlaylistWidget.cpp +++ b/src/libtomahawk/widgets/SocialPlaylistWidget.cpp @@ -26,21 +26,70 @@ #include "dynamic/database/DatabaseGenerator.h" #include "utils/logger.h" #include "database/databasecommand_genericselect.h" - -#define COOLPLAYLIST_GUID "TOMAHAWK_COOLPLAYLISTOHAI_GUID" +#include "widgets/overlaywidget.h" using namespace Tomahawk; +QString SocialPlaylistWidget::s_popularAlbumsQuery = "SELECT * from album"; +QString SocialPlaylistWidget::s_mostPlayedPlaylistsQuery = "asd"; +QString SocialPlaylistWidget::s_topForeignTracksQuery = "select track.name, artist.name, count(*) as counter from (select track from playback_log group by track, source), track, artist where track not in (select track from playback_log where source is null group by track) and track.id = track and artist.id = track.artist group by track order by counter desc"; SocialPlaylistWidget::SocialPlaylistWidget ( QWidget* parent ) : QWidget ( parent ) , ui( new Ui_SocialPlaylistWidget ) - , m_coolQuery1Model( new PlaylistModel( this ) ) + , m_topForeignTracksModel( 0 ) + , m_popularNewAlbumsModel( 0 ) { ui->setupUi( this ); - ui->playlistView->setPlaylistModel( m_coolQuery1Model ); - load(); + ui->splitter->setHandleWidth( 1 ); + ui->splitter_2->setHandleWidth( 1 ); + ui->splitter_2->setStretchFactor( 0, 2 ); + ui->splitter_2->setStretchFactor( 0, 1 ); + + /* + WelcomePlaylistModel* model = new WelcomePlaylistModel( this ); + model->setMaxPlaylists( HISTORY_PLAYLIST_ITEMS ); + */ + + ui->mostPlayedPlaylists->setFrameShape( QFrame::NoFrame ); + ui->mostPlayedPlaylists->setAttribute( Qt::WA_MacShowFocusRect, 0 ); + ui->newTracksView->setFrameShape( QFrame::NoFrame ); + ui->newTracksView->setAttribute( Qt::WA_MacShowFocusRect, 0 ); + ui->newAlbumsView->setFrameShape( QFrame::NoFrame ); + ui->newAlbumsView->setAttribute( Qt::WA_MacShowFocusRect, 0 ); + + TomahawkUtils::unmarginLayout( layout() ); + TomahawkUtils::unmarginLayout( ui->verticalLayout->layout() ); + TomahawkUtils::unmarginLayout( ui->verticalLayout_2->layout() ); + TomahawkUtils::unmarginLayout( ui->verticalLayout_3->layout() ); + TomahawkUtils::unmarginLayout( ui->verticalLayout_4->layout() ); + +// ui->mostPlayedPlaylists->setItemDelegate( new PlaylistDelegate() ); +// ui->mostPlayedPlaylists->setModel( model ); +// ui->mostPlayedPlaylists->overlay()->resize( 380, 86 ); + +// connect( model, SIGNAL( emptinessChanged( bool) ), this, SLOT( updatePlaylists() ) ); + + m_topForeignTracksModel = new PlaylistModel( ui->newTracksView ); + ui->newTracksView->setPlaylistModel( m_topForeignTracksModel ); + m_topForeignTracksModel->setStyle( TrackModel::Short ); + ui->newTracksView->overlay()->setEnabled( false ); + + m_popularNewAlbumsModel = new AlbumModel( ui->newAlbumsView ); + ui->newAlbumsView->setAlbumModel( m_popularNewAlbumsModel ); + // TODO run the genericselect command +// m_recentAlbumsModel->addFilteredCollection( collection_ptr(), 20, DatabaseCommand_AllAlbums::ModificationTime ); +/* + m_timer = new QTimer( this ); + connect( m_timer, SIGNAL( timeout() ), SLOT( checkQueries() ) ); + + connect( SourceList::instance(), SIGNAL( ready() ), SLOT( updateRecentTracks() ) ); + connect( SourceList::instance(), SIGNAL( sourceAdded( Tomahawk::source_ptr ) ), SLOT( onSourceAdded( Tomahawk::source_ptr ) ) ); + connect( ui->playlistWidget, SIGNAL( activated( QModelIndex ) ), SLOT( onPlaylistActivated( QModelIndex ) ) ); + connect( AudioEngine::instance() ,SIGNAL( playlistChanged( Tomahawk::PlaylistInterface* ) ), this, SLOT( updatePlaylists() ), Qt::QueuedConnection ); +*/ + fetchFromDB(); } SocialPlaylistWidget::~SocialPlaylistWidget() @@ -49,91 +98,55 @@ SocialPlaylistWidget::~SocialPlaylistWidget() } void -SocialPlaylistWidget::load() +SocialPlaylistWidget::fetchFromDB() { // Load the pre-baked custom playlists that we are going to show. - // They also might not exist yet if this the first time this is shown, so then we create them. - DatabaseCommand_LoadDynamicPlaylist* cmd = new DatabaseCommand_LoadDynamicPlaylist( SourceList::instance()->getLocal(), COOLPLAYLIST_GUID, 0 ); - connect( cmd, SIGNAL( dynamicPlaylistLoaded( Tomahawk::dynplaylist_ptr ) ), this, SLOT( dynamicPlaylistLoaded( Tomahawk::dynplaylist_ptr ) ) ); - connect( cmd, SIGNAL( done() ), this, SLOT( dynamicPlaylistLoadDone() ) ); + QSharedPointer albumsCmd = QSharedPointer( new DatabaseCommand_GenericSelect( s_popularAlbumsQuery, DatabaseCommand_GenericSelect::Album, 30, 0 ) ); + connect( albumsCmd.data(), SIGNAL( albums( QList ) ), this, SLOT( popularAlbumsFetched( QList ) ) ); + Database::instance()->enqueue( QSharedPointer( albumsCmd ) ); - Database::instance()->enqueue( QSharedPointer( cmd ) ); +// QSharedPointer plCmd = QSharedPointer( new DatabaseCommand_GenericSelect( s_mostPlayedPlaylistsQuery, DatabaseCommand_GenericSelect::, 30, 0 ) ); +// connect( albumsCmd.data(), SIGNAL( albums( QList ) ), this, SLOT( popularAlbumsFetched( QList ) ) ); +// Database::instance()->enqueue( QSharedPointer( albumsCmd ) ); + + QSharedPointer trackCmd = QSharedPointer( new DatabaseCommand_GenericSelect( s_topForeignTracksQuery, DatabaseCommand_GenericSelect::Track, 50, 0 ) ); + connect( trackCmd.data(), SIGNAL( tracks( QList ) ), this, SLOT( topForeignTracksFetched( QList ) ) ); + Database::instance()->enqueue( QSharedPointer( trackCmd ) ); } + PlaylistInterface* SocialPlaylistWidget::playlistInterface() const { - return ui->playlistView->proxyModel(); + return 0; } - -void -SocialPlaylistWidget::dynamicPlaylistLoaded ( const dynplaylist_ptr& ptr ) -{ - m_coolQuery1 = ptr; - tLog() << "SocialPlaylistWidget got dynplaylist loaded with currev: " << m_coolQuery1->currentrevision(); - connect( m_coolQuery1.data(), SIGNAL( dynamicRevisionLoaded( Tomahawk::DynamicPlaylistRevision ) ), this, SLOT( playlistRevisionLoaded( Tomahawk::DynamicPlaylistRevision ) ) ); - connect( m_coolQuery1->generator().data(), SIGNAL(generated( QList ) ), this, SLOT( tracksGenerated( QList ) ) ); - - connect( m_coolQuery1->generator().data(), SIGNAL(generated( QList ) ), this, SLOT( tracksGenerated( QList ) ) ); - m_coolQuery1->loadRevision( m_coolQuery1->currentrevision() ); -} - -void -SocialPlaylistWidget::playlistRevisionLoaded( Tomahawk::DynamicPlaylistRevision ) -{ - m_coolQuery1Model->loadPlaylist( m_coolQuery1 ); - m_coolQuery1->resolve(); - - if ( m_coolQuery1->entries().isEmpty() ) // Generate some - m_coolQuery1->generator()->generate( 30 ); - -} - -void -SocialPlaylistWidget::dynamicPlaylistLoadDone() -{ - if ( m_coolQuery1.isNull() ) /// Load failed so we need to create the playlist, doesn't exist yet - { - tLog() << "SocialPlaylistWidget didn't find the magic dynamic playlist, creating!"; - createPlaylist(); - } -} - +/* void SocialPlaylistWidget::createPlaylist() { // Ok, lets create our playlist - /** + * select count(*) as counter, track.name, artist.name from (select track from playback_log group by track, source), track, artist where track.id = track and artist.id = track.artist group by track order by counter desc limit 0,20; s elect count(*) as counter, playback_log.track, track.name, artist.name from playback_log, track, artist where track.id = playback_log.track and artist.id = track.artist group by playback_log.track order by counter desc limit 0,10; * select count(*) as counter, track.name, artist.name from (select track from playback_log group by track, source), track, artist where track not in (select track from playback_log where source is null group by track) and track.id = track and artist.id = track.artist group by track order by counter desc limit 0,20; select count(*) as counter, track.name, artist.name from (select track from playback_log where source > 0 group by track, source), track, artist where track.id = track and artist.id = track.artist group by track order by counter desc limit 0,20; - */ + m_coolQuery1 = DynamicPlaylist::create( SourceList::instance()->getLocal(), COOLPLAYLIST_GUID, "Cool Playlist!", QString(), QString(), Static, false, "database", false ); connect( m_coolQuery1.data(), SIGNAL( created() ), this, SLOT( playlist1Created() ) ); +}*/ + +void +SocialPlaylistWidget::popularAlbumsFetched( QList< album_ptr > albums ) +{ + m_popularNewAlbumsModel->clear(); + + m_popularNewAlbumsModel->addAlbums( albums ); } void -SocialPlaylistWidget::playlist1Created() +SocialPlaylistWidget::topForeignTracksFetched( QList< query_ptr > tracks ) { - Q_ASSERT( m_coolQuery1->generator().dynamicCast< DatabaseGenerator >() ); - - QString sql = "select track.name, artist.name, count(*) as counter from (select track from playback_log group by track, source), track, artist where track.id = track and artist.id = track.artist group by track order by counter desc"; - - dyncontrol_ptr control = m_coolQuery1->generator().dynamicCast< DatabaseGenerator >()->createControl( sql, DatabaseCommand_GenericSelect::Track, "This is a cool playlist!" ); - m_coolQuery1->createNewRevision( uuid() ); - - connect( m_coolQuery1.data(), SIGNAL( dynamicRevisionLoaded( Tomahawk::DynamicPlaylistRevision ) ), this, SLOT( playlistRevisionLoaded( Tomahawk::DynamicPlaylistRevision ) ) ); - connect( m_coolQuery1->generator().data(), SIGNAL(generated( QList ) ), this, SLOT( tracksGenerated( QList ) ) ); -} - -void -SocialPlaylistWidget::tracksGenerated( QList< query_ptr > queries ) -{ - if ( sender() == m_coolQuery1->generator().data() ) - { - tDebug() << "Got generated tracks from playlist, adding" << queries.size() << "tracks"; - m_coolQuery1Model->clear(); - m_coolQuery1->addEntries( queries, m_coolQuery1->currentrevision() ); - } + m_topForeignTracksModel->clear(); + foreach( const query_ptr& q, tracks ) + m_topForeignTracksModel->append( q ); } diff --git a/src/libtomahawk/widgets/SocialPlaylistWidget.h b/src/libtomahawk/widgets/SocialPlaylistWidget.h index ebbd76963..e485ea88e 100644 --- a/src/libtomahawk/widgets/SocialPlaylistWidget.h +++ b/src/libtomahawk/widgets/SocialPlaylistWidget.h @@ -38,6 +38,7 @@ #include "playlist/dynamic/DynamicPlaylist.h" #include "source.h" +class AlbumModel; class PlaylistModel; class TreeModel; @@ -72,26 +73,25 @@ signals: void pixmapChanged( const QPixmap& pixmap ); private slots: - void dynamicPlaylistLoaded( const Tomahawk::dynplaylist_ptr& ptr ); - void playlistRevisionLoaded ( Tomahawk::DynamicPlaylistRevision ); - void tracksGenerated ( QList ); - void dynamicPlaylistLoadDone(); - - void playlist1Created(); + void popularAlbumsFetched( QList ); + void topForeignTracksFetched( QList ); private: - void load(); - void createPlaylist(); + void fetchFromDB(); Ui_SocialPlaylistWidget *ui; + PlaylistModel* m_topForeignTracksModel; + AlbumModel* m_popularNewAlbumsModel; - Tomahawk::dynplaylist_ptr m_coolQuery1; - PlaylistModel* m_coolQuery1Model; QString m_title; QString m_description; QString m_longDescription; QPixmap m_pixmap; + + static QString s_popularAlbumsQuery; + static QString s_mostPlayedPlaylistsQuery; + static QString s_topForeignTracksQuery; }; } diff --git a/src/libtomahawk/widgets/SocialPlaylistWidget.ui b/src/libtomahawk/widgets/SocialPlaylistWidget.ui index bd3748bff..91a99dc6c 100644 --- a/src/libtomahawk/widgets/SocialPlaylistWidget.ui +++ b/src/libtomahawk/widgets/SocialPlaylistWidget.ui @@ -6,27 +6,72 @@ 0 0 - 400 - 300 + 875 + 513 - - Form - - - - 4 - + - - - Social Stuff! + + + Qt::Horizontal + + + Qt::Vertical + + + + + + + Popular New Albums From Your Friends + + + + + + + + + + + + + + Most Played Playlists + + + + + + + + + + + + + + + Most Played Tracks You Don't Have + + + + + + + + 320 + 0 + + + + + + - - - @@ -40,6 +85,16 @@ QLabel
widgets/HeaderLabel.h
+ + AlbumView + QListView +
playlist/albumview.h
+
+ + PlaylistWidget + QListWidget +
widgets/welcomewidget.h
+