From 91c1bc63cd9f42b0ccf887b5a7c7cf314af2a8c2 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Wed, 28 Nov 2012 08:02:43 +0100 Subject: [PATCH] * Implemented new PlaylistInterface in Tree- & PlayableProxyModelPlaylistInterface. --- .../PlayableProxyModelPlaylistInterface.cpp | 30 ++++++++++---- .../PlayableProxyModelPlaylistInterface.h | 4 +- .../TreeProxyModelPlaylistInterface.cpp | 41 ++++++++++++++++--- .../TreeProxyModelPlaylistInterface.h | 6 +-- 4 files changed, 62 insertions(+), 19 deletions(-) diff --git a/src/libtomahawk/playlist/PlayableProxyModelPlaylistInterface.cpp b/src/libtomahawk/playlist/PlayableProxyModelPlaylistInterface.cpp index f08b51cdd..1cae734d0 100644 --- a/src/libtomahawk/playlist/PlayableProxyModelPlaylistInterface.cpp +++ b/src/libtomahawk/playlist/PlayableProxyModelPlaylistInterface.cpp @@ -111,7 +111,7 @@ PlayableProxyModelPlaylistInterface::onModelChanged() QList< Tomahawk::query_ptr > -PlayableProxyModelPlaylistInterface::tracks() +PlayableProxyModelPlaylistInterface::tracks() const { if ( m_proxyModel.isNull() ) return QList< query_ptr >(); @@ -148,7 +148,7 @@ PlayableProxyModelPlaylistInterface::setCurrentIndex( qint64 index ) qint64 -PlayableProxyModelPlaylistInterface::siblingIndex( int itemsAway ) const +PlayableProxyModelPlaylistInterface::siblingIndex( int itemsAway, qint64 rootIndex ) const { if ( m_proxyModel.isNull() ) return -1; @@ -209,14 +209,28 @@ PlayableProxyModelPlaylistInterface::siblingIndex( int itemsAway ) const } } } - else if ( proxyModel->currentIndex().isValid() ) + else { - // random mode is disabled - idx = proxyModel->currentIndex(); - - if ( m_repeatMode != PlaylistModes::RepeatOne ) + if ( m_repeatMode == PlaylistModes::RepeatOne ) { - // keep progressing through the playlist normally + idx = proxyModel->currentIndex(); + } + else + { + // random mode is disabled + if ( rootIndex == -1 ) + { + idx = proxyModel->currentIndex(); + } + else + { + PlayableItem* pitem = static_cast( (void*)rootIndex ); + if ( !pitem ) + return -1; + + idx = proxyModel->mapFromSource( pitem->index ); + } + idx = proxyModel->index( idx.row() + itemsAway, 0 ); } } diff --git a/src/libtomahawk/playlist/PlayableProxyModelPlaylistInterface.h b/src/libtomahawk/playlist/PlayableProxyModelPlaylistInterface.h index a8a2b479d..e3f51bc83 100644 --- a/src/libtomahawk/playlist/PlayableProxyModelPlaylistInterface.h +++ b/src/libtomahawk/playlist/PlayableProxyModelPlaylistInterface.h @@ -39,7 +39,7 @@ public: explicit PlayableProxyModelPlaylistInterface( PlayableProxyModel* proxyModel ); virtual ~PlayableProxyModelPlaylistInterface(); - virtual QList tracks(); + virtual QList tracks() const; virtual int trackCount() const; @@ -50,7 +50,7 @@ public: virtual qint64 indexOfQuery( const Tomahawk::query_ptr& query ) const; virtual Tomahawk::result_ptr currentItem() const; - virtual qint64 siblingIndex( int itemsAway ) const; + virtual qint64 siblingIndex( int itemsAway, qint64 rootIndex = -1 ) const; virtual QString filter() const; diff --git a/src/libtomahawk/playlist/TreeProxyModelPlaylistInterface.cpp b/src/libtomahawk/playlist/TreeProxyModelPlaylistInterface.cpp index 64ced56e3..54e2b25c5 100644 --- a/src/libtomahawk/playlist/TreeProxyModelPlaylistInterface.cpp +++ b/src/libtomahawk/playlist/TreeProxyModelPlaylistInterface.cpp @@ -83,13 +83,26 @@ TreeProxyModelPlaylistInterface::setCurrentIndex( qint64 index ) qint64 -TreeProxyModelPlaylistInterface::siblingIndex( int itemsAway ) const +TreeProxyModelPlaylistInterface::siblingIndex( int itemsAway, qint64 rootIndex ) const { if ( m_proxyModel.isNull() ) return -1; TreeProxyModel* proxyModel = m_proxyModel.data(); - QModelIndex idx = proxyModel->currentIndex(); + QModelIndex idx; + + if ( rootIndex == -1 ) + { + idx = proxyModel->currentIndex(); + } + else + { + PlayableItem* pitem = static_cast( (void*)rootIndex ); + if ( !pitem ) + return -1; + + idx = proxyModel->mapFromSource( pitem->index ); + } if ( !idx.isValid() ) return -1; @@ -149,7 +162,7 @@ TreeProxyModelPlaylistInterface::currentItem() const QList< Tomahawk::query_ptr > -TreeProxyModelPlaylistInterface::tracks() +TreeProxyModelPlaylistInterface::tracks() const { Q_ASSERT( false ); QList< Tomahawk::query_ptr > queries; @@ -163,10 +176,26 @@ TreeProxyModelPlaylistInterface::indexOfResult( const result_ptr& result ) const if ( m_proxyModel.isNull() ) return -1; - QModelIndex idx = m_proxyModel.data()->indexFromResult( result ); - if ( idx.isValid() ) + PlayableItem* item = m_proxyModel.data()->itemFromResult( result ); + if ( item ) { - return (qint64)( m_proxyModel.data()->mapToSource( idx ).internalPointer() ); + return (qint64)( item->index.internalPointer() ); + } + + return -1; +} + + +qint64 +TreeProxyModelPlaylistInterface::indexOfQuery( const query_ptr& query ) const +{ + if ( m_proxyModel.isNull() ) + return -1; + + PlayableItem* item = m_proxyModel.data()->itemFromQuery( query ); + if ( item ) + { + return (qint64)( item->index.internalPointer() ); } return -1; diff --git a/src/libtomahawk/playlist/TreeProxyModelPlaylistInterface.h b/src/libtomahawk/playlist/TreeProxyModelPlaylistInterface.h index 3a9e9a082..b02696239 100644 --- a/src/libtomahawk/playlist/TreeProxyModelPlaylistInterface.h +++ b/src/libtomahawk/playlist/TreeProxyModelPlaylistInterface.h @@ -39,17 +39,17 @@ public: explicit TreeProxyModelPlaylistInterface( TreeProxyModel* proxyModel ); virtual ~TreeProxyModelPlaylistInterface(); - virtual QList< Tomahawk::query_ptr > tracks(); + virtual QList< Tomahawk::query_ptr > tracks() const; virtual int trackCount() const; virtual Tomahawk::result_ptr resultAt( qint64 index ) const; virtual Tomahawk::query_ptr queryAt( qint64 index ) const; virtual qint64 indexOfResult( const Tomahawk::result_ptr& result ) const; - virtual qint64 indexOfQuery( const Tomahawk::query_ptr& query ) const { Q_UNUSED( query ); Q_ASSERT( false ); return -1; } + virtual qint64 indexOfQuery( const Tomahawk::query_ptr& query ) const; virtual void setCurrentIndex( qint64 index ); virtual Tomahawk::result_ptr currentItem() const; - virtual qint64 siblingIndex( int itemsAway ) const; + virtual qint64 siblingIndex( int itemsAway, qint64 rootIndex = -1 ) const; virtual QString filter() const;