diff --git a/data/images/create-playlist.png b/data/images/create-playlist.png new file mode 100644 index 000000000..0ea11f467 Binary files /dev/null and b/data/images/create-playlist.png differ diff --git a/resources.qrc b/resources.qrc index 7442790aa..586b11a01 100644 --- a/resources.qrc +++ b/resources.qrc @@ -75,6 +75,7 @@ ./data/images/forward.png ./data/images/music-icon.png ./data/images/configure.png +./data/images/create-playlist.png ./data/topbar-radiobuttons.css ./data/icons/tomahawk-icon-16x16.png ./data/icons/tomahawk-icon-32x32.png diff --git a/src/libtomahawk/playlist/playlistmanager.cpp b/src/libtomahawk/playlist/playlistmanager.cpp index da1dbeaed..a056529a8 100644 --- a/src/libtomahawk/playlist/playlistmanager.cpp +++ b/src/libtomahawk/playlist/playlistmanager.cpp @@ -577,8 +577,9 @@ PlaylistManager::setPage( ViewPage* page, bool trackHistory ) emit superCollectionActivated(); else if( isNewPlaylistPageVisible() ) emit newPlaylistActivated(); + /* TODO refactor. now we have rows in the sourcetreeview that are connected to pages, e.g. Stations, Recently Updated, etc else if ( !currentPlaylistInterface() ) - emit tempPageActivated(); + emit tempPageActivated();*/ if ( !AudioEngine::instance()->isPlaying() ) AudioEngine::instance()->setPlaylist( currentPlaylistInterface() ); diff --git a/src/sourcetree/sourcesmodel.cpp b/src/sourcetree/sourcesmodel.cpp index 68cc8b102..adc6100ad 100644 --- a/src/sourcetree/sourcesmodel.cpp +++ b/src/sourcetree/sourcesmodel.cpp @@ -23,9 +23,11 @@ #include "playlist.h" #include "collection.h" #include "source.h" +#include "tomahawk/tomahawkapp.h" #include #include +#include using namespace Tomahawk; @@ -36,6 +38,10 @@ SourcesModel::SourcesModel( QObject* parent ) appendItem( source_ptr() ); + // add misc children of root node + GenericPageItem* recent = new GenericPageItem( this, m_rootItem->children().at( 0 ), tr( "Recently Played" ), QIcon( RESPATH "images/home.png" ) ); + connect( recent, SIGNAL( activated() ), PlaylistManager::instance(), SLOT( showWelcomePage() ) ); + onSourcesAdded( SourceList::instance()->sources() ); connect( SourceList::instance(), SIGNAL( sourceAdded( Tomahawk::source_ptr ) ), SLOT( onSourceAdded( Tomahawk::source_ptr ) ) ); diff --git a/src/sourcetree/sourcesmodel.h b/src/sourcetree/sourcesmodel.h index b91e6f324..eefc93ede 100644 --- a/src/sourcetree/sourcesmodel.h +++ b/src/sourcetree/sourcesmodel.h @@ -51,6 +51,8 @@ public: AutomaticPlaylist = 4, Stations = 5, + + GenericPage = 6 }; enum CategoryType { diff --git a/src/sourcetree/sourcetreeitem.cpp b/src/sourcetree/sourcetreeitem.cpp index 073a48f7b..1a09760f2 100644 --- a/src/sourcetree/sourcetreeitem.cpp +++ b/src/sourcetree/sourcetreeitem.cpp @@ -174,6 +174,12 @@ PlaylistItem::dropMimeData( const QMimeData* data, Qt::DropAction action ) return false; } +QIcon +PlaylistItem::icon() const +{ + return QIcon( RESPATH "images/playlist-icon.png" ); +} + /// Dynamic Playlist Item /* @@ -270,7 +276,7 @@ CategoryAddItem::flags() const QIcon CategoryAddItem::icon() const { - return QIcon( RESPATH "images/list-add.png" ); + return QIcon( RESPATH "images/create-playlist.png" ); } // CategoryItem @@ -316,19 +322,26 @@ CategoryItem::insertItems( QList< SourceTreeItem* > items ) CollectionItem::CollectionItem( SourcesModel* mdl, SourceTreeItem* parent, const Tomahawk::source_ptr& source ) : SourceTreeItem( mdl, parent, SourcesModel::Collection ) , m_source( source ) + , m_playlists( 0 ) + , m_stations( 0 ) { if( m_source.isNull() ) { // super collection return; } - // create category item - m_playlists = new CategoryItem( model(), this, SourcesModel::PlaylistsCategory, source->isLocal() ); + // create category items if there are playlists to show, or stations to show + QList< playlist_ptr > playlists = source->collection()->playlists(); - m_stations = new CategoryItem( model(), this, SourcesModel::StationsCategory, source->isLocal() ); + if( !playlists.isEmpty() || 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() ); +// m_playlists->blockSignals( false ); + } + + // TODO always show for now, till we actually support stations +// m_stations = new CategoryItem( model(), this, SourcesModel::StationsCategory, 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() ); - m_playlists->blockSignals( false ); // HACK to load only for now source->collection()->dynamicPlaylists(); @@ -368,6 +381,10 @@ 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() ); + } + QList< SourceTreeItem* > items; int addOffset = playlists.first()->author()->isLocal() ? 1 : 0; @@ -386,6 +403,7 @@ CollectionItem::onPlaylistsAdded( const QList< playlist_ptr >& playlists ) void CollectionItem::onPlaylistsDeleted( const QList< playlist_ptr >& playlists ) { + Q_ASSERT( m_playlists ); // How can we delete playlists if we have none? QList< SourceTreeItem* > items; foreach( const playlist_ptr& playlist, playlists ) { int curCount = m_playlists->children().count(); @@ -400,3 +418,43 @@ CollectionItem::onPlaylistsDeleted( const QList< playlist_ptr >& playlists ) } } } + +/// Generic page item +GenericPageItem::GenericPageItem( SourcesModel* model, SourceTreeItem* parent, const QString& text, const QIcon& icon ) + : SourceTreeItem( model, parent, SourcesModel::GenericPage ) + , m_icon( icon ) + , m_text( text ) +{ + +} + +GenericPageItem::~GenericPageItem() +{ + +} + +void +GenericPageItem::activate() +{ + emit activated(); +} + +QString +GenericPageItem::text() const +{ + return m_text; +} + +QIcon +GenericPageItem::icon() const +{ + return m_icon; +} + + +bool +GenericPageItem::willAcceptDrag(const QMimeData* data) const +{ + return false; +} + diff --git a/src/sourcetree/sourcetreeitem.h b/src/sourcetree/sourcetreeitem.h index 3477e66a0..b0f5654fd 100644 --- a/src/sourcetree/sourcetreeitem.h +++ b/src/sourcetree/sourcetreeitem.h @@ -154,6 +154,7 @@ public: virtual void activate(); 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 ); @@ -186,6 +187,27 @@ private: Tomahawk::dynplaylist_ptr m_dynplaylist; };*/ +// generic item that has some name, some text, and calls a certain slot when activated. badabing! +class GenericPageItem : public SourceTreeItem +{ + Q_OBJECT +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; +}; + Q_DECLARE_METATYPE( SourceTreeItem* ); #endif // SOURCETREEITEM_H diff --git a/src/tomahawkwindow.cpp b/src/tomahawkwindow.cpp index 62a442946..cfdc431e9 100644 --- a/src/tomahawkwindow.cpp +++ b/src/tomahawkwindow.cpp @@ -169,7 +169,6 @@ TomahawkWindow::TomahawkWindow( QWidget* parent ) 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() ) ); - toolbar->addAction( QIcon( RESPATH "images/home.png" ), tr( "Home" ), PlaylistManager::instance(), SLOT( showWelcomePage() ) ); statusBar()->addPermanentWidget( m_audioControls, 1 );