summaryrefslogtreecommitdiffstats
path: root/playerwidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'playerwidget.cpp')
-rw-r--r--playerwidget.cpp139
1 files changed, 129 insertions, 10 deletions
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();
}