From bb26c39d5310c48f8159dbc3490f829d6c62b386 Mon Sep 17 00:00:00 2001 From: Arno Date: Sat, 4 Mar 2017 14:27:54 +0100 Subject: Introduce different views * view by artist (already there) * view by album * view by song * view by genre Doesn't work as expected, so it's likely gonna change soon. --- playerwidget.cpp | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 129 insertions(+), 10 deletions(-) (limited to 'playerwidget.cpp') diff --git a/playerwidget.cpp b/playerwidget.cpp index 27c473f..5d7e1d0 100644 --- a/playerwidget.cpp +++ b/playerwidget.cpp @@ -44,6 +44,26 @@ void PlayerWidget::setupGui(){ mSearchModel = new QStandardItemModel; mView->setSelectionMode(QAbstractItemView::ExtendedSelection); currentModel = mViewModel; + QToolBar *viewTB = new QToolBar; + QActionGroup *viewAG = new QActionGroup(this); + viewAG->setExclusive(true); + QAction *viewByArtistA = new QAction(QIcon(":/artist.png"), tr("View by artist"), this); + viewByArtistA->setCheckable(true); + viewAG->addAction(viewByArtistA); + connect(viewByArtistA, SIGNAL(triggered()), this, SLOT(doPopulateByArtist())); + QAction *viewByAlbumA = new QAction(QIcon(":/album.png"), tr("View by album"), this); + viewByAlbumA->setCheckable(true); + viewAG->addAction(viewByAlbumA); + connect(viewByAlbumA, SIGNAL(triggered()), this, SLOT(doPopulateByAlbum())); + QAction *viewBySongA = new QAction(QIcon(":/song.png"), tr("View by song"), this); + viewBySongA->setCheckable(true); + viewAG->addAction(viewBySongA); + connect(viewBySongA, SIGNAL(triggered()), this, SLOT(doPopulateBySong())); + QAction *viewByGenreA = new QAction(QIcon(":/genre.png"), tr("View by genre"), this); + viewByGenreA->setCheckable(true); + viewAG->addAction(viewByGenreA); + connect(viewByGenreA, SIGNAL(triggered()), this, SLOT(doPopulateByGenre())); + viewTB->addActions(viewAG->actions()); //filter QGroupBox *filterGB = new QGroupBox(tr("Search")); @@ -66,6 +86,12 @@ void PlayerWidget::setupGui(){ QVBoxLayout *leftWidgetL = new QVBoxLayout; leftWidgetL->addWidget(filterGB); leftWidgetL->addWidget(mView); + QHBoxLayout *selViewL = new QHBoxLayout; + selViewL->addWidget(new QLabel(tr("View by:"))); + selViewL->addStretch(); + selViewL->addWidget(viewTB); + selViewL->addStretch(); + leftWidgetL->addLayout(selViewL); leftWidget->setLayout(leftWidgetL); //now playing label @@ -148,7 +174,7 @@ void PlayerWidget::setupGui(){ QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(splitter); setLayout(mainLayout); - populate(); + viewByArtistA->trigger(); } void PlayerWidget::createActions(){ @@ -282,19 +308,76 @@ void PlayerWidget::populateByArtist(QStandardItem *parent, const QString &filter } } -void PlayerWidget::populateBySong(QStandardItem *parent, const QString &filter){ +void PlayerWidget::populateByAlbum(QStandardItem *parent, const QVariant &filter, int type){ + QSqlDatabase db = QSqlDatabase::database("beetplayerdb"); + QIcon albumIcon(":/album.png"); + QIcon songIcon(":/song.png"); + QSqlQuery albumQ(db); + if(type == EmptyType){ + albumQ.prepare("SELECT DISTINCT(ialbums_id), talbum_name, siyear FROM albums ORDER BY talbum_name"); + }else if(type == FilterType){ + albumQ.prepare("SELECT DISTINCT(songs.ialbums_id), talbum_name, siyear FROM songs, albums WHERE talbum_name ~ :album AND songs.ialbums_id = albums.ialbums_id ORDER BY siyear ASC"); + albumQ.bindValue(":album", filter); + } + albumQ.exec(); + while(albumQ.next()){ + QStandardItem *curAlbum = new QStandardItem; + curAlbum->setEditable(false); + curAlbum->setFont(QFont("courier")); + QString albumText = QString(tr("%1 (%2)")).arg(albumQ.value(1).toString()).arg(QString::number(albumQ.value(2).toInt())); + curAlbum->setText(albumText); + curAlbum->setIcon(albumIcon); + curAlbum->setData(Album, TypeRole); + curAlbum->setData(albumQ.value(0), IdRole); + parent->appendRow(curAlbum); + QSqlQuery songQ = QSqlQuery(db); + songQ.prepare("SELECT sipos, ttitle, tfullpath, igenres_id, artists.tartists_name, albums.talbum_name FROM songs, artists, albums WHERE albums.ialbums_id = :id AND songs.iartists_id = artists.iartists_id and songs.ialbums_id = albums.ialbums_id ORDER BY sipos"); + songQ.bindValue(":id", albumQ.value(0)); + songQ.exec(); + while(songQ.next()){ + QStandardItem *curSong = new QStandardItem; + curSong->setEditable(false); + curSong->setFont(QFont("courier")); + QString songText = QString(tr("%1 - %2")).arg(songQ.value(0).toInt(), 3, 10, QChar('0')).arg(songQ.value(1).toString()); + curSong->setText(songText); + curSong->setIcon(songIcon); + curSong->setData(Song, TypeRole); + curSong->setData(songQ.value(0), IdRole); + curSong->setData(songQ.value(2), FullPathRole); + curSong->setData(songQ.value(3), GenreRole); + curSong->setData(songQ.value(4), ArtistRole); + curSong->setData(songQ.value(1), TitleRole); + curSong->setData(songQ.value(5), AlbumRole); + curAlbum->appendRow(curSong); + } + } +} + +void PlayerWidget::populateBySong(QStandardItem *parent, const QVariant &filter, int type){ QSqlDatabase db = QSqlDatabase::database("beetplayerdb"); QStandardItem *root = parent; QIcon songIcon(":/song.png"); QSqlQuery songQ = QSqlQuery(db); - songQ.prepare("SELECT sipos, ttitle, tfullpath, igenres_id, artists.tartists_name, albums.talbum_name FROM songs, artists, albums WHERE ttitle ~ :f AND songs.iartists_id = artists.iartists_id and songs.ialbums_id = albums.ialbums_id ORDER BY ttitle ASC"); - songQ.bindValue(":f", filter); + if(type == EmptyType){ + songQ.prepare("SELECT sipos, ttitle, tfullpath, igenres_id, artists.tartists_name, albums.talbum_name FROM songs, artists, albums WHERE songs.iartists_id = artists.iartists_id and songs.ialbums_id = albums.ialbums_id ORDER BY ttitle ASC"); + }else if(type == FilterType){ + songQ.prepare("SELECT sipos, ttitle, tfullpath, igenres_id, artists.tartists_name, albums.talbum_name FROM songs, artists, albums WHERE ttitle ~ :f AND songs.iartists_id = artists.iartists_id and songs.ialbums_id = albums.ialbums_id ORDER BY ttitle ASC"); + songQ.bindValue(":f", filter); + }else if(type == IdType){ + songQ.prepare("SELECT sipos, ttitle, tfullpath, igenres_id, artists.tartists_name, albums.talbum_name FROM songs, artists, albums WHERE albums.ialbums_id = :id AND songs.iartists_id = artists.iartists_id and songs.ialbums_id = albums.ialbums_id ORDER BY sipos"); + songQ.bindValue(":id", filter); + } songQ.exec(); while(songQ.next()){ QStandardItem *curSong = new QStandardItem; curSong->setEditable(false); curSong->setFont(QFont("courier")); - QString songText = QString(tr("%1 (%2)")).arg(songQ.value(1).toString()).arg(songQ.value(4).toString()); + QString songText; + if(type == IdType){ + songText = QString(tr("%1 - %2")).arg(songQ.value(0).toInt(), 3, 10, QChar('0')).arg(songQ.value(1).toString()); + }else{ + songText = QString(tr("%1 (%2)")).arg(songQ.value(1).toString()).arg(songQ.value(4).toString()); + } curSong->setText(songText); curSong->setIcon(songIcon); curSong->setData(Song, TypeRole); @@ -314,8 +397,12 @@ void PlayerWidget::populateByGenre(QStandardItem *parent, const QString &filter) QIcon songIcon(":/song.png"); QIcon genreIcon(":/genre.png"); QSqlQuery genreQ(db); - genreQ.prepare("SELECT igenres_id, tgenres_name FROM genres WHERE tgenres_name ~ :f"); - genreQ.bindValue(":f", filter); + if(filter.isEmpty()){ + genreQ.prepare("SELECT igenres_id, tgenres_name FROM genres ORDER BY tgenres_name"); + }else{ + 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; @@ -375,12 +462,44 @@ void PlayerWidget::addSong(const QModelIndex &idx){ root->appendRow(item); } -void PlayerWidget::populate(){ +void PlayerWidget::doPopulateByArtist(){ + qApp->setOverrideCursor(Qt::BusyCursor); mView->setModel(mViewModel); mViewModel->clear(); - mViewModel->setHorizontalHeaderLabels(QStringList() << tr("Name")); + mViewModel->setHorizontalHeaderLabels(QStringList() << tr("Artist name")); QStandardItem *root = mViewModel->invisibleRootItem(); populateByArtist(root, QString()); + qApp->restoreOverrideCursor(); +} + +void PlayerWidget::doPopulateByAlbum(){ + qApp->setOverrideCursor(Qt::BusyCursor); + mView->setModel(mViewModel); + mViewModel->clear(); + mViewModel->setHorizontalHeaderLabels(QStringList() << tr("Album name")); + QStandardItem *root = mViewModel->invisibleRootItem(); + populateByAlbum(root, QString(), EmptyType); + qApp->restoreOverrideCursor(); +} + +void PlayerWidget::doPopulateByGenre(){ + qApp->setOverrideCursor(Qt::BusyCursor); + mView->setModel(mViewModel); + mViewModel->clear(); + mViewModel->setHorizontalHeaderLabels(QStringList() << tr("Genre name")); + QStandardItem *root = mViewModel->invisibleRootItem(); + populateByGenre(root, QString()); + qApp->restoreOverrideCursor(); +} + +void PlayerWidget::doPopulateBySong(){ + qApp->setOverrideCursor(Qt::BusyCursor); + mView->setModel(mViewModel); + mViewModel->clear(); + mViewModel->setHorizontalHeaderLabels(QStringList() << tr("Genre name")); + QStandardItem *root = mViewModel->invisibleRootItem(); + populateBySong(root, QString(), EmptyType); + qApp->restoreOverrideCursor(); } void PlayerWidget::doFilter(){ @@ -397,7 +516,7 @@ void PlayerWidget::doFilter(){ QStandardItem *root = mSearchModel->invisibleRootItem(); populateByArtist(root, filter); populateByGenre(root, filter); - populateBySong(root, filter); + populateBySong(root, filter, FilterType); qApp->restoreOverrideCursor(); } -- cgit v1.2.3-70-g09d2