From 44ae9f7608d32c5c0187d4d89f118ddfbd7b5e64 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sun, 12 Oct 2014 09:50:01 +0100 Subject: [PATCH] Less calls to itemFromIndex --- .../playlist/PlayableProxyModel.cpp | 36 ++++++++++--------- src/libtomahawk/playlist/PlayableProxyModel.h | 5 +-- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/src/libtomahawk/playlist/PlayableProxyModel.cpp b/src/libtomahawk/playlist/PlayableProxyModel.cpp index 2e9c551db..6fe5cd5af 100644 --- a/src/libtomahawk/playlist/PlayableProxyModel.cpp +++ b/src/libtomahawk/playlist/PlayableProxyModel.cpp @@ -145,25 +145,32 @@ PlayableProxyModel::setSourcePlayableModel( PlayableModel* sourceModel ) bool PlayableProxyModel::filterAcceptsRow( int sourceRow, const QModelIndex& sourceParent ) const { - if ( m_hideDupeItems && !dupeFilterAcceptsRow( sourceRow, sourceParent ) ) - return false; - if ( m_maxVisibleItems > 0 && !visibilityFilterAcceptsRow( sourceRow, sourceParent ) ) + PlayableItem* pi = itemFromIndex( sourceModel()->index( sourceRow, 0, sourceParent ) ); + if ( !pi ) return false; - return nameFilterAcceptsRow( sourceRow, sourceParent ); + return filterAcceptsRowInternal( sourceRow, pi, sourceParent ); } bool -PlayableProxyModel::dupeFilterAcceptsRow( int sourceRow, const QModelIndex& sourceParent ) const +PlayableProxyModel::filterAcceptsRowInternal( int sourceRow, PlayableItem* pi, const QModelIndex& sourceParent ) const +{ + if ( m_hideDupeItems && !dupeFilterAcceptsRow( sourceRow, pi, sourceParent ) ) + return false; + if ( m_maxVisibleItems > 0 && !visibilityFilterAcceptsRow( sourceRow, sourceParent ) ) + return false; + + return nameFilterAcceptsRow( sourceRow, pi, sourceParent ); +} + + +bool +PlayableProxyModel::dupeFilterAcceptsRow( int sourceRow, PlayableItem* pi, const QModelIndex& sourceParent ) const { if ( !m_hideDupeItems ) return true; - PlayableItem* pi = itemFromIndex( sourceModel()->index( sourceRow, 0, sourceParent ) ); - if ( !pi ) - return false; - for ( int i = 0; i < sourceRow; i++ ) { PlayableItem* di = itemFromIndex( sourceModel()->index( i, 0, sourceParent ) ); @@ -174,7 +181,7 @@ PlayableProxyModel::dupeFilterAcceptsRow( int sourceRow, const QModelIndex& sour ( pi->album() && pi->album() == di->album() ) || ( pi->artist() && pi->artist()->name() == di->artist()->name() ); - if ( b && filterAcceptsRow( i, sourceParent ) ) + if ( b && filterAcceptsRowInternal( i, di, sourceParent ) ) return false; } @@ -191,7 +198,8 @@ PlayableProxyModel::visibilityFilterAcceptsRow( int sourceRow, const QModelIndex int items = 0; for ( int i = 0; ( i < sourceRow ) && ( items < m_maxVisibleItems ) ; i++ ) { - if ( dupeFilterAcceptsRow( i, sourceParent ) && nameFilterAcceptsRow( i, sourceParent ) ) + PlayableItem* pi = itemFromIndex( sourceModel()->index( i, 0, sourceParent ) ); + if ( pi && dupeFilterAcceptsRow( i, pi, sourceParent ) && nameFilterAcceptsRow( i, pi, sourceParent ) ) { items++; } @@ -202,12 +210,8 @@ PlayableProxyModel::visibilityFilterAcceptsRow( int sourceRow, const QModelIndex bool -PlayableProxyModel::nameFilterAcceptsRow( int sourceRow, const QModelIndex& sourceParent ) const +PlayableProxyModel::nameFilterAcceptsRow( int sourceRow, PlayableItem* pi, const QModelIndex& sourceParent ) const { - PlayableItem* pi = itemFromIndex( sourceModel()->index( sourceRow, 0, sourceParent ) ); - if ( !pi ) - return false; - if ( m_hideEmptyParents && pi->source() ) { if ( !sourceModel()->rowCount( sourceModel()->index( sourceRow, 0, sourceParent ) ) ) diff --git a/src/libtomahawk/playlist/PlayableProxyModel.h b/src/libtomahawk/playlist/PlayableProxyModel.h index f4b3ee802..9adc0aa93 100644 --- a/src/libtomahawk/playlist/PlayableProxyModel.h +++ b/src/libtomahawk/playlist/PlayableProxyModel.h @@ -117,8 +117,9 @@ private slots: void onCurrentIndexChanged( const QModelIndex& newIndex, const QModelIndex& oldIndex ); private: - bool nameFilterAcceptsRow( int sourceRow, const QModelIndex& sourceParent ) const; - bool dupeFilterAcceptsRow( int sourceRow, const QModelIndex& sourceParent ) const; + bool filterAcceptsRowInternal( int sourceRow, PlayableItem* pi, const QModelIndex& sourceParent ) const; + bool nameFilterAcceptsRow( int sourceRow, PlayableItem* pi, const QModelIndex& sourceParent ) const; + bool dupeFilterAcceptsRow( int sourceRow, PlayableItem* pi, const QModelIndex& sourceParent ) const; bool visibilityFilterAcceptsRow( int sourceRow, const QModelIndex& sourceParent ) const; bool lessThan( int column, const Tomahawk::query_ptr& left, const Tomahawk::query_ptr& right ) const;