diff --git a/src/sourcetree/items/collectionitem.cpp b/src/sourcetree/items/collectionitem.cpp index f50361182..be236f272 100644 --- a/src/sourcetree/items/collectionitem.cpp +++ b/src/sourcetree/items/collectionitem.cpp @@ -409,7 +409,8 @@ CollectionItem::requestExpanding() void CollectionItem::tempPageActivated( Tomahawk::ViewPage* v ) { - int idx = children().count(); + const int idx = children().count(); + const int latest = children().last()->IDValue(); foreach ( TemporaryPageItem* page, m_tempItems ) { @@ -420,13 +421,28 @@ CollectionItem::tempPageActivated( Tomahawk::ViewPage* v ) } } + // Only keep 5 temporary pages at once + while ( m_tempItems.size() > 5 ) + { + TemporaryPageItem* item = m_tempItems.takeFirst(); + QTimer::singleShot( 0, item, SLOT( removeFromList() ) ); + } emit beginRowsAdded( idx, idx ); - TemporaryPageItem* tempPage = new TemporaryPageItem( model(), this, v, idx ); + TemporaryPageItem* tempPage = new TemporaryPageItem( model(), this, v, latest + 1 ); + connect( tempPage, SIGNAL( removed() ), this, SLOT( temporaryPageDestroyed() ) ); m_tempItems << tempPage; endRowsAdded(); emit selectRequest( tempPage ); } +void +CollectionItem::temporaryPageDestroyed() +{ + TemporaryPageItem* tempPage = qobject_cast< TemporaryPageItem* >( sender() ); + Q_ASSERT( tempPage ); + m_tempItems.removeAll( tempPage ); +} + ViewPage* CollectionItem::sourceInfoClicked() diff --git a/src/sourcetree/items/collectionitem.h b/src/sourcetree/items/collectionitem.h index 9d991d228..e2ba91e10 100644 --- a/src/sourcetree/items/collectionitem.h +++ b/src/sourcetree/items/collectionitem.h @@ -65,6 +65,7 @@ private slots: void requestExpanding(); void tempPageActivated( Tomahawk::ViewPage* ); + void temporaryPageDestroyed(); Tomahawk::ViewPage* sourceInfoClicked(); Tomahawk::ViewPage* getSourceInfoPage() const; diff --git a/src/sourcetree/items/temporarypageitem.cpp b/src/sourcetree/items/temporarypageitem.cpp index ee86b03d6..6ae083aa1 100644 --- a/src/sourcetree/items/temporarypageitem.cpp +++ b/src/sourcetree/items/temporarypageitem.cpp @@ -55,6 +55,13 @@ TemporaryPageItem::peerSortValue() const return m_sortValue; } +int +TemporaryPageItem::IDValue() const +{ + return m_sortValue; +} + + void TemporaryPageItem::removeFromList() { @@ -67,5 +74,7 @@ TemporaryPageItem::removeFromList() parent()->removeChild( this ); parent()->endRowsRemoved(); + emit removed(); + deleteLater(); } diff --git a/src/sourcetree/items/temporarypageitem.h b/src/sourcetree/items/temporarypageitem.h index fe32d8a12..c2864f218 100644 --- a/src/sourcetree/items/temporarypageitem.h +++ b/src/sourcetree/items/temporarypageitem.h @@ -33,11 +33,17 @@ public: virtual QIcon icon() const; virtual int peerSortValue() const; + virtual int IDValue() const; - void removeFromList(); Tomahawk::ViewPage* page() const { return m_page; } virtual bool isBeingPlayed() const { return m_page->isBeingPlayed(); } +public slots: + void removeFromList(); + +signals: + bool removed(); + private: Tomahawk::ViewPage* m_page; QIcon m_icon;