From 74b310eb005f4aaa90505e28e43152b2636c053c Mon Sep 17 00:00:00 2001 From: Leo Franchi Date: Wed, 20 Apr 2011 22:14:45 -0400 Subject: [PATCH] do lots of stuff. rename playlistmanager to viewmanager. link pages in the viewmanager to indexes in the sourcetree, so it is never out of sync. yay! --- src/audiocontrols.cpp | 16 +- src/libtomahawk/CMakeLists.txt | 4 +- .../databasecommand_createdynamicplaylist.cpp | 4 +- .../databasecommand_createplaylist.cpp | 4 +- src/libtomahawk/playlist.cpp | 1 + src/libtomahawk/playlist/albumview.cpp | 4 +- src/libtomahawk/playlist/artistview.cpp | 6 +- .../dynamic/widgets/DynamicWidget.cpp | 2 +- src/libtomahawk/playlist/playlistmodel.h | 1 + src/libtomahawk/playlist/queueproxymodel.cpp | 4 +- src/libtomahawk/playlist/topbar/topbar.cpp | 14 +- src/libtomahawk/playlist/topbar/topbar.h | 2 +- src/libtomahawk/playlist/trackview.cpp | 6 +- .../playlistmanager.cpp => viewmanager.cpp} | 158 ++++++++++------- .../playlistmanager.h => viewmanager.h} | 36 ++-- .../widgets/infowidgets/sourceinfowidget.cpp | 2 +- src/libtomahawk/widgets/newplaylistwidget.cpp | 4 +- src/libtomahawk/widgets/welcomewidget.cpp | 6 +- src/sourcetree/sourcesmodel.cpp | 82 ++++----- src/sourcetree/sourcesmodel.h | 17 +- src/sourcetree/sourcesproxymodel.cpp | 11 +- src/sourcetree/sourcesproxymodel.h | 5 + src/sourcetree/sourcetreeitem.cpp | 160 ++++++++++-------- src/sourcetree/sourcetreeitem.h | 60 +++---- src/sourcetree/sourcetreeview.cpp | 36 ++-- src/sourcetree/sourcetreeview.h | 2 +- src/tomahawkwindow.cpp | 22 +-- 27 files changed, 382 insertions(+), 287 deletions(-) rename src/libtomahawk/{playlist/playlistmanager.cpp => viewmanager.cpp} (87%) rename src/libtomahawk/{playlist/playlistmanager.h => viewmanager.h} (80%) diff --git a/src/audiocontrols.cpp b/src/audiocontrols.cpp index d80efd846..8b74784fc 100644 --- a/src/audiocontrols.cpp +++ b/src/audiocontrols.cpp @@ -22,7 +22,7 @@ #include #include "audio/audioengine.h" -#include "playlist/playlistmanager.h" +#include "viewmanager.h" #include "utils/imagebutton.h" #include "utils/tomahawkutils.h" @@ -408,21 +408,21 @@ AudioControls::onRepeatClicked() case PlaylistInterface::NoRepeat: { // switch to RepeatOne - PlaylistManager::instance()->setRepeatMode( PlaylistInterface::RepeatOne ); + ViewManager::instance()->setRepeatMode( PlaylistInterface::RepeatOne ); } break; case PlaylistInterface::RepeatOne: { // switch to RepeatAll - PlaylistManager::instance()->setRepeatMode( PlaylistInterface::RepeatAll ); + ViewManager::instance()->setRepeatMode( PlaylistInterface::RepeatAll ); } break; case PlaylistInterface::RepeatAll: { // switch to NoRepeat - PlaylistManager::instance()->setRepeatMode( PlaylistInterface::NoRepeat ); + ViewManager::instance()->setRepeatMode( PlaylistInterface::NoRepeat ); } break; @@ -457,26 +457,26 @@ AudioControls::onShuffleModeChanged( bool enabled ) void AudioControls::onShuffleClicked() { - PlaylistManager::instance()->setShuffled( m_shuffled ^ true ); + ViewManager::instance()->setShuffled( m_shuffled ^ true ); } void AudioControls::onArtistClicked() { - PlaylistManager::instance()->show( m_currentTrack->artist() ); + ViewManager::instance()->show( m_currentTrack->artist() ); } void AudioControls::onAlbumClicked() { - PlaylistManager::instance()->show( m_currentTrack->album() ); + ViewManager::instance()->show( m_currentTrack->album() ); } void AudioControls::onTrackClicked() { - PlaylistManager::instance()->showCurrentTrack(); + ViewManager::instance()->showCurrentTrack(); } diff --git a/src/libtomahawk/CMakeLists.txt b/src/libtomahawk/CMakeLists.txt index 33aaff411..129bb8756 100644 --- a/src/libtomahawk/CMakeLists.txt +++ b/src/libtomahawk/CMakeLists.txt @@ -27,6 +27,7 @@ set( libSources result.cpp source.cpp viewpage.cpp + viewmanager.cpp sip/SipPlugin.cpp @@ -90,7 +91,6 @@ set( libSources playlist/collectionproxymodel.cpp playlist/collectionflatmodel.cpp playlist/collectionview.cpp - playlist/playlistmanager.cpp playlist/playlistmodel.cpp playlist/playlistproxymodel.cpp playlist/playlistview.cpp @@ -180,6 +180,7 @@ set( libHeaders result.h source.h viewpage.h + viewmanager.h artist.h album.h @@ -257,7 +258,6 @@ set( libHeaders playlist/collectionproxymodel.h playlist/collectionflatmodel.h playlist/collectionview.h - playlist/playlistmanager.h playlist/playlistmodel.h playlist/playlistproxymodel.h playlist/playlistview.h diff --git a/src/libtomahawk/database/databasecommand_createdynamicplaylist.cpp b/src/libtomahawk/database/databasecommand_createdynamicplaylist.cpp index 31b675119..b0aa81b3b 100644 --- a/src/libtomahawk/database/databasecommand_createdynamicplaylist.cpp +++ b/src/libtomahawk/database/databasecommand_createdynamicplaylist.cpp @@ -26,7 +26,7 @@ #include "dynamic/GeneratorInterface.h" #include "network/servent.h" -#include "playlist/playlistmanager.h" +#include "viewmanager.h" using namespace Tomahawk; @@ -92,7 +92,7 @@ DatabaseCommand_CreateDynamicPlaylist::postCommitHook() qDebug() << Q_FUNC_INFO << "..reporting.."; if( m_playlist.isNull() ) { source_ptr src = source(); - QMetaObject::invokeMethod( PlaylistManager::instance(), + QMetaObject::invokeMethod( ViewManager::instance(), "createDynamicPlaylist", Qt::BlockingQueuedConnection, QGenericArgument( "Tomahawk::source_ptr", (const void*)&src ), diff --git a/src/libtomahawk/database/databasecommand_createplaylist.cpp b/src/libtomahawk/database/databasecommand_createplaylist.cpp index 9a9f32697..8a5bfa940 100644 --- a/src/libtomahawk/database/databasecommand_createplaylist.cpp +++ b/src/libtomahawk/database/databasecommand_createplaylist.cpp @@ -21,7 +21,7 @@ #include #include "network/servent.h" -#include "playlist/playlistmanager.h" +#include "viewmanager.h" using namespace Tomahawk; @@ -66,7 +66,7 @@ DatabaseCommand_CreatePlaylist::postCommitHook() qDebug() << Q_FUNC_INFO << "..reporting.."; if( m_playlist.isNull() ) { source_ptr src = source(); - QMetaObject::invokeMethod( PlaylistManager::instance(), + QMetaObject::invokeMethod( ViewManager::instance(), "createPlaylist", Qt::BlockingQueuedConnection, QGenericArgument( "Tomahawk::source_ptr", (const void*)&src ), diff --git a/src/libtomahawk/playlist.cpp b/src/libtomahawk/playlist.cpp index 4281f7265..22679c3a7 100644 --- a/src/libtomahawk/playlist.cpp +++ b/src/libtomahawk/playlist.cpp @@ -184,6 +184,7 @@ playlist_ptr Playlist::load( const QString& guid ) { playlist_ptr p; + qDebug() << "asked to load playlist:" << guid; foreach( const Tomahawk::source_ptr& source, SourceList::instance()->sources() ) { diff --git a/src/libtomahawk/playlist/albumview.cpp b/src/libtomahawk/playlist/albumview.cpp index 351fd8ea2..6bf480b6c 100644 --- a/src/libtomahawk/playlist/albumview.cpp +++ b/src/libtomahawk/playlist/albumview.cpp @@ -28,7 +28,7 @@ #include "tomahawksettings.h" #include "albumitemdelegate.h" -#include "playlistmanager.h" +#include "viewmanager.h" using namespace Tomahawk; @@ -106,7 +106,7 @@ AlbumView::onItemActivated( const QModelIndex& index ) // qDebug() << "Result activated:" << item->album()->tracks().first()->toString() << item->album()->tracks().first()->results().first()->url(); // APP->audioEngine()->playItem( item->album().data(), item->album()->tracks().first()->results().first() ); - PlaylistManager::instance()->show( item->album() ); + ViewManager::instance()->show( item->album() ); } } diff --git a/src/libtomahawk/playlist/artistview.cpp b/src/libtomahawk/playlist/artistview.cpp index 126f99ecd..7a6d94e59 100644 --- a/src/libtomahawk/playlist/artistview.cpp +++ b/src/libtomahawk/playlist/artistview.cpp @@ -29,7 +29,7 @@ #include "tomahawksettings.h" #include "treeheader.h" #include "treeitemdelegate.h" -#include "playlistmanager.h" +#include "viewmanager.h" static QString s_tmInfoIdentifier = QString( "TREEMODEL" ); @@ -121,9 +121,9 @@ ArtistView::onItemActivated( const QModelIndex& index ) if ( item ) { if ( !item->artist().isNull() ) - PlaylistManager::instance()->show( item->artist() ); + ViewManager::instance()->show( item->artist() ); else if ( !item->album().isNull() ) - PlaylistManager::instance()->show( item->album() ); + ViewManager::instance()->show( item->album() ); else if ( !item->result().isNull() ) AudioEngine::instance()->playItem( 0, item->result() ); } diff --git a/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.cpp b/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.cpp index 60a4fc52d..aabfff2c1 100644 --- a/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.cpp +++ b/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.cpp @@ -34,7 +34,7 @@ #include "ReadOrWriteWidget.h" #include "CollapsibleControls.h" #include "DynamicControlWrapper.h" -#include "playlistmanager.h" +#include "viewmanager.h" #include "dynamic/DynamicView.h" #include #include "DynamicSetupWidget.h" diff --git a/src/libtomahawk/playlist/playlistmodel.h b/src/libtomahawk/playlist/playlistmodel.h index 2d057a328..bc2af7868 100644 --- a/src/libtomahawk/playlist/playlistmodel.h +++ b/src/libtomahawk/playlist/playlistmodel.h @@ -70,6 +70,7 @@ signals: void shuffleModeChanged( bool enabled ); void itemSizeChanged( const QModelIndex& index ); + void playlistDeleted(); private slots: void onDataChanged(); diff --git a/src/libtomahawk/playlist/queueproxymodel.cpp b/src/libtomahawk/playlist/queueproxymodel.cpp index 88950089e..0c8253fb7 100644 --- a/src/libtomahawk/playlist/queueproxymodel.cpp +++ b/src/libtomahawk/playlist/queueproxymodel.cpp @@ -20,7 +20,7 @@ #include -#include "playlist/playlistmanager.h" +#include "viewmanager.h" using namespace Tomahawk; @@ -47,7 +47,7 @@ QueueProxyModel::siblingItem( int itemsAway ) qDebug() << "new rowcount:" << rowCount( QModelIndex() ); if ( rowCount( QModelIndex() ) == 1 ) - PlaylistManager::instance()->hideQueue(); + ViewManager::instance()->hideQueue(); removeIndex( currentItem() ); diff --git a/src/libtomahawk/playlist/topbar/topbar.cpp b/src/libtomahawk/playlist/topbar/topbar.cpp index b60741a9e..9c0acda8b 100644 --- a/src/libtomahawk/playlist/topbar/topbar.cpp +++ b/src/libtomahawk/playlist/topbar/topbar.cpp @@ -83,25 +83,25 @@ TopBar::TopBar( QWidget* parent ) onFlatMode(); - connect( PlaylistManager::instance(), SIGNAL( numSourcesChanged( unsigned int ) ), + connect( ViewManager::instance(), SIGNAL( numSourcesChanged( unsigned int ) ), SLOT( setNumSources( unsigned int ) ) ); - connect( PlaylistManager::instance(), SIGNAL( numTracksChanged( unsigned int ) ), + connect( ViewManager::instance(), SIGNAL( numTracksChanged( unsigned int ) ), SLOT( setNumTracks( unsigned int ) ) ); - connect( PlaylistManager::instance(), SIGNAL( numArtistsChanged( unsigned int ) ), + connect( ViewManager::instance(), SIGNAL( numArtistsChanged( unsigned int ) ), SLOT( setNumArtists( unsigned int ) ) ); - connect( PlaylistManager::instance(), SIGNAL( numShownChanged( unsigned int ) ), + connect( ViewManager::instance(), SIGNAL( numShownChanged( unsigned int ) ), SLOT( setNumShown( unsigned int ) ) ); - connect( PlaylistManager::instance(), SIGNAL( statsAvailable( bool ) ), + connect( ViewManager::instance(), SIGNAL( statsAvailable( bool ) ), SLOT( setStatsVisible( bool ) ) ); - connect( PlaylistManager::instance(), SIGNAL( modesAvailable( bool ) ), + connect( ViewManager::instance(), SIGNAL( modesAvailable( bool ) ), SLOT( setModesVisible( bool ) ) ); - connect( PlaylistManager::instance(), SIGNAL( modeChanged( PlaylistInterface::ViewMode ) ), + connect( ViewManager::instance(), SIGNAL( modeChanged( PlaylistInterface::ViewMode ) ), SLOT( onModeChanged( PlaylistInterface::ViewMode ) ) ); } diff --git a/src/libtomahawk/playlist/topbar/topbar.h b/src/libtomahawk/playlist/topbar/topbar.h index c29b8b959..d48c953ed 100644 --- a/src/libtomahawk/playlist/topbar/topbar.h +++ b/src/libtomahawk/playlist/topbar/topbar.h @@ -23,7 +23,7 @@ #include #include -#include "playlist/playlistmanager.h" +#include "viewmanager.h" #include "sourcelist.h" #include "dllmacro.h" diff --git a/src/libtomahawk/playlist/trackview.cpp b/src/libtomahawk/playlist/trackview.cpp index 4016382d8..c7ab24d61 100644 --- a/src/libtomahawk/playlist/trackview.cpp +++ b/src/libtomahawk/playlist/trackview.cpp @@ -29,7 +29,7 @@ #include "dynamic/widgets/LoadingSpinner.h" #include "trackheader.h" -#include "playlistmanager.h" +#include "viewmanager.h" #include "queueview.h" #include "trackmodel.h" #include "trackproxymodel.h" @@ -192,8 +192,8 @@ TrackView::addItemsToQueue() TrackModelItem* item = model()->itemFromIndex( proxyModel()->mapToSource( idx ) ); if ( item && item->query()->numResults() ) { - PlaylistManager::instance()->queue()->model()->append( item->query() ); - PlaylistManager::instance()->showQueue(); + ViewManager::instance()->queue()->model()->append( item->query() ); + ViewManager::instance()->showQueue(); } } } diff --git a/src/libtomahawk/playlist/playlistmanager.cpp b/src/libtomahawk/viewmanager.cpp similarity index 87% rename from src/libtomahawk/playlist/playlistmanager.cpp rename to src/libtomahawk/viewmanager.cpp index a056529a8..a62abc51e 100644 --- a/src/libtomahawk/playlist/playlistmanager.cpp +++ b/src/libtomahawk/viewmanager.cpp @@ -16,7 +16,7 @@ * along with Tomahawk. If not, see . */ -#include "playlistmanager.h" +#include "viewmanager.h" #include #include @@ -47,23 +47,23 @@ #include "widgets/welcomewidget.h" #include "widgets/infowidgets/sourceinfowidget.h" -#include +#include "widgets/newplaylistwidget.h" #define FILTER_TIMEOUT 280 using namespace Tomahawk; -PlaylistManager* PlaylistManager::s_instance = 0; +ViewManager* ViewManager::s_instance = 0; -PlaylistManager* -PlaylistManager::instance() +ViewManager* +ViewManager::instance() { return s_instance; } -PlaylistManager::PlaylistManager( QObject* parent ) +ViewManager::ViewManager( QObject* parent ) : QObject( parent ) , m_widget( new QWidget() ) , m_welcomeWidget( new WelcomeWidget() ) @@ -137,21 +137,21 @@ PlaylistManager::PlaylistManager( QObject* parent ) } -PlaylistManager::~PlaylistManager() +ViewManager::~ViewManager() { delete m_widget; } PlaylistView* -PlaylistManager::queue() const +ViewManager::queue() const { return m_queueView->queue(); } -bool -PlaylistManager::show( const Tomahawk::playlist_ptr& playlist ) +Tomahawk::ViewPage* +ViewManager::show( const Tomahawk::playlist_ptr& playlist ) { PlaylistView* view; if ( !m_playlistViews.contains( playlist ) ) @@ -175,12 +175,12 @@ PlaylistManager::show( const Tomahawk::playlist_ptr& playlist ) TomahawkSettings::instance()->appendRecentlyPlayedPlaylist( playlist ); emit numSourcesChanged( SourceList::instance()->count() ); - return true; + return view; } -bool -PlaylistManager::show( const Tomahawk::dynplaylist_ptr& playlist ) +Tomahawk::ViewPage* +ViewManager::show( const Tomahawk::dynplaylist_ptr& playlist ) { if ( !m_dynamicWidgets.contains( playlist ) ) { @@ -201,12 +201,12 @@ PlaylistManager::show( const Tomahawk::dynplaylist_ptr& playlist ) TomahawkSettings::instance()->appendRecentlyPlayedPlaylist( playlist ); emit numSourcesChanged( SourceList::instance()->count() ); - return true; + return m_dynamicWidgets.value( playlist ); } -bool -PlaylistManager::show( const Tomahawk::artist_ptr& artist ) +Tomahawk::ViewPage* +ViewManager::show( const Tomahawk::artist_ptr& artist ) { PlaylistView* view; @@ -229,12 +229,12 @@ PlaylistManager::show( const Tomahawk::artist_ptr& artist ) setPage( view ); emit numSourcesChanged( 1 ); - return true; + return view; } -bool -PlaylistManager::show( const Tomahawk::album_ptr& album ) +Tomahawk::ViewPage* +ViewManager::show( const Tomahawk::album_ptr& album ) { PlaylistView* view; if ( !m_albumViews.contains( album ) ) @@ -256,15 +256,16 @@ PlaylistManager::show( const Tomahawk::album_ptr& album ) setPage( view ); emit numSourcesChanged( 1 ); - return true; + return view; } -bool -PlaylistManager::show( const Tomahawk::collection_ptr& collection ) +Tomahawk::ViewPage* +ViewManager::show( const Tomahawk::collection_ptr& collection ) { qDebug() << Q_FUNC_INFO << m_currentMode; m_currentCollection = collection; + ViewPage* shown = 0; if ( m_currentMode == 0 ) { CollectionView* view; @@ -285,6 +286,7 @@ PlaylistManager::show( const Tomahawk::collection_ptr& collection ) view = m_collectionViews.value( collection ); } + shown = view; setPage( view ); } @@ -308,6 +310,7 @@ PlaylistManager::show( const Tomahawk::collection_ptr& collection ) view = m_treeViews.value( collection ); } + shown = view; setPage( view ); } @@ -330,17 +333,18 @@ PlaylistManager::show( const Tomahawk::collection_ptr& collection ) aview = m_collectionAlbumViews.value( collection ); } + shown = aview; setPage( aview ); } emit numSourcesChanged( 1 ); - return true; + return shown; } -bool -PlaylistManager::show( const Tomahawk::source_ptr& source ) +Tomahawk::ViewPage* +ViewManager::show( const Tomahawk::source_ptr& source ) { SourceInfoWidget* swidget; if ( !m_sourceViews.contains( source ) ) @@ -356,21 +360,21 @@ PlaylistManager::show( const Tomahawk::source_ptr& source ) setPage( swidget ); emit numSourcesChanged( 1 ); - return true; + return swidget; } -bool -PlaylistManager::show( ViewPage* page ) +Tomahawk::ViewPage* +ViewManager::show( ViewPage* page ) { setPage( page ); - return true; + return page; } -bool -PlaylistManager::showSuperCollection() +Tomahawk::ViewPage* +ViewManager::showSuperCollection() { if ( m_superCollections.isEmpty() ) m_superCollectionModel->addAllCollections(); @@ -387,34 +391,37 @@ PlaylistManager::showSuperCollection() m_superCollectionModel->setTitle( tr( "All available tracks" ) ); m_superAlbumModel->setTitle( tr( "All available albums" ) ); + ViewPage* shown = 0; if ( m_currentMode == 0 ) { + shown = m_superCollectionView; setPage( m_superCollectionView ); } else if ( m_currentMode == 1 ) { + shown = m_superCollectionView; setPage( m_superCollectionView ); } else if ( m_currentMode == 2 ) { + shown = m_superAlbumView; setPage( m_superAlbumView ); } emit numSourcesChanged( m_superCollections.count() ); - return true; + return shown; } - void -PlaylistManager::showWelcomePage() +ViewManager::showWelcomePage() { show( m_welcomeWidget ); } void -PlaylistManager::setTableMode() +ViewManager::setTableMode() { qDebug() << Q_FUNC_INFO; @@ -428,7 +435,7 @@ PlaylistManager::setTableMode() void -PlaylistManager::setTreeMode() +ViewManager::setTreeMode() { qDebug() << Q_FUNC_INFO; @@ -442,7 +449,7 @@ PlaylistManager::setTreeMode() void -PlaylistManager::setAlbumMode() +ViewManager::setAlbumMode() { qDebug() << Q_FUNC_INFO; @@ -456,7 +463,7 @@ PlaylistManager::setAlbumMode() void -PlaylistManager::showQueue() +ViewManager::showQueue() { if ( QThread::currentThread() != thread() ) { @@ -470,7 +477,7 @@ PlaylistManager::showQueue() void -PlaylistManager::hideQueue() +ViewManager::hideQueue() { if ( QThread::currentThread() != thread() ) { @@ -484,7 +491,7 @@ PlaylistManager::hideQueue() void -PlaylistManager::historyBack() +ViewManager::historyBack() { if ( m_historyPosition < 1 ) return; @@ -494,7 +501,7 @@ PlaylistManager::historyBack() void -PlaylistManager::historyForward() +ViewManager::historyForward() { if ( m_historyPosition >= m_pageHistory.count() - 1 ) return; @@ -504,7 +511,7 @@ PlaylistManager::historyForward() void -PlaylistManager::showHistory( int historyPosition ) +ViewManager::showHistory( int historyPosition ) { if ( historyPosition < 0 || historyPosition >= m_pageHistory.count() ) { @@ -521,7 +528,7 @@ PlaylistManager::showHistory( int historyPosition ) void -PlaylistManager::setFilter( const QString& filter ) +ViewManager::setFilter( const QString& filter ) { m_filter = filter; @@ -533,7 +540,7 @@ PlaylistManager::setFilter( const QString& filter ) void -PlaylistManager::applyFilter() +ViewManager::applyFilter() { qDebug() << Q_FUNC_INFO; @@ -543,7 +550,7 @@ PlaylistManager::applyFilter() void -PlaylistManager::setPage( ViewPage* page, bool trackHistory ) +ViewManager::setPage( ViewPage* page, bool trackHistory ) { if ( !page ) return; @@ -581,6 +588,9 @@ PlaylistManager::setPage( ViewPage* page, bool trackHistory ) else if ( !currentPlaylistInterface() ) emit tempPageActivated();*/ + qDebug() << "View page shown:" << page->title(); + emit viewPageActivated( page ); + if ( !AudioEngine::instance()->isPlaying() ) AudioEngine::instance()->setPlaylist( currentPlaylistInterface() ); @@ -603,14 +613,14 @@ PlaylistManager::setPage( ViewPage* page, bool trackHistory ) } bool -PlaylistManager::isNewPlaylistPageVisible() const +ViewManager::isNewPlaylistPageVisible() const { return dynamic_cast< NewPlaylistWidget* >( currentPage() ) != 0; } void -PlaylistManager::unlinkPlaylist() +ViewManager::unlinkPlaylist() { if ( currentPlaylistInterface() ) { @@ -630,7 +640,7 @@ PlaylistManager::unlinkPlaylist() void -PlaylistManager::updateView() +ViewManager::updateView() { if ( currentPlaylistInterface() ) { @@ -683,7 +693,7 @@ PlaylistManager::updateView() void -PlaylistManager::onWidgetDestroyed( QWidget* widget ) +ViewManager::onWidgetDestroyed( QWidget* widget ) { qDebug() << "Destroyed child:" << widget << widget->metaObject()->className(); @@ -722,7 +732,7 @@ PlaylistManager::onWidgetDestroyed( QWidget* widget ) void -PlaylistManager::setRepeatMode( PlaylistInterface::RepeatMode mode ) +ViewManager::setRepeatMode( PlaylistInterface::RepeatMode mode ) { if ( currentPlaylistInterface() ) currentPlaylistInterface()->setRepeatMode( mode ); @@ -730,7 +740,7 @@ PlaylistManager::setRepeatMode( PlaylistInterface::RepeatMode mode ) void -PlaylistManager::setShuffled( bool enabled ) +ViewManager::setShuffled( bool enabled ) { if ( currentPlaylistInterface() ) currentPlaylistInterface()->setShuffled( enabled ); @@ -738,7 +748,7 @@ PlaylistManager::setShuffled( bool enabled ) void -PlaylistManager::createPlaylist( const Tomahawk::source_ptr& src, +ViewManager::createPlaylist( const Tomahawk::source_ptr& src, const QVariant& contents ) { Tomahawk::playlist_ptr p = Tomahawk::playlist_ptr( new Tomahawk::Playlist( src ) ); @@ -748,7 +758,7 @@ PlaylistManager::createPlaylist( const Tomahawk::source_ptr& src, void -PlaylistManager::createDynamicPlaylist( const Tomahawk::source_ptr& src, +ViewManager::createDynamicPlaylist( const Tomahawk::source_ptr& src, const QVariant& contents ) { Tomahawk::dynplaylist_ptr p = Tomahawk::dynplaylist_ptr( new Tomahawk::DynamicPlaylist( src, contents.toMap().value( "type", QString() ).toString() ) ); @@ -756,9 +766,27 @@ PlaylistManager::createDynamicPlaylist( const Tomahawk::source_ptr& src, p->reportCreated( p ); } +ViewPage* +ViewManager::pageForCollection( const collection_ptr& col ) const +{ + return m_collectionViews.value( col, 0 ); +} ViewPage* -PlaylistManager::pageForInterface( PlaylistInterface* interface ) const +ViewManager::pageForDynPlaylist(const dynplaylist_ptr& pl) const +{ + return m_dynamicWidgets.value( pl, 0 ); +} + +ViewPage* +ViewManager::pageForPlaylist(const playlist_ptr& pl) const +{ + return m_playlistViews.value( pl, 0 ); +} + + +ViewPage* +ViewManager::pageForInterface( PlaylistInterface* interface ) const { for ( int i = 0; i < m_pageHistory.count(); i++ ) { @@ -772,7 +800,7 @@ PlaylistManager::pageForInterface( PlaylistInterface* interface ) const int -PlaylistManager::positionInHistory( ViewPage* page ) const +ViewManager::positionInHistory( ViewPage* page ) const { for ( int i = 0; i < m_pageHistory.count(); i++ ) { @@ -785,7 +813,7 @@ PlaylistManager::positionInHistory( ViewPage* page ) const PlaylistInterface* -PlaylistManager::currentPlaylistInterface() const +ViewManager::currentPlaylistInterface() const { if ( currentPage() ) return currentPage()->playlistInterface(); @@ -795,7 +823,7 @@ PlaylistManager::currentPlaylistInterface() const Tomahawk::ViewPage* -PlaylistManager::currentPage() const +ViewManager::currentPage() const { if ( m_historyPosition >= 0 ) return m_pageHistory.at( m_historyPosition ); @@ -805,7 +833,7 @@ PlaylistManager::currentPage() const void -PlaylistManager::setHistoryPosition( int position ) +ViewManager::setHistoryPosition( int position ) { m_historyPosition = position; @@ -815,7 +843,7 @@ PlaylistManager::setHistoryPosition( int position ) Tomahawk::playlist_ptr -PlaylistManager::playlistForInterface( PlaylistInterface* interface ) const +ViewManager::playlistForInterface( PlaylistInterface* interface ) const { foreach ( PlaylistView* view, m_playlistViews.values() ) { @@ -830,7 +858,7 @@ PlaylistManager::playlistForInterface( PlaylistInterface* interface ) const Tomahawk::dynplaylist_ptr -PlaylistManager::dynamicPlaylistForInterface( PlaylistInterface* interface ) const +ViewManager::dynamicPlaylistForInterface( PlaylistInterface* interface ) const { foreach ( DynamicWidget* view, m_dynamicWidgets.values() ) { @@ -845,7 +873,7 @@ PlaylistManager::dynamicPlaylistForInterface( PlaylistInterface* interface ) con Tomahawk::collection_ptr -PlaylistManager::collectionForInterface( PlaylistInterface* interface ) const +ViewManager::collectionForInterface( PlaylistInterface* interface ) const { foreach ( CollectionView* view, m_collectionViews.values() ) { @@ -867,7 +895,7 @@ PlaylistManager::collectionForInterface( PlaylistInterface* interface ) const bool -PlaylistManager::isSuperCollectionVisible() const +ViewManager::isSuperCollectionVisible() const { return ( m_pageHistory.count() && ( currentPage()->playlistInterface() == m_superCollectionView->playlistInterface() || @@ -876,7 +904,7 @@ PlaylistManager::isSuperCollectionVisible() const void -PlaylistManager::showCurrentTrack() +ViewManager::showCurrentTrack() { ViewPage* page = pageForInterface( AudioEngine::instance()->currentTrackPlaylist() ); @@ -889,14 +917,14 @@ PlaylistManager::showCurrentTrack() void -PlaylistManager::onPlayClicked() +ViewManager::onPlayClicked() { emit playClicked(); } void -PlaylistManager::onPauseClicked() +ViewManager::onPauseClicked() { emit pauseClicked(); } diff --git a/src/libtomahawk/playlist/playlistmanager.h b/src/libtomahawk/viewmanager.h similarity index 80% rename from src/libtomahawk/playlist/playlistmanager.h rename to src/libtomahawk/viewmanager.h index ffea8d76f..04fefe35a 100644 --- a/src/libtomahawk/playlist/playlistmanager.h +++ b/src/libtomahawk/viewmanager.h @@ -54,15 +54,15 @@ namespace Tomahawk class DynamicWidget; } -class DLLEXPORT PlaylistManager : public QObject +class DLLEXPORT ViewManager : public QObject { Q_OBJECT public: - static PlaylistManager* instance(); + static ViewManager* instance(); - explicit PlaylistManager( QObject* parent = 0 ); - ~PlaylistManager(); + explicit ViewManager( QObject* parent = 0 ); + ~ViewManager(); QWidget* widget() const { return m_widget; } PlaylistView* queue() const; @@ -75,14 +75,23 @@ public: Tomahawk::ViewPage* pageForInterface( PlaylistInterface* interface ) const; int positionInHistory( Tomahawk::ViewPage* page ) const; - bool show( const Tomahawk::playlist_ptr& playlist ); - bool show( const Tomahawk::dynplaylist_ptr& playlist ); - bool show( const Tomahawk::artist_ptr& artist ); - bool show( const Tomahawk::album_ptr& album ); - bool show( const Tomahawk::collection_ptr& collection ); - bool show( const Tomahawk::source_ptr& source ); + // Returns the shown viewpage + Tomahawk::ViewPage* show( const Tomahawk::playlist_ptr& playlist ); + Tomahawk::ViewPage* show( const Tomahawk::dynplaylist_ptr& playlist ); + Tomahawk::ViewPage* show( const Tomahawk::artist_ptr& artist ); + Tomahawk::ViewPage* show( const Tomahawk::album_ptr& album ); + Tomahawk::ViewPage* show( const Tomahawk::collection_ptr& collection ); + Tomahawk::ViewPage* show( const Tomahawk::source_ptr& source ); - bool show( Tomahawk::ViewPage* page ); + Tomahawk::ViewPage* show( Tomahawk::ViewPage* page ); + + WelcomeWidget* welcomeWidget() const { return m_welcomeWidget; } + ArtistView* superCollectionView() const { return m_superCollectionView; } + + /// Get the view page for the given item. Not pretty... + Tomahawk::ViewPage* pageForPlaylist( const Tomahawk::playlist_ptr& pl ) const; + Tomahawk::ViewPage* pageForDynPlaylist( const Tomahawk::dynplaylist_ptr& pl ) const; + Tomahawk::ViewPage* pageForCollection( const Tomahawk::collection_ptr& pl ) const; signals: void numSourcesChanged( unsigned int sources ); @@ -110,9 +119,10 @@ signals: void dynamicPlaylistActivated( const Tomahawk::dynplaylist_ptr& playlist ); void newPlaylistActivated(); + void viewPageActivated( Tomahawk::ViewPage* ); public slots: - bool showSuperCollection(); + Tomahawk::ViewPage* showSuperCollection(); void showWelcomePage(); void showCurrentTrack(); @@ -189,7 +199,7 @@ private: QTimer m_filterTimer; QString m_filter; - static PlaylistManager* s_instance; + static ViewManager* s_instance; }; #endif // PLAYLISTMANAGER_H diff --git a/src/libtomahawk/widgets/infowidgets/sourceinfowidget.cpp b/src/libtomahawk/widgets/infowidgets/sourceinfowidget.cpp index c78783538..8ac75a8c6 100644 --- a/src/libtomahawk/widgets/infowidgets/sourceinfowidget.cpp +++ b/src/libtomahawk/widgets/infowidgets/sourceinfowidget.cpp @@ -21,7 +21,7 @@ #include "utils/tomahawkutils.h" -#include "playlist/playlistmanager.h" +#include "viewmanager.h" #include "playlist/albummodel.h" #include "playlist/collectionflatmodel.h" #include "playlist/playlistmodel.h" diff --git a/src/libtomahawk/widgets/newplaylistwidget.cpp b/src/libtomahawk/widgets/newplaylistwidget.cpp index bc633e6a2..7aa40bd8f 100644 --- a/src/libtomahawk/widgets/newplaylistwidget.cpp +++ b/src/libtomahawk/widgets/newplaylistwidget.cpp @@ -24,7 +24,7 @@ #include "utils/tomahawkutils.h" -#include "playlist/playlistmanager.h" +#include "viewmanager.h" #include "playlist/playlistmodel.h" #include "widgets/overlaywidget.h" @@ -144,7 +144,7 @@ NewPlaylistWidget::savePlaylist() playlist = Tomahawk::Playlist::create( SourceList::instance()->getLocal(), uuid(), ui->titleEdit->text(), "", "", false ); playlist->createNewRevision( uuid(), playlist->currentrevision(), m_entries ); - PlaylistManager::instance()->show( playlist ); + ViewManager::instance()->show( playlist ); cancel(); } diff --git a/src/libtomahawk/widgets/welcomewidget.cpp b/src/libtomahawk/widgets/welcomewidget.cpp index 5297710e5..d62222cf8 100644 --- a/src/libtomahawk/widgets/welcomewidget.cpp +++ b/src/libtomahawk/widgets/welcomewidget.cpp @@ -21,7 +21,7 @@ #include "utils/tomahawkutils.h" -#include "playlist/playlistmanager.h" +#include "viewmanager.h" #include "playlist/playlistmodel.h" #include "widgets/overlaywidget.h" @@ -130,9 +130,9 @@ WelcomeWidget::onPlaylistActivated( QListWidgetItem* item ) PlaylistWidgetItem* pwi = dynamic_cast(item); if( Tomahawk::dynplaylist_ptr dynplaylist = pwi->playlist().dynamicCast< Tomahawk::DynamicPlaylist >() ) - PlaylistManager::instance()->show( dynplaylist ); + ViewManager::instance()->show( dynplaylist ); else - PlaylistManager::instance()->show( pwi->playlist() ); + ViewManager::instance()->show( pwi->playlist() ); } diff --git a/src/sourcetree/sourcesmodel.cpp b/src/sourcetree/sourcesmodel.cpp index 737c98a80..36c97c49e 100644 --- a/src/sourcetree/sourcesmodel.cpp +++ b/src/sourcetree/sourcesmodel.cpp @@ -24,15 +24,16 @@ #include "collection.h" #include "source.h" #include "tomahawk/tomahawkapp.h" +#include "viewmanager.h" #include #include -#include using namespace Tomahawk; SourcesModel::SourcesModel( QObject* parent ) : QAbstractItemModel( parent ) + , m_viewPageDelayedCacheItem( 0 ) { m_rootItem = new SourceTreeItem( this, 0, Invalid ); @@ -40,12 +41,13 @@ SourcesModel::SourcesModel( QObject* parent ) // add misc children of root node GenericPageItem* recent = new GenericPageItem( this, m_rootItem->children().at( 0 ), tr( "Recently Played" ), QIcon( RESPATH "images/recently-played.png" ) ); - connect( recent, SIGNAL( activated() ), PlaylistManager::instance(), SLOT( showWelcomePage() ) ); + connect( recent, SIGNAL( activated() ), ViewManager::instance(), SLOT( showWelcomePage() ) ); onSourcesAdded( SourceList::instance()->sources() ); connect( SourceList::instance(), SIGNAL( sourceAdded( Tomahawk::source_ptr ) ), SLOT( onSourceAdded( Tomahawk::source_ptr ) ) ); connect( SourceList::instance(), SIGNAL( sourceRemoved( Tomahawk::source_ptr ) ), SLOT( onSourceRemoved( Tomahawk::source_ptr ) ) ); + connect( ViewManager::instance(), SIGNAL( viewPageActivated( Tomahawk::ViewPage* ) ), this, SLOT( viewPageActivated( Tomahawk::ViewPage* ) ) ); } SourcesModel::~SourcesModel() @@ -186,19 +188,8 @@ SourcesModel::appendItem( const Tomahawk::source_ptr& source ) beginInsertRows( QModelIndex(), rowCount(), rowCount() ); // append to end CollectionItem* item = new CollectionItem( this, m_rootItem, source ); - connect( item, SIGNAL( updated() ), this, SLOT( collectionUpdated() ) ); endInsertRows(); - - if ( !source.isNull() ) - { - qDebug() << "Appending source item:" << item->source()->friendlyName(); - - connect( source.data(), SIGNAL( stats( QVariantMap ) ), SLOT( onSourceChanged() ) ); - connect( source.data(), SIGNAL( playbackStarted( Tomahawk::query_ptr ) ), SLOT( onSourceChanged() ) ); - connect( source.data(), SIGNAL( stateChanged() ), SLOT( onSourceChanged() ) ); - - } } bool @@ -229,6 +220,23 @@ SourcesModel::removeItem( const Tomahawk::source_ptr& source ) return false; } +void +SourcesModel::viewPageActivated( Tomahawk::ViewPage* page ) +{ + if ( m_sourceTreeLinks.contains( page ) ) + { + Q_ASSERT( m_sourceTreeLinks[ page ] ); + qDebug() << "Got view page activated for itemL:" << m_sourceTreeLinks[ page ]->text(); + QModelIndex idx = indexFromItem( m_sourceTreeLinks[ page ] ); + Q_ASSERT( idx.isValid() ); + + emit selectRequest( idx ); + } else { + m_viewPageDelayedCacheItem = page; + } +} +/* + QModelIndex SourcesModel::indexFromPlaylist( const playlist_ptr& playlist ) { @@ -257,30 +265,7 @@ SourcesModel::indexFromPlaylist( const playlist_ptr& playlist ) } qDebug() << "FAILED to find playlist in source tree:" << playlist->title(); return idx; -} - - -void -SourcesModel::onSourceChanged() { - - Source* src = qobject_cast< Source* >( sender() ); - Q_ASSERT( src ); - - qDebug() << "Searching for source item:" << src->friendlyName(); - - for( int i = 0; i < rowCount(); i++ ) - { - QModelIndex idx = index( i, 0 , QModelIndex() ); - - if( idx.isValid() && itemFromIndex( idx ) && itemFromIndex( idx )->type() == Collection && // this is a source - static_cast< CollectionItem* >( itemFromIndex( idx ) )->source().data() == src ) // and it is the one we want - { - qDebug() << "Found changed source, emitting dataChanged:" << src->friendlyName(); - emit dataChanged( idx, idx ); - return; - } - } -} +}*/ void SourcesModel::loadSources() @@ -314,11 +299,19 @@ SourcesModel::onSourceRemoved( const source_ptr& source ) } void -SourcesModel::collectionUpdated() +SourcesModel::itemUpdated() { + Q_ASSERT( qobject_cast< SourceTreeItem* >( sender() ) ); + SourceTreeItem* item = qobject_cast< SourceTreeItem* >( sender() ); + if( !item ) + return; + + QModelIndex idx = indexFromItem( item ); + emit dataChanged( idx, idx ); } + void SourcesModel::onItemRowsAddedBegin( int first, int last ) { @@ -362,6 +355,19 @@ SourcesModel::onItemRowsRemovedDone() endRemoveRows(); } +void +SourcesModel::linkSourceItemToPage( SourceTreeItem* item, ViewPage* p ) +{ + // TODO handle removal + m_sourceTreeLinks[ p ] = item; + + if( m_viewPageDelayedCacheItem = p ) + emit selectRequest( indexFromItem( item ) ); + + m_viewPageDelayedCacheItem = 0; +} + + SourceTreeItem* SourcesModel::itemFromIndex( const QModelIndex& idx ) const { diff --git a/src/sourcetree/sourcesmodel.h b/src/sourcetree/sourcesmodel.h index eefc93ede..3793aad9c 100644 --- a/src/sourcetree/sourcesmodel.h +++ b/src/sourcetree/sourcesmodel.h @@ -31,6 +31,7 @@ class SourceTreeItem; namespace Tomahawk { class Source; class Playlist; + class ViewPage; } class SourcesModel : public QAbstractItemModel @@ -43,13 +44,10 @@ public: Collection = 0, Category = 1, - CategoryAdd = 2, StaticPlaylist = 3, - AutomaticPlaylist = 4, - Stations = 5, GenericPage = 6 @@ -85,22 +83,26 @@ public: void appendItem( const Tomahawk::source_ptr& source ); bool removeItem( const Tomahawk::source_ptr& source ); + void linkSourceItemToPage( SourceTreeItem* item, Tomahawk::ViewPage* p ); // HACK i don't like this // SLOW DON'T USE IF YOU CAN AVOID IT - QModelIndex indexFromPlaylist( const Tomahawk::playlist_ptr& playlist ); +// QModelIndex indexFromPlaylist( const Tomahawk::playlist_ptr& playlist ); QModelIndex indexFromItem( SourceTreeItem* item ) const; +signals: + void selectRequest( const QModelIndex& idx ); + private slots: void onSourcesAdded( const QList& sources ); void onSourceAdded( const Tomahawk::source_ptr& source ); void onSourceRemoved( const Tomahawk::source_ptr& source ); - void onSourceChanged(); + void viewPageActivated( Tomahawk::ViewPage* ); public slots: void loadSources(); - void collectionUpdated(); + void itemUpdated(); void onItemRowsAddedBegin( int first, int last ); void onItemRowsAddedDone(); void onItemRowsRemovedBegin( int first, int last ); @@ -114,6 +116,9 @@ private: // QModelIndex indexForCategory( const QModelIndex& sourceIndex, CategoryType type ); SourceTreeItem* m_rootItem; + + QHash< Tomahawk::ViewPage*, SourceTreeItem* > m_sourceTreeLinks; + Tomahawk::ViewPage* m_viewPageDelayedCacheItem; }; #endif // SOURCESMODEL_H diff --git a/src/sourcetree/sourcesproxymodel.cpp b/src/sourcetree/sourcesproxymodel.cpp index dd4d4125a..5e22dea1a 100644 --- a/src/sourcetree/sourcesproxymodel.cpp +++ b/src/sourcetree/sourcesproxymodel.cpp @@ -34,8 +34,9 @@ SourcesProxyModel::SourcesProxyModel( SourcesModel* model, QObject* parent ) // setSortRole( SourcesModel::SortRole ); setSourceModel( model ); - + connect( model, SIGNAL( askForExpand( QModelIndex ) ), this, SLOT( askedToExpand( QModelIndex ) ) ); + connect( model, SIGNAL( selectRequest( QModelIndex ) ), this, SLOT( selectRequested( QModelIndex ) ) ); } @@ -73,3 +74,11 @@ SourcesProxyModel::filterAcceptsRow( int sourceRow, const QModelIndex& sourcePar // accept rows that aren't sources return true; } + +void +SourcesProxyModel::selectRequested( const QModelIndex& idx ) +{ + qDebug() << "asking for select from idx:" << idx << idx.model()->metaObject()->className(); + emit selectRequest( mapFromSource( idx ) ); +} + diff --git a/src/sourcetree/sourcesproxymodel.h b/src/sourcetree/sourcesproxymodel.h index 52b9b6960..cd4cfbf9c 100644 --- a/src/sourcetree/sourcesproxymodel.h +++ b/src/sourcetree/sourcesproxymodel.h @@ -34,6 +34,11 @@ public slots: void showOfflineSources(); void hideOfflineSources(); + void selectRequested( const QModelIndex& ); + +signals: + void selectRequest( const QModelIndex& idx ); + protected: bool filterAcceptsRow( int sourceRow, const QModelIndex& sourceParent ) const; diff --git a/src/sourcetree/sourcetreeitem.cpp b/src/sourcetree/sourcetreeitem.cpp index 30e3e3b40..4e67201eb 100644 --- a/src/sourcetree/sourcetreeitem.cpp +++ b/src/sourcetree/sourcetreeitem.cpp @@ -20,10 +20,11 @@ #include "playlist.h" #include "playlist/dynamic/DynamicPlaylist.h" #include "source.h" -#include +#include "viewmanager.h" #include "tomahawk/tomahawkapp.h" +#include "widgets/newplaylistwidget.h" + #include -#include using namespace Tomahawk; @@ -32,15 +33,16 @@ SourceTreeItem::SourceTreeItem( SourcesModel* model, SourceTreeItem* parent, Sou , m_type( thisType ) , m_parent( parent ) , m_model( model ) -{ +{ connect( this, SIGNAL( beginChildRowsAdded( int,int ) ), m_model, SLOT( onItemRowsAddedBegin( int,int ) ) ); connect( this, SIGNAL( beginChildRowsRemoved( int,int ) ), m_model, SLOT( onItemRowsRemovedBegin( int,int ) ) ); connect( this, SIGNAL( childRowsAdded() ), m_model, SLOT( onItemRowsAddedDone() ) ); connect( this, SIGNAL( childRowsRemoved() ), m_model, SLOT( onItemRowsRemovedDone() ) ); - + connect( this, SIGNAL( updated() ), m_model, SLOT( itemUpdated() ) ); + if( !m_parent ) return; - + // caller must call begin/endInsertRows if( index < 0 ) m_parent->appendChild( this ); @@ -57,7 +59,7 @@ SourceTreeItem::~SourceTreeItem() /// Category item -void +void CategoryItem::activate() { if( m_category == SourcesModel::StationsCategory ) { @@ -77,82 +79,86 @@ PlaylistItem::PlaylistItem( SourcesModel* mdl, SourceTreeItem* parent, const pla SLOT( onPlaylistLoaded( Tomahawk::PlaylistRevision ) ), Qt::QueuedConnection ); connect( pl.data(), SIGNAL( changed() ), SIGNAL( updated() ), Qt::QueuedConnection ); + + if( ViewManager::instance()->pageForPlaylist( pl ) ) + model()->linkSourceItemToPage( this, ViewManager::instance()->pageForPlaylist( pl ) ); } -QString +QString PlaylistItem::text() const { return m_playlist->title(); } -Tomahawk::playlist_ptr +Tomahawk::playlist_ptr PlaylistItem::playlist() const { return m_playlist; } -void +void PlaylistItem::onPlaylistLoaded( Tomahawk::PlaylistRevision revision ) { m_loaded = true; emit updated(); } -void +void PlaylistItem::onPlaylistChanged() { emit updated(); } -Qt::ItemFlags +Qt::ItemFlags PlaylistItem::flags() const { Qt::ItemFlags flags = SourceTreeItem::flags(); - + if( !m_loaded ) flags &= !Qt::ItemIsEnabled; - + flags |= Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled; if( playlist()->author()->isLocal() ) flags |= Qt::ItemIsEditable; - + return flags; } -void +void PlaylistItem::activate() { - PlaylistManager::instance()->show( m_playlist ); + ViewPage* p = ViewManager::instance()->show( m_playlist ); + model()->linkSourceItemToPage( this, p ); } -void +void PlaylistItem::setLoaded( bool loaded ) { m_loaded = loaded; } -bool +bool PlaylistItem::willAcceptDrag( const QMimeData* data ) const { return !m_playlist.isNull() && m_playlist->author()->isLocal(); } -bool +bool PlaylistItem::dropMimeData( const QMimeData* data, Qt::DropAction action ) { if( data->hasFormat( "application/tomahawk.query.list" ) ) { if ( !m_playlist.isNull() && m_playlist->author()->isLocal() ) { - + QByteArray itemData = data->data( "application/tomahawk.query.list" ); QDataStream stream( &itemData, QIODevice::ReadOnly ); QList< Tomahawk::query_ptr > queries; - + while ( !stream.atEnd() ) { qlonglong qptr; stream >> qptr; - + Tomahawk::query_ptr* query = reinterpret_cast(qptr); if ( query && !query->isNull() ) { @@ -160,21 +166,21 @@ PlaylistItem::dropMimeData( const QMimeData* data, Qt::DropAction action ) queries << *query; } } - + qDebug() << "on playlist:" << m_playlist->title() << m_playlist->guid(); - + // TODO do we need to use this in the refactor? // QString rev = item->currentlyLoadedPlaylistRevision( playlist->guid() ); m_playlist->addEntries( queries, m_playlist->currentrevision() ); - + return true; } } - + return false; } -QIcon +QIcon PlaylistItem::icon() const { return QIcon( RESPATH "images/playlist-icon.png" ); @@ -194,32 +200,32 @@ DynPlaylistItem::DynPlaylistItem( SourcesModel* mdl, SourceTreeItem* parent, con } -QString +QString DynPlaylistItem::text() { return m_dynplaylist->title(); } -Tomahawk::playlist_ptr +Tomahawk::playlist_ptr DynPlaylistItem::playlist() const { return m_dynplaylist.staticCast(); } -// Tomahawk::dynplaylist_ptr +// Tomahawk::dynplaylist_ptr // DynPlaylistItem::playlist() const // { // return m_dynplaylist; // } -void +void DynPlaylistItem::activate() { - PlaylistManager::instance()->show( m_playlist ); + ViewManager::instance()->show( m_playlist ); } -void +void DynPlaylistItem::onDynamicPlaylistLoaded( Tomahawk::DynamicPlaylistRevision revision ) { setLoaded( true ); @@ -239,27 +245,29 @@ CategoryAddItem::~CategoryAddItem() } -QString +QString CategoryAddItem::text() const { switch( m_categoryType ) { - case SourcesModel::PlaylistsCategory: + case SourcesModel::PlaylistsCategory: return tr( "New Playlist" ); case SourcesModel::StationsCategory: return tr( "New Station" ); } - + return QString(); } -void +void CategoryAddItem::activate() { switch( m_categoryType ) { - case SourcesModel::PlaylistsCategory: + case SourcesModel::PlaylistsCategory: // only show if none is shown yet - if( !PlaylistManager::instance()->isNewPlaylistPageVisible() ) - PlaylistManager::instance()->show( new NewPlaylistWidget() ); + if( !ViewManager::instance()->isNewPlaylistPageVisible() ) { + ViewPage* p = ViewManager::instance()->show( new NewPlaylistWidget() ); + model()->linkSourceItemToPage( this, p ); + } break; case SourcesModel::StationsCategory: // TODO @@ -267,13 +275,13 @@ CategoryAddItem::activate() } } -Qt::ItemFlags +Qt::ItemFlags CategoryAddItem::flags() const { return Qt::ItemIsEnabled | Qt::ItemIsSelectable; } -QIcon +QIcon CategoryAddItem::icon() const { return QIcon( RESPATH "images/add.png" ); @@ -295,19 +303,19 @@ CategoryItem::CategoryItem( SourcesModel* model, SourceTreeItem* parent, Sources // endRowsAdded(); } -void +void CategoryItem::insertItem( SourceTreeItem* item ) { insertItems( QList< SourceTreeItem* >() << item ); } -void +void CategoryItem::insertItems( QList< SourceTreeItem* > items ) { // add the items to the category, and connect to the signals int curCount = children().size(); if( m_showAdd ) // if there's an add item, add it before that - curCount--; + curCount--; beginRowsAdded( curCount, curCount + items.size() - 1 ); foreach( SourceTreeItem* item, items ) { int index = m_showAdd ? children().count() - 1 : children().count(); @@ -319,7 +327,7 @@ CategoryItem::insertItems( QList< SourceTreeItem* > items ) /// CollectionItem -CollectionItem::CollectionItem( SourcesModel* mdl, SourceTreeItem* parent, const Tomahawk::source_ptr& source ) +CollectionItem::CollectionItem( SourcesModel* mdl, SourceTreeItem* parent, const Tomahawk::source_ptr& source ) : SourceTreeItem( mdl, parent, SourcesModel::Collection ) , m_source( source ) , m_playlists( 0 ) @@ -330,29 +338,37 @@ CollectionItem::CollectionItem( SourcesModel* mdl, SourceTreeItem* parent, cons } // create category items if there are playlists to show, or stations to show QList< playlist_ptr > playlists = source->collection()->playlists(); - + if( !playlists.isEmpty() || source->isLocal() ) { - m_playlists = new CategoryItem( model(), this, SourcesModel::PlaylistsCategory, source->isLocal() ); + m_playlists = new CategoryItem( model(), this, SourcesModel::PlaylistsCategory, source->isLocal() ); // ugh :( we're being added by the model, no need to notify for added rows now // m_playlists->blockSignals( true ); - onPlaylistsAdded( source->collection()->playlists() ); + onPlaylistsAdded( playlists ); // m_playlists->blockSignals( false ); } - + // TODO always show for now, till we actually support stations // m_stations = new CategoryItem( model(), this, SourcesModel::StationsCategory, source->isLocal() ); - - + + if( ViewManager::instance()->pageForCollection( source->collection() ) ) + model()->linkSourceItemToPage( this, ViewManager::instance()->pageForCollection( source->collection() ) ); + // HACK to load only for now source->collection()->dynamicPlaylists(); - + + connect( source.data(), SIGNAL( stats( QVariantMap ) ), this, SIGNAL( updated() ) ); + connect( source.data(), SIGNAL( playbackStarted( Tomahawk::query_ptr ) ), this, SIGNAL( updated() ) ); + connect( source.data(), SIGNAL( stateChanged() ), this, SIGNAL( updated() ) ); + connect( source.data(), SIGNAL( offline() ), this, SIGNAL( updated() ) ); + connect( source.data(), SIGNAL( online() ), this, SIGNAL( updated() ) ); + connect( source->collection().data(), SIGNAL( playlistsAdded( QList ) ), - SLOT( onPlaylistsAdded( QList ) ) ); + SLOT( onPlaylistsAdded( QList ) ), Qt::QueuedConnection ); connect( source->collection().data(), SIGNAL( playlistsDeleted( QList ) ), - SLOT( onPlaylistsDeleted( QList ) ) ); + SLOT( onPlaylistsDeleted( QList ) ), Qt::QueuedConnection ); } -Tomahawk::source_ptr +Tomahawk::source_ptr CollectionItem::source() const { return m_source; @@ -364,17 +380,19 @@ CollectionItem::text() const return m_source.isNull() ? tr( "Super Collection" ) : m_source->friendlyName(); } -void +void CollectionItem::activate() { if( source().isNull() ) { - PlaylistManager::instance()->showSuperCollection(); + ViewPage* p = ViewManager::instance()->showSuperCollection(); + model()->linkSourceItemToPage( this, p ); } else { - PlaylistManager::instance()->show( source()->collection() ); + ViewPage* p = ViewManager::instance()->show( source()->collection() ); + model()->linkSourceItemToPage( this, p ); } } -QIcon +QIcon CollectionItem::icon() const { if( m_source.isNull() ) @@ -384,23 +402,23 @@ CollectionItem::icon() const } -void +void CollectionItem::onPlaylistsAdded( const QList< playlist_ptr >& playlists ) { if( playlists.isEmpty() ) return; - + if( !m_playlists ) { // add the category too - m_playlists = new CategoryItem( model(), this, SourcesModel::PlaylistsCategory, source()->isLocal() ); + m_playlists = new CategoryItem( model(), this, SourcesModel::PlaylistsCategory, source()->isLocal() ); } - + QList< SourceTreeItem* > items; int addOffset = playlists.first()->author()->isLocal() ? 1 : 0; - + int from = m_playlists->children().count() - addOffset; m_playlists->beginRowsAdded( from, from + playlists.count() - 1 ); foreach( const playlist_ptr& p, playlists ) - { + { PlaylistItem* plItem = new PlaylistItem( model(), m_playlists, p, m_playlists->children().count() - addOffset ); qDebug() << "Playlist added:" << p->title() << p->creator() << p->info(); p->loadRevision(); @@ -409,7 +427,7 @@ CollectionItem::onPlaylistsAdded( const QList< playlist_ptr >& playlists ) m_playlists->endRowsAdded(); } -void +void CollectionItem::onPlaylistsDeleted( const QList< playlist_ptr >& playlists ) { Q_ASSERT( m_playlists ); // How can we delete playlists if we have none? @@ -442,26 +460,26 @@ GenericPageItem::~GenericPageItem() } -void +void GenericPageItem::activate() { emit activated(); } -QString +QString GenericPageItem::text() const { return m_text; } -QIcon +QIcon GenericPageItem::icon() const { return m_icon; } -bool +bool GenericPageItem::willAcceptDrag(const QMimeData* data) const { return false; diff --git a/src/sourcetree/sourcetreeitem.h b/src/sourcetree/sourcetreeitem.h index f3699669d..f034078cf 100644 --- a/src/sourcetree/sourcetreeitem.h +++ b/src/sourcetree/sourcetreeitem.h @@ -26,15 +26,15 @@ #include class QMimeData; -class SourceTreeItem : public QObject +class SourceTreeItem : public QObject { Q_OBJECT public: SourceTreeItem() : m_type( SourcesModel::Invalid ), m_parent( 0 ), m_model( 0 ) {} SourceTreeItem( SourcesModel* model, SourceTreeItem* parent, SourcesModel::RowType thisType, int index = -1 ); // if index is -1, append at end of parent's child list virtual ~SourceTreeItem(); - - // generic info used by the tree model + + // generic info used by the tree model SourcesModel::RowType type() const { return m_type; } SourceTreeItem* parent() const { return m_parent; } SourcesModel* model() const { return m_model; } @@ -43,7 +43,7 @@ public: void appendChild( SourceTreeItem* item ) { m_children.append( item ); } void insertChild( int index, SourceTreeItem* item ) { m_children.insert( index, item ); } void removeChild( SourceTreeItem* item ) { m_children.removeAll( item ); } - + // varies depending on the type of the item virtual QString text() const { return QString(); } virtual Qt::ItemFlags flags() const { return Qt::ItemIsSelectable | Qt::ItemIsEnabled; } @@ -51,7 +51,7 @@ public: virtual QIcon icon() const { return QIcon(); } virtual bool willAcceptDrag( const QMimeData* data ) const { return false; } virtual bool dropMimeData( const QMimeData* data, Qt::DropAction action ) { return false; } - + /// don't call me unless you are a sourcetreeitem. i prefer this to making everyone a friend void beginRowsAdded( int from, int to ) { emit beginChildRowsAdded( from, to ); } void endRowsAdded() { emit childRowsAdded(); } @@ -59,15 +59,15 @@ public: void endRowsRemoved() { emit childRowsRemoved(); } signals: void updated(); - + void beginChildRowsAdded( int fromRow, int toRow ); void childRowsAdded(); - + void beginChildRowsRemoved( int fromRow, int toRow ); void childRowsRemoved(); private: SourcesModel::RowType m_type; - + SourceTreeItem* m_parent; QList< SourceTreeItem* > m_children; SourcesModel* m_model; @@ -79,12 +79,12 @@ class CategoryAddItem : public SourceTreeItem public: CategoryAddItem( SourcesModel* model, SourceTreeItem* parent, SourcesModel::CategoryType type ); ~CategoryAddItem(); - + virtual Qt::ItemFlags flags() const; virtual QString text() const; virtual void activate(); virtual QIcon icon() const; - + private: SourcesModel::CategoryType m_categoryType; }; @@ -94,8 +94,8 @@ class CategoryItem : public SourceTreeItem Q_OBJECT public: CategoryItem( SourcesModel* model, SourceTreeItem* parent, SourcesModel::CategoryType category, bool showAddItem ); - - virtual QString text() const { + + virtual QString text() const { switch( m_category ) { case SourcesModel::PlaylistsCategory: @@ -107,13 +107,13 @@ public: } virtual void activate(); virtual Qt::ItemFlags flags() const { return Qt::ItemIsEnabled; } - + // inserts an item at the end, but before the category add item void insertItem( SourceTreeItem* item ); void insertItems( QList< SourceTreeItem* > item ); - + SourcesModel::CategoryType categoryType() { return m_category; } - + private: SourcesModel::CategoryType m_category; CategoryAddItem* m_addItem; @@ -125,20 +125,20 @@ class CollectionItem : public SourceTreeItem Q_OBJECT public: CollectionItem( SourcesModel* model, SourceTreeItem* parent, const Tomahawk::source_ptr& source ); - + virtual QString text() const; virtual void activate(); virtual QIcon icon() const; - + Tomahawk::source_ptr source() const; - + private slots: void onPlaylistsAdded( const QList& playlists ); void onPlaylistsDeleted( const QList& playlists ); - + private: Tomahawk::source_ptr m_source; - + CategoryItem* m_playlists; CategoryItem* m_stations; }; @@ -148,7 +148,7 @@ class PlaylistItem : public SourceTreeItem Q_OBJECT public: PlaylistItem( SourcesModel* model, SourceTreeItem* parent, const Tomahawk::playlist_ptr& pl, int index = -1 ); - + virtual QString text() const; virtual Tomahawk::playlist_ptr playlist() const; virtual Qt::ItemFlags flags() const; @@ -156,14 +156,14 @@ public: virtual bool willAcceptDrag( const QMimeData* data ) const; virtual bool dropMimeData( const QMimeData* data, Qt::DropAction action ); virtual QIcon icon() const; - + protected: void setLoaded( bool loaded ); - + private slots: void onPlaylistLoaded( Tomahawk::PlaylistRevision revision ); void onPlaylistChanged(); - + private: bool m_loaded; Tomahawk::playlist_ptr m_playlist; @@ -175,15 +175,15 @@ class DynPlaylistItem : public PlaylistItem Q_OBJECT public: DynPlaylistItem( SourcesModel* model, SourceTreeItem* parent, const Tomahawk::dynplaylist_ptr& pl ); - + virtual QString text() const; virtual Tomahawk::playlist_ptr playlist() const; // Tomahawk::dynplaylist_ptr playlist() const; virtual void activate(); - + private slots: void onDynamicPlaylistLoaded( Tomahawk::DynamicPlaylistRevision revision ); - + private: Tomahawk::dynplaylist_ptr m_dynplaylist; };*/ @@ -195,15 +195,15 @@ class GenericPageItem : public SourceTreeItem public: GenericPageItem( SourcesModel* model, SourceTreeItem* parent, const QString& text, const QIcon& icon ); virtual ~GenericPageItem(); - + virtual QString text() const; virtual void activate(); virtual bool willAcceptDrag( const QMimeData* data ) const; virtual QIcon icon() const; - + signals: void activated(); - + private: QIcon m_icon; QString m_text; diff --git a/src/sourcetree/sourcetreeview.cpp b/src/sourcetree/sourcetreeview.cpp index d022ad2a1..49e6369a4 100644 --- a/src/sourcetree/sourcetreeview.cpp +++ b/src/sourcetree/sourcetreeview.cpp @@ -19,7 +19,7 @@ #include "sourcetreeview.h" #include "playlist.h" -#include "playlist/playlistmanager.h" +#include "viewmanager.h" #include "sourcesproxymodel.h" #include "sourcelist.h" #include "sourcetree/sourcetreeitem.h" @@ -92,6 +92,8 @@ SourceTreeView::SourceTreeView( QWidget* parent ) m_model = new SourcesModel( this ); m_proxyModel = new SourcesProxyModel( m_model, this ); + connect( m_proxyModel, SIGNAL( selectRequest( QModelIndex ) ), this, SLOT( selectRequest( QModelIndex ) ), Qt::QueuedConnection ); + setModel( m_proxyModel ); header()->setStretchLastSection( false ); @@ -104,17 +106,17 @@ SourceTreeView::SourceTreeView( QWidget* parent ) hideOfflineSources(); - connect( PlaylistManager::instance(), SIGNAL( playlistActivated( Tomahawk::playlist_ptr ) ), + connect( ViewManager::instance(), SIGNAL( playlistActivated( Tomahawk::playlist_ptr ) ), SLOT( onPlaylistActivated( Tomahawk::playlist_ptr ) ) ); // connect( PlaylistManager::instance(), SIGNAL( dynamicPlaylistActivated( Tomahawk::dynplaylist_ptr ) ), // SLOT( onDynamicPlaylistActivated( Tomahawk::dynplaylist_ptr ) ) ); - connect( PlaylistManager::instance(), SIGNAL( collectionActivated( Tomahawk::collection_ptr ) ), + connect( ViewManager::instance(), SIGNAL( collectionActivated( Tomahawk::collection_ptr ) ), SLOT( onCollectionActivated( Tomahawk::collection_ptr ) ) ); - connect( PlaylistManager::instance(), SIGNAL( superCollectionActivated() ), + connect( ViewManager::instance(), SIGNAL( superCollectionActivated() ), SLOT( onSuperCollectionActivated() ) ); - connect( PlaylistManager::instance(), SIGNAL( tempPageActivated() ), + connect( ViewManager::instance(), SIGNAL( tempPageActivated() ), SLOT( onTempPageActivated() ) ); - connect( PlaylistManager::instance(), SIGNAL( newPlaylistActivated() ), + connect( ViewManager::instance(), SIGNAL( newPlaylistActivated() ), SLOT( onNewPlaylistPageActivated() ) ); } @@ -168,12 +170,12 @@ SourceTreeView::hideOfflineSources() void SourceTreeView::onPlaylistActivated( const Tomahawk::playlist_ptr& playlist ) { - QModelIndex idx = m_proxyModel->mapFromSource( m_model->indexFromPlaylist( playlist ) ); - if ( idx.isValid() ) - { - selectionModel()->select( idx, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Current ); +// QModelIndex idx = m_proxyModel->mapFromSource( m_model->indexFromPlaylist( playlist ) ); +// if ( idx.isValid() ) +// { +// selectionModel()->select( idx, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Current ); // setCurrentIndex( idx ); - } +// } } /* @@ -245,6 +247,14 @@ SourceTreeView::onItemExpanded( const QModelIndex& idx ) } } +void +SourceTreeView::selectRequest( const QModelIndex& idx ) +{ + if( !selectionModel()->selectedIndexes().contains( idx ) ) + selectionModel()->select( idx, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Current ); + +} + void SourceTreeView::loadPlaylist() @@ -292,7 +302,9 @@ SourceTreeView::onCustomContextMenu( const QPoint& pos ) if ( model()->data( m_contextMenuIndex, SourcesModel::SourceTreeItemTypeRole ) == SourcesModel::StaticPlaylist ) { - m_playlistMenu.exec( mapToGlobal( pos ) ); + PlaylistItem* item = itemFromIndex< PlaylistItem >( m_contextMenuIndex ); + if( item->playlist()->author()->isLocal() ) + m_playlistMenu.exec( mapToGlobal( pos ) ); } } diff --git a/src/sourcetree/sourcetreeview.h b/src/sourcetree/sourcetreeview.h index 615d8318e..9952ddfa1 100644 --- a/src/sourcetree/sourcetreeview.h +++ b/src/sourcetree/sourcetreeview.h @@ -55,8 +55,8 @@ private slots: void onNewPlaylistPageActivated(); void onItemExpanded( const QModelIndex& idx ); - void onItemActivated( const QModelIndex& index ); + void selectRequest( const QModelIndex& idx ); void loadPlaylist(); void deletePlaylist(); diff --git a/src/tomahawkwindow.cpp b/src/tomahawkwindow.cpp index cfdc431e9..1c7877d68 100644 --- a/src/tomahawkwindow.cpp +++ b/src/tomahawkwindow.cpp @@ -39,7 +39,7 @@ #include "database/database.h" #include "database/databasecommand_collectionstats.h" #include "network/controlconnection.h" -#include "playlist/playlistmanager.h" +#include "viewmanager.h" #include "sip/SipHandler.h" #include "sourcetree/sourcetreeview.h" #include "utils/animatedsplitter.h" @@ -77,7 +77,7 @@ TomahawkWindow::TomahawkWindow( QWidget* parent ) setUnifiedTitleAndToolBarOnMac( true ); #endif - PlaylistManager* pm = new PlaylistManager( this ); + ViewManager* pm = new ViewManager( this ); connect( pm, SIGNAL( historyBackAvailable( bool ) ), SLOT( onHistoryBackAvailable( bool ) ) ); connect( pm, SIGNAL( historyForwardAvailable( bool ) ), SLOT( onHistoryForwardAvailable( bool ) ) ); @@ -131,7 +131,7 @@ TomahawkWindow::TomahawkWindow( QWidget* parent ) buttonWidget->layout()->setSpacing( 0 );*/ ui->splitter->addWidget( sidebarWidget ); - ui->splitter->addWidget( PlaylistManager::instance()->widget() ); + ui->splitter->addWidget( ViewManager::instance()->widget() ); ui->splitter->setStretchFactor( 0, 1 ); ui->splitter->setStretchFactor( 1, 3 ); @@ -167,8 +167,8 @@ TomahawkWindow::TomahawkWindow( QWidget* parent ) connect( checkForUpdates, SIGNAL( triggered() ), updater, SLOT( CheckNow() ) ); #endif - m_backAvailable = toolbar->addAction( QIcon( RESPATH "images/back.png" ), tr( "Back" ), PlaylistManager::instance(), SLOT( historyBack() ) ); - m_forwardAvailable = toolbar->addAction( QIcon( RESPATH "images/forward.png" ), tr( "Forward" ), PlaylistManager::instance(), SLOT( historyForward() ) ); + m_backAvailable = toolbar->addAction( QIcon( RESPATH "images/back.png" ), tr( "Back" ), ViewManager::instance(), SLOT( historyBack() ) ); + m_forwardAvailable = toolbar->addAction( QIcon( RESPATH "images/forward.png" ), tr( "Forward" ), ViewManager::instance(), SLOT( historyForward() ) ); statusBar()->addPermanentWidget( m_audioControls, 1 ); @@ -181,7 +181,7 @@ TomahawkWindow::TomahawkWindow( QWidget* parent ) loadSettings(); setupSignals(); - PlaylistManager::instance()->showWelcomePage(); + ViewManager::instance()->showWelcomePage(); } @@ -241,10 +241,10 @@ void TomahawkWindow::setupSignals() { // - connect( PlaylistManager::instance(), SIGNAL( repeatModeChanged( PlaylistInterface::RepeatMode ) ), + connect( ViewManager::instance(), SIGNAL( repeatModeChanged( PlaylistInterface::RepeatMode ) ), m_audioControls, SLOT( onRepeatModeChanged( PlaylistInterface::RepeatMode ) ) ); - connect( PlaylistManager::instance(), SIGNAL( shuffleModeChanged( bool ) ), + connect( ViewManager::instance(), SIGNAL( shuffleModeChanged( bool ) ), m_audioControls, SLOT( onShuffleModeChanged( bool ) ) ); // @@ -403,7 +403,7 @@ TomahawkWindow::createAutomaticPlaylist() dynplaylist_ptr playlist = DynamicPlaylist::create( author, id, name, info, creator, false ); playlist->setMode( Static ); playlist->createNewRevision( uuid(), playlist->currentrevision(), playlist->type(), playlist->generator()->controls(), playlist->entries() ); - PlaylistManager::instance()->show( playlist ); + ViewManager::instance()->show( playlist ); } @@ -422,14 +422,14 @@ TomahawkWindow::createStation() dynplaylist_ptr playlist = DynamicPlaylist::create( author, id, name, info, creator, false ); playlist->setMode( OnDemand ); playlist->createNewRevision( uuid(), playlist->currentrevision(), playlist->type(), playlist->generator()->controls() ); - PlaylistManager::instance()->show( playlist ); + ViewManager::instance()->show( playlist ); } void TomahawkWindow::createPlaylist() { - PlaylistManager::instance()->show( new NewPlaylistWidget() ); + ViewManager::instance()->show( new NewPlaylistWidget() ); }