summaryrefslogtreecommitdiffstats
path: root/playerwidget.cpp
diff options
context:
space:
mode:
authorArno <arno@disconnect.de>2017-02-25 18:45:49 +0100
committerArno <arno@disconnect.de>2017-02-25 18:45:49 +0100
commita169ca87cbe7b3ebe6f9ef24335f65ca64791116 (patch)
treeda37dd590ac329bb36229702017cd76daf4b12a3 /playerwidget.cpp
parentffa50a24296688d1c6e9f4de2315bbd494f86cf6 (diff)
downloadBeetPlayer-a169ca87cbe7b3ebe6f9ef24335f65ca64791116.tar.gz
BeetPlayer-a169ca87cbe7b3ebe6f9ef24335f65ca64791116.tar.bz2
BeetPlayer-a169ca87cbe7b3ebe6f9ef24335f65ca64791116.zip
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.
Diffstat (limited to 'playerwidget.cpp')
-rw-r--r--playerwidget.cpp98
1 files changed, 83 insertions, 15 deletions
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);
}