mirror of
https://github.com/tomahawk-player/tomahawk.git
synced 2025-08-01 03:40:16 +02:00
* Add filter capabilities to TreeModel / -View.
This commit is contained in:
@@ -29,7 +29,7 @@ DatabaseCommand_AllArtists::exec( DatabaseImpl* dbi )
|
|||||||
{
|
{
|
||||||
TomahawkSqlQuery query = dbi->newquery();
|
TomahawkSqlQuery query = dbi->newquery();
|
||||||
QList<Tomahawk::artist_ptr> al;
|
QList<Tomahawk::artist_ptr> al;
|
||||||
QString orderToken, sourceToken;
|
QString orderToken, sourceToken, filterToken, tables;
|
||||||
|
|
||||||
switch ( m_sortOrder )
|
switch ( m_sortOrder )
|
||||||
{
|
{
|
||||||
@@ -43,18 +43,31 @@ DatabaseCommand_AllArtists::exec( DatabaseImpl* dbi )
|
|||||||
if ( !m_collection.isNull() )
|
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(
|
QString sql = QString(
|
||||||
"SELECT DISTINCT artist.id, artist.name "
|
"SELECT DISTINCT artist.id, artist.name "
|
||||||
"FROM artist, file, file_join "
|
"FROM %1 "
|
||||||
"WHERE file.id = file_join.file "
|
"WHERE file.id = file_join.file "
|
||||||
"AND file_join.artist = artist.id "
|
"AND file_join.artist = artist.id "
|
||||||
"%1 %2 %3 %4"
|
"%2 %3 %4 %5 %6"
|
||||||
).arg( sourceToken )
|
).arg( tables )
|
||||||
|
.arg( sourceToken )
|
||||||
|
.arg( filterToken )
|
||||||
.arg( m_sortOrder > 0 ? QString( "ORDER BY %1" ).arg( orderToken ) : QString() )
|
.arg( m_sortOrder > 0 ? QString( "ORDER BY %1" ).arg( orderToken ) : QString() )
|
||||||
.arg( m_sortDescending ? "DESC" : QString() )
|
.arg( m_sortDescending ? "DESC" : QString() )
|
||||||
.arg( m_amount > 0 ? QString( "LIMIT 0, %1" ).arg( m_amount ) : QString() );
|
.arg( m_amount > 0 ? QString( "LIMIT 0, %1" ).arg( m_amount ) : QString() );
|
||||||
|
|
||||||
query.prepare( sql );
|
query.prepare( sql );
|
||||||
|
if ( !m_filter.isEmpty() )
|
||||||
|
query.bindValue( ":filter", QString( "%%1%" ).arg( m_filter ) );
|
||||||
|
|
||||||
query.exec();
|
query.exec();
|
||||||
|
|
||||||
while( query.next() )
|
while( query.next() )
|
||||||
|
@@ -54,6 +54,7 @@ public:
|
|||||||
void setLimit( unsigned int amount ) { m_amount = amount; }
|
void setLimit( unsigned int amount ) { m_amount = amount; }
|
||||||
void setSortOrder( DatabaseCommand_AllArtists::SortOrder order ) { m_sortOrder = order; }
|
void setSortOrder( DatabaseCommand_AllArtists::SortOrder order ) { m_sortOrder = order; }
|
||||||
void setSortDescending( bool descending ) { m_sortDescending = descending; }
|
void setSortDescending( bool descending ) { m_sortDescending = descending; }
|
||||||
|
void setFilter( const QString& filter ) { m_filter = filter; }
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void artists( const QList<Tomahawk::artist_ptr>& );
|
void artists( const QList<Tomahawk::artist_ptr>& );
|
||||||
@@ -64,6 +65,7 @@ private:
|
|||||||
unsigned int m_amount;
|
unsigned int m_amount;
|
||||||
DatabaseCommand_AllArtists::SortOrder m_sortOrder;
|
DatabaseCommand_AllArtists::SortOrder m_sortOrder;
|
||||||
bool m_sortDescending;
|
bool m_sortDescending;
|
||||||
|
QString m_filter;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // DATABASECOMMAND_ALLARTISTS_H
|
#endif // DATABASECOMMAND_ALLARTISTS_H
|
||||||
|
@@ -203,6 +203,15 @@ ArtistView::onFilterChanged( const QString& )
|
|||||||
{
|
{
|
||||||
if ( selectedIndexes().count() )
|
if ( selectedIndexes().count() )
|
||||||
scrollTo( selectedIndexes().at( 0 ), QAbstractItemView::PositionAtCenter );
|
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();*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -60,7 +60,7 @@ public:
|
|||||||
virtual QPixmap pixmap() const { return QPixmap( RESPATH "images/music-icon.png" ); }
|
virtual QPixmap pixmap() const { return QPixmap( RESPATH "images/music-icon.png" ); }
|
||||||
|
|
||||||
virtual bool showStatsBar() const { return false; }
|
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 void setShowModes( bool b ) { m_showModes = b; }
|
||||||
virtual bool showModes() const { return m_showModes; }
|
virtual bool showModes() const { return m_showModes; }
|
||||||
|
@@ -65,7 +65,6 @@ TrackProxyModel::setSourceTrackModel( TrackModel* sourceModel )
|
|||||||
void
|
void
|
||||||
TrackProxyModel::setFilter( const QString& pattern )
|
TrackProxyModel::setFilter( const QString& pattern )
|
||||||
{
|
{
|
||||||
qDebug() << Q_FUNC_INFO;
|
|
||||||
PlaylistInterface::setFilter( pattern );
|
PlaylistInterface::setFilter( pattern );
|
||||||
setFilterRegExp( pattern );
|
setFilterRegExp( pattern );
|
||||||
|
|
||||||
|
@@ -364,8 +364,7 @@ TrackView::onFilterChanged( const QString& )
|
|||||||
if ( selectedIndexes().count() )
|
if ( selectedIndexes().count() )
|
||||||
scrollTo( selectedIndexes().at( 0 ), QAbstractItemView::PositionAtCenter );
|
scrollTo( selectedIndexes().at( 0 ), QAbstractItemView::PositionAtCenter );
|
||||||
|
|
||||||
if ( !proxyModel()->filter().isEmpty() && !proxyModel()->trackCount() &&
|
if ( !proxyModel()->filter().isEmpty() && !proxyModel()->trackCount() && model()->trackCount() )
|
||||||
model()->trackCount() )
|
|
||||||
{
|
{
|
||||||
m_overlay->setText( tr( "Sorry, your filter '%1' did not match any results." ).arg( proxyModel()->filter() ) );
|
m_overlay->setText( tr( "Sorry, your filter '%1' did not match any results." ).arg( proxyModel()->filter() ) );
|
||||||
m_overlay->show();
|
m_overlay->show();
|
||||||
|
@@ -528,6 +528,7 @@ TreeModel::addAllCollections()
|
|||||||
|
|
||||||
emit loadingStarted();
|
emit loadingStarted();
|
||||||
DatabaseCommand_AllArtists* cmd = new DatabaseCommand_AllArtists();
|
DatabaseCommand_AllArtists* cmd = new DatabaseCommand_AllArtists();
|
||||||
|
cmd->setFilter( m_filter );
|
||||||
|
|
||||||
connect( cmd, SIGNAL( artists( QList<Tomahawk::artist_ptr> ) ),
|
connect( cmd, SIGNAL( artists( QList<Tomahawk::artist_ptr> ) ),
|
||||||
SLOT( onArtistsAdded( QList<Tomahawk::artist_ptr> ) ) );
|
SLOT( onArtistsAdded( QList<Tomahawk::artist_ptr> ) ) );
|
||||||
@@ -601,6 +602,7 @@ TreeModel::addCollection( const collection_ptr& collection )
|
|||||||
|
|
||||||
m_collection = collection;
|
m_collection = collection;
|
||||||
DatabaseCommand_AllArtists* cmd = new DatabaseCommand_AllArtists( collection );
|
DatabaseCommand_AllArtists* cmd = new DatabaseCommand_AllArtists( collection );
|
||||||
|
cmd->setFilter( m_filter );
|
||||||
|
|
||||||
connect( cmd, SIGNAL( artists( QList<Tomahawk::artist_ptr> ) ),
|
connect( cmd, SIGNAL( artists( QList<Tomahawk::artist_ptr> ) ),
|
||||||
SLOT( onArtistsAdded( QList<Tomahawk::artist_ptr> ) ) );
|
SLOT( onArtistsAdded( QList<Tomahawk::artist_ptr> ) ) );
|
||||||
@@ -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
|
void
|
||||||
TreeModel::infoSystemFinished( QString target )
|
TreeModel::infoSystemFinished( QString target )
|
||||||
{
|
{
|
||||||
|
@@ -99,6 +99,9 @@ public:
|
|||||||
virtual void setTitle( const QString& title ) { m_title = title; }
|
virtual void setTitle( const QString& title ) { m_title = title; }
|
||||||
virtual void setDescription( const QString& description ) { m_description = description; }
|
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
|
TreeModelItem* itemFromIndex( const QModelIndex& index ) const
|
||||||
{
|
{
|
||||||
if ( index.isValid() )
|
if ( index.isValid() )
|
||||||
@@ -153,6 +156,7 @@ private:
|
|||||||
|
|
||||||
Tomahawk::collection_ptr m_collection;
|
Tomahawk::collection_ptr m_collection;
|
||||||
QHash<qlonglong, QPersistentModelIndex> m_coverHash;
|
QHash<qlonglong, QPersistentModelIndex> m_coverHash;
|
||||||
|
QString m_filter;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // ALBUMMODEL_H
|
#endif // ALBUMMODEL_H
|
||||||
|
@@ -63,10 +63,12 @@ TreeProxyModel::setSourceTreeModel( TreeModel* sourceModel )
|
|||||||
void
|
void
|
||||||
TreeProxyModel::setFilter( const QString& pattern )
|
TreeProxyModel::setFilter( const QString& pattern )
|
||||||
{
|
{
|
||||||
qDebug() << Q_FUNC_INFO;
|
PlaylistInterface::setFilter( pattern );
|
||||||
setFilterRegExp( pattern );
|
setFilterRegExp( pattern );
|
||||||
|
m_model->setFilter( pattern );
|
||||||
|
|
||||||
emit filterChanged( pattern );
|
emit filterChanged( pattern );
|
||||||
|
emit trackCountChanged( trackCount() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -110,7 +112,6 @@ TreeProxyModel::filterAcceptsRow( int sourceRow, const QModelIndex& sourceParent
|
|||||||
m_cache.insertMulti( sourceParent, pi->result() );
|
m_cache.insertMulti( sourceParent, pi->result() );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( filterRegExp().isEmpty() )
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
QStringList sl = filterRegExp().pattern().split( " ", QString::SkipEmptyParts );
|
QStringList sl = filterRegExp().pattern().split( " ", QString::SkipEmptyParts );
|
||||||
|
@@ -54,6 +54,7 @@ public:
|
|||||||
virtual Tomahawk::result_ptr siblingItem( int direction );
|
virtual Tomahawk::result_ptr siblingItem( int direction );
|
||||||
virtual Tomahawk::result_ptr siblingItem( int direction, bool readOnly );
|
virtual Tomahawk::result_ptr siblingItem( int direction, bool readOnly );
|
||||||
|
|
||||||
|
virtual QString filter() const { return filterRegExp().pattern(); }
|
||||||
virtual void setFilter( const QString& pattern );
|
virtual void setFilter( const QString& pattern );
|
||||||
|
|
||||||
virtual PlaylistInterface::RepeatMode repeatMode() const { return m_repeatMode; }
|
virtual PlaylistInterface::RepeatMode repeatMode() const { return m_repeatMode; }
|
||||||
|
Reference in New Issue
Block a user