From a169ca87cbe7b3ebe6f9ef24335f65ca64791116 Mon Sep 17 00:00:00 2001 From: Arno Date: Sat, 25 Feb 2017 18:45:49 +0100 Subject: Implement filtering Well, as it turns out, QSortFilterProxyModel isn't the weapon of choice for this. Implement it by creating a separate model which is populated by SQL-Queries. --- playerwidget.cpp | 98 +++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 83 insertions(+), 15 deletions(-) (limited to 'playerwidget.cpp') diff --git a/playerwidget.cpp b/playerwidget.cpp index 5df9951..237f0f0 100644 --- a/playerwidget.cpp +++ b/playerwidget.cpp @@ -24,9 +24,8 @@ void PlayerWidget::setupGui(){ //THE view mView = new QTreeView; mViewModel = new QStandardItemModel; - mViewProxy = new BeetPlayerProxy; - mViewProxy->setSourceModel(mViewModel); - mView->setModel(mViewProxy); + mView->setModel(mViewModel); + mSearchModel = new QStandardItemModel; //filter QGroupBox *filterGB = new QGroupBox(tr("Filter")); @@ -101,22 +100,21 @@ void PlayerWidget::setupGui(){ populate(); } -void PlayerWidget::populate(){ - //prepare Queries +void PlayerWidget::populateByArtist(QStandardItem *parent, const QString &filter){ QSqlDatabase db = QSqlDatabase::database("beetplayerdb"); + QStandardItem *root = parent; QSqlQuery artistsQ(db); - artistsQ.prepare("SELECT iartists_id, tartists_name FROM artists ORDER BY tartists_name ASC"); + if(!filter.isEmpty()){ + artistsQ.prepare("SELECT iartists_id, tartists_name FROM artists WHERE tartists_name ~ :f ORDER BY tartists_name ASC"); + artistsQ.bindValue(":f", filter); + }else{ + artistsQ.prepare("SELECT iartists_id, tartists_name FROM artists ORDER BY tartists_name ASC"); + } QSqlQuery albumQ(db); albumQ.prepare("SELECT DISTINCT(songs.ialbums_id), talbum_name, siyear FROM songs, albums WHERE songs.iartists_id = :artistid AND songs.ialbums_id = albums.ialbums_id ORDER BY siyear ASC"); QSqlQuery songQ(db); songQ.prepare("SELECT sipos, ttitle, tfullpath, igenres_id FROM songs WHERE ialbums_id = :alid AND iartists_id = :arid ORDER BY sipos ASC"); - //reset view+model - mView->setSortingEnabled(false); - mViewModel->clear(); - mViewModel->setHorizontalHeaderLabels(QStringList() << tr("Name")); - QStandardItem *root = mViewModel->invisibleRootItem(); - //read data artistsQ.exec(); while(artistsQ.next()){ @@ -155,11 +153,81 @@ void PlayerWidget::populate(){ } } +void PlayerWidget::populateBySong(QStandardItem *parent, const QString &filter){ + QSqlDatabase db = QSqlDatabase::database("beetplayerdb"); + QStandardItem *root = parent; + QSqlQuery songQ = QSqlQuery(db); + songQ.prepare("SELECT sipos, ttitle, tfullpath, igenres_id, artists.tartists_name FROM songs, artists WHERE ttitle ~ :f AND songs.iartists_id = artists.iartists_id ORDER BY ttitle ASC"); + songQ.bindValue(":f", filter); + songQ.exec(); + while(songQ.next()){ + QStandardItem *curSong = new QStandardItem; + curSong->setFont(QFont("courier")); + QString songText = QString(tr("%1 %2 (%3)")).arg(QString("🅢")).arg(songQ.value(1).toString()).arg(songQ.value(4).toString()); + curSong->setText(songText); + curSong->setData(songQ.value(0), IdRole); + curSong->setData(songQ.value(2), FullPathRole); + curSong->setData(songQ.value(3), GenreRole); + root->appendRow(curSong); + } +} + +void PlayerWidget::populateByGenre(QStandardItem *parent, const QString &filter){ + QSqlDatabase db = QSqlDatabase::database("beetplayerdb"); + QStandardItem *root = parent; + QSqlQuery genreQ(db); + genreQ.prepare("SELECT igenres_id, tgenres_name FROM genres WHERE tgenres_name ~ :f"); + genreQ.bindValue(":f", filter); + genreQ.exec(); + while(genreQ.next()){ + QStandardItem *curGenre = new QStandardItem; + curGenre->setFont(QFont("courier")); + QString genreText = QString(tr("%1 %2")).arg(QString("🅖")).arg(genreQ.value(1).toString()); + curGenre->setText(genreText); + curGenre->setData(Genre, TypeRole); + curGenre->setData(genreQ.value(0), IdRole); + root->appendRow(curGenre); + QSqlQuery songQ = QSqlQuery(db); + songQ.prepare("SELECT sipos, ttitle, tfullpath, igenres_id, artists.tartists_name FROM songs, artists WHERE igenres_id = :id AND songs.iartists_id = artists.iartists_id ORDER BY ttitle ASC"); + songQ.bindValue(":id", genreQ.value(0)); + songQ.exec(); + while(songQ.next()){ + QStandardItem *curSong = new QStandardItem; + curSong->setFont(QFont("courier")); + QString songText = QString(tr("%1 %2 (%3)")).arg(QChar(0x266C)).arg(songQ.value(1).toString()).arg(songQ.value(4).toString()); + curSong->setText(songText); + curSong->setData(Song, TypeRole); + curSong->setData(songQ.value(0), IdRole); + curSong->setData(songQ.value(2), FullPathRole); + curSong->setData(songQ.value(3), GenreRole); + curGenre->appendRow(curSong); + } + } +} + +void PlayerWidget::populate(){ + mView->setModel(mViewModel); + mViewModel->clear(); + mViewModel->setHorizontalHeaderLabels(QStringList() << tr("Name")); + QStandardItem *root = mViewModel->invisibleRootItem(); + populateByArtist(root, QString()); +} + void PlayerWidget::doFilter(){ - mViewProxy->setFilterRegExp(QRegExp(mFilter->text())); + QString filter = mFilter->text(); + if(filter.isEmpty()){ + mView->setModel(mViewModel); + } + mSearchModel->clear(); + mSearchModel->setHorizontalHeaderLabels(QStringList() << tr("Name")); + mView->setModel(mSearchModel); + QStandardItem *root = mSearchModel->invisibleRootItem(); + populateByArtist(root, filter); + populateByGenre(root, filter); + populateBySong(root, filter); } void PlayerWidget::clearFilter(){ - mFilter->setText(QString()); - doFilter(); + mFilter->clear(); + mView->setModel(mViewModel); } -- cgit v1.2.3-70-g09d2