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 );