From c4a450e5de1c28db5a6dcec87b82e83b678e7220 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 5 Sep 2011 04:50:22 +0200 Subject: [PATCH] * Add filter capabilities to TreeModel / -View. --- .../database/databasecommand_allartists.cpp | 23 +++++++++++++++---- .../database/databasecommand_allartists.h | 2 ++ src/libtomahawk/playlist/artistview.cpp | 9 ++++++++ src/libtomahawk/playlist/artistview.h | 2 +- src/libtomahawk/playlist/trackproxymodel.cpp | 1 - src/libtomahawk/playlist/trackview.cpp | 3 +-- src/libtomahawk/playlist/treemodel.cpp | 15 ++++++++++++ src/libtomahawk/playlist/treemodel.h | 4 ++++ src/libtomahawk/playlist/treeproxymodel.cpp | 9 ++++---- src/libtomahawk/playlist/treeproxymodel.h | 1 + 10 files changed, 56 insertions(+), 13 deletions(-) diff --git a/src/libtomahawk/database/databasecommand_allartists.cpp b/src/libtomahawk/database/databasecommand_allartists.cpp index 80168e88a..24def0638 100644 --- a/src/libtomahawk/database/databasecommand_allartists.cpp +++ b/src/libtomahawk/database/databasecommand_allartists.cpp @@ -29,7 +29,7 @@ DatabaseCommand_AllArtists::exec( DatabaseImpl* dbi ) { TomahawkSqlQuery query = dbi->newquery(); QList al; - QString orderToken, sourceToken; + QString orderToken, sourceToken, filterToken, tables; switch ( m_sortOrder ) { @@ -41,20 +41,33 @@ DatabaseCommand_AllArtists::exec( DatabaseImpl* dbi ) } if ( !m_collection.isNull() ) - sourceToken = QString( "AND file.source %1 " ).arg( m_collection->source()->isLocal() ? "IS NULL" : QString( "= %1" ).arg( m_collection->source()->id() ) ); + sourceToken = QString( "AND file.source %1" ).arg( m_collection->source()->isLocal() ? "IS NULL" : QString( "= %1" ).arg( m_collection->source()->id() ) ); + + if ( !m_filter.isEmpty() ) + { + filterToken = QString( "AND file_join.track = track.id AND ( artist.name LIKE :filter OR track.name LIKE :filter )" ); + tables = "artist, track, file, file_join"; + } + else + tables = "artist, file, file_join"; QString sql = QString( "SELECT DISTINCT artist.id, artist.name " - "FROM artist, file, file_join " + "FROM %1 " "WHERE file.id = file_join.file " "AND file_join.artist = artist.id " - "%1 %2 %3 %4" - ).arg( sourceToken ) + "%2 %3 %4 %5 %6" + ).arg( tables ) + .arg( sourceToken ) + .arg( filterToken ) .arg( m_sortOrder > 0 ? QString( "ORDER BY %1" ).arg( orderToken ) : QString() ) .arg( m_sortDescending ? "DESC" : QString() ) .arg( m_amount > 0 ? QString( "LIMIT 0, %1" ).arg( m_amount ) : QString() ); query.prepare( sql ); + if ( !m_filter.isEmpty() ) + query.bindValue( ":filter", QString( "%%1%" ).arg( m_filter ) ); + query.exec(); while( query.next() ) diff --git a/src/libtomahawk/database/databasecommand_allartists.h b/src/libtomahawk/database/databasecommand_allartists.h index 6d13a107c..8abf29a46 100644 --- a/src/libtomahawk/database/databasecommand_allartists.h +++ b/src/libtomahawk/database/databasecommand_allartists.h @@ -54,6 +54,7 @@ public: void setLimit( unsigned int amount ) { m_amount = amount; } void setSortOrder( DatabaseCommand_AllArtists::SortOrder order ) { m_sortOrder = order; } void setSortDescending( bool descending ) { m_sortDescending = descending; } + void setFilter( const QString& filter ) { m_filter = filter; } signals: void artists( const QList& ); @@ -64,6 +65,7 @@ private: unsigned int m_amount; DatabaseCommand_AllArtists::SortOrder m_sortOrder; bool m_sortDescending; + QString m_filter; }; #endif // DATABASECOMMAND_ALLARTISTS_H diff --git a/src/libtomahawk/playlist/artistview.cpp b/src/libtomahawk/playlist/artistview.cpp index 5f0d45f23..584902930 100644 --- a/src/libtomahawk/playlist/artistview.cpp +++ b/src/libtomahawk/playlist/artistview.cpp @@ -203,6 +203,15 @@ ArtistView::onFilterChanged( const QString& ) { if ( selectedIndexes().count() ) scrollTo( selectedIndexes().at( 0 ), QAbstractItemView::PositionAtCenter ); + + if ( !proxyModel()->filter().isEmpty() && !proxyModel()->trackCount() && model()->trackCount() ) + { +/* m_overlay->setText( tr( "Sorry, your filter '%1' did not match any results." ).arg( proxyModel()->filter() ) ); + m_overlay->show();*/ + } +/* else + if ( model()->trackCount() ) + m_overlay->hide();*/ } diff --git a/src/libtomahawk/playlist/artistview.h b/src/libtomahawk/playlist/artistview.h index 65d1ae455..3f7a522d3 100644 --- a/src/libtomahawk/playlist/artistview.h +++ b/src/libtomahawk/playlist/artistview.h @@ -60,7 +60,7 @@ public: virtual QPixmap pixmap() const { return QPixmap( RESPATH "images/music-icon.png" ); } virtual bool showStatsBar() const { return false; } - virtual bool showFilter() const { return false; } + virtual bool showFilter() const { return true; } virtual void setShowModes( bool b ) { m_showModes = b; } virtual bool showModes() const { return m_showModes; } diff --git a/src/libtomahawk/playlist/trackproxymodel.cpp b/src/libtomahawk/playlist/trackproxymodel.cpp index db02960af..b3d871a81 100644 --- a/src/libtomahawk/playlist/trackproxymodel.cpp +++ b/src/libtomahawk/playlist/trackproxymodel.cpp @@ -65,7 +65,6 @@ TrackProxyModel::setSourceTrackModel( TrackModel* sourceModel ) void TrackProxyModel::setFilter( const QString& pattern ) { - qDebug() << Q_FUNC_INFO; PlaylistInterface::setFilter( pattern ); setFilterRegExp( pattern ); diff --git a/src/libtomahawk/playlist/trackview.cpp b/src/libtomahawk/playlist/trackview.cpp index d2d37cee5..341815a1e 100644 --- a/src/libtomahawk/playlist/trackview.cpp +++ b/src/libtomahawk/playlist/trackview.cpp @@ -364,8 +364,7 @@ TrackView::onFilterChanged( const QString& ) if ( selectedIndexes().count() ) scrollTo( selectedIndexes().at( 0 ), QAbstractItemView::PositionAtCenter ); - if ( !proxyModel()->filter().isEmpty() && !proxyModel()->trackCount() && - model()->trackCount() ) + if ( !proxyModel()->filter().isEmpty() && !proxyModel()->trackCount() && model()->trackCount() ) { m_overlay->setText( tr( "Sorry, your filter '%1' did not match any results." ).arg( proxyModel()->filter() ) ); m_overlay->show(); diff --git a/src/libtomahawk/playlist/treemodel.cpp b/src/libtomahawk/playlist/treemodel.cpp index 34b7abbc4..045065daf 100644 --- a/src/libtomahawk/playlist/treemodel.cpp +++ b/src/libtomahawk/playlist/treemodel.cpp @@ -528,6 +528,7 @@ TreeModel::addAllCollections() emit loadingStarted(); DatabaseCommand_AllArtists* cmd = new DatabaseCommand_AllArtists(); + cmd->setFilter( m_filter ); connect( cmd, SIGNAL( artists( QList ) ), SLOT( onArtistsAdded( QList ) ) ); @@ -601,6 +602,7 @@ TreeModel::addCollection( const collection_ptr& collection ) m_collection = collection; DatabaseCommand_AllArtists* cmd = new DatabaseCommand_AllArtists( collection ); + cmd->setFilter( m_filter ); connect( cmd, SIGNAL( artists( QList ) ), SLOT( onArtistsAdded( QList ) ) ); @@ -783,6 +785,19 @@ TreeModel::infoSystemInfo( Tomahawk::InfoSystem::InfoRequestData requestData, QV } +void +TreeModel::setFilter( const QString& pattern ) +{ + m_filter = pattern; + clear(); + + if ( !m_collection.isNull() ) + addCollection( m_collection ); + else + addAllCollections(); +} + + void TreeModel::infoSystemFinished( QString target ) { diff --git a/src/libtomahawk/playlist/treemodel.h b/src/libtomahawk/playlist/treemodel.h index 153da19c8..1f08a7bdc 100644 --- a/src/libtomahawk/playlist/treemodel.h +++ b/src/libtomahawk/playlist/treemodel.h @@ -99,6 +99,9 @@ public: virtual void setTitle( const QString& title ) { m_title = title; } virtual void setDescription( const QString& description ) { m_description = description; } + virtual QString filter() const { return m_filter; } + virtual void setFilter( const QString& pattern ); + TreeModelItem* itemFromIndex( const QModelIndex& index ) const { if ( index.isValid() ) @@ -153,6 +156,7 @@ private: Tomahawk::collection_ptr m_collection; QHash m_coverHash; + QString m_filter; }; #endif // ALBUMMODEL_H diff --git a/src/libtomahawk/playlist/treeproxymodel.cpp b/src/libtomahawk/playlist/treeproxymodel.cpp index a8ffe3e7f..dd9da31da 100644 --- a/src/libtomahawk/playlist/treeproxymodel.cpp +++ b/src/libtomahawk/playlist/treeproxymodel.cpp @@ -63,10 +63,12 @@ TreeProxyModel::setSourceTreeModel( TreeModel* sourceModel ) void TreeProxyModel::setFilter( const QString& pattern ) { - qDebug() << Q_FUNC_INFO; + PlaylistInterface::setFilter( pattern ); setFilterRegExp( pattern ); + m_model->setFilter( pattern ); emit filterChanged( pattern ); + emit trackCountChanged( trackCount() ); } @@ -110,8 +112,7 @@ TreeProxyModel::filterAcceptsRow( int sourceRow, const QModelIndex& sourceParent m_cache.insertMulti( sourceParent, pi->result() ); } - if ( filterRegExp().isEmpty() ) - return true; + return true; QStringList sl = filterRegExp().pattern().split( " ", QString::SkipEmptyParts ); bool found = true; @@ -241,7 +242,7 @@ TreeProxyModel::textForItem( TreeModelItem* item ) const { if ( !item ) return QString(); - + if ( !item->artist().isNull() ) { return item->artist()->name(); diff --git a/src/libtomahawk/playlist/treeproxymodel.h b/src/libtomahawk/playlist/treeproxymodel.h index 1600699ec..b50ae6268 100644 --- a/src/libtomahawk/playlist/treeproxymodel.h +++ b/src/libtomahawk/playlist/treeproxymodel.h @@ -54,6 +54,7 @@ public: virtual Tomahawk::result_ptr siblingItem( int direction ); virtual Tomahawk::result_ptr siblingItem( int direction, bool readOnly ); + virtual QString filter() const { return filterRegExp().pattern(); } virtual void setFilter( const QString& pattern ); virtual PlaylistInterface::RepeatMode repeatMode() const { return m_repeatMode; }