summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--beetplayer.cpp4
-rw-r--r--playerwidget.cpp970
-rw-r--r--playerwidget.h52
3 files changed, 113 insertions, 913 deletions
diff --git a/beetplayer.cpp b/beetplayer.cpp
index 3ccf9d5..28d4f58 100644
--- a/beetplayer.cpp
+++ b/beetplayer.cpp
@@ -33,7 +33,7 @@ BeetPlayer::BeetPlayer(QWidget *parent, Qt::WindowFlags f) : QMainWindow(parent,
readSettings();
splash.showMessage(tr("Constructing Player..."), Qt::AlignHCenter, Qt::yellow);
qApp->processEvents();
- mPlayerWidget = new PlayerWidget;
+ mPlayerWidget = new PlayerWidget(&splash);
connect(mPlayerWidget, &PlayerWidget::viewModeChanged, this, &BeetPlayer::setViewMode);
connect(mPlayerWidget, &PlayerWidget::playModeChanged, this, &BeetPlayer::setPlayMode);
connect(mPlayerWidget, &PlayerWidget::numFilesChanged, this, &BeetPlayer::setNumFiles);
@@ -45,7 +45,7 @@ BeetPlayer::BeetPlayer(QWidget *parent, Qt::WindowFlags f) : QMainWindow(parent,
splash.showMessage(tr("Populating..."), Qt::AlignHCenter, Qt::yellow);
qApp->processEvents();
mPlayerWidget->doStop();
- mPlayerWidget->doPopulateByArtist();
+ //mPlayerWidget->doPopulateByArtist();
splash.showMessage(tr("Reading settings..."), Qt::AlignHCenter, Qt::yellow);
qApp->processEvents();
mPlayerWidget->readSettings();
diff --git a/playerwidget.cpp b/playerwidget.cpp
index 61804fa..9e5d699 100644
--- a/playerwidget.cpp
+++ b/playerwidget.cpp
@@ -27,6 +27,8 @@
#include <QDateTime>
#include <QRegularExpression>
#include <QFontMetrics>
+#include <QStackedWidget>
+#include <QSplashScreen>
#include <algorithm>
#include <taglib/tag.h>
@@ -40,10 +42,16 @@
#include "helper.h"
#include "webdownloader.h"
#include "webradiodialog.h"
-
-PlayerWidget::PlayerWidget(QWidget *parent) : QWidget(parent), mDurSecs(0), mPlayListLength(0), mIsStream(false), mModelType(DoNotCare){
+#include "collectionalbumsview.h"
+#include "collectionartistsview.h"
+#include "collectiondatesview.h"
+#include "collectionfavoritesview.h"
+#include "collectionfoldersview.h"
+#include "collectionwebradioview.h"
+
+PlayerWidget::PlayerWidget(QSplashScreen *splash, QWidget *parent) : QWidget(parent), mDurSecs(0), mPlayListLength(0), mIsStream(false), mModelType(DoNotCare){
mStarting = true;
- setupGui();
+ setupGui(splash);
createActions();
mWebDownloader = new WebDownloader(this);
connect(mWebDownloader, &WebDownloader::done, this, &PlayerWidget::webDlDone);
@@ -54,7 +62,7 @@ PlayerWidget::~PlayerWidget(){
writeSettings();
}
-void PlayerWidget::setupGui(){
+void PlayerWidget::setupGui(QSplashScreen *splash){
//the Player
mPlayer = new QMediaPlayer(this);
connect(mPlayer, &QMediaPlayer::positionChanged, this, &PlayerWidget::setPosition);
@@ -68,128 +76,97 @@ void PlayerWidget::setupGui(){
mVolumeTimer->setSingleShot(true);
connect(mVolumeTimer, &QTimer::timeout, this, &PlayerWidget::showVolume);
- //THE view
- mView = new BeetView;
- mView->setAlternatingRowColors(true);
- mViewModel = new QStandardItemModel;
- mView->setModel(mViewModel);
- mSearchModel = new QStandardItemModel;
- mView->setSelectionMode(QAbstractItemView::ExtendedSelection);
- connect(mView, &BeetView::doubleClicked, this, &PlayerWidget::viewDoubleClicked);
- mFolderModel = new QStandardItemModel;
- mWebRadioModel = new QStandardItemModel;
- mCurrentModel = mViewModel;
- QToolBar *viewTB = new QToolBar;
- QActionGroup *viewAG = new QActionGroup(this);
- viewAG->setExclusive(true);
- mViewByArtistA = new QAction(QIcon(":/artist.png"), tr("View by artist"), this);
- mViewByArtistA->setCheckable(true);
- viewAG->addAction(mViewByArtistA);
- connect(mViewByArtistA, &QAction::triggered, this, &PlayerWidget::doPopulateByArtist);
- QAction *viewByAlbumA = new QAction(QIcon(":/album.png"), tr("View by album"), this);
- viewByAlbumA->setCheckable(true);
- viewAG->addAction(viewByAlbumA);
- connect(viewByAlbumA, &QAction::triggered, this, &PlayerWidget::doPopulateByAlbum);
- QAction *viewBySongA = new QAction(QIcon(":/song.png"), tr("View by song"), this);
- viewBySongA->setCheckable(true);
- viewAG->addAction(viewBySongA);
- connect(viewBySongA, &QAction::triggered, this, &PlayerWidget::doPopulateBySong);
- QAction *viewByGenreA = new QAction(QIcon(":/genre.png"), tr("View by genre"), this);
- viewByGenreA->setCheckable(true);
- viewAG->addAction(viewByGenreA);
- connect(viewByGenreA, &QAction::triggered, this, &PlayerWidget::doPopulateByGenre);
- QAction *viewByDateA = new QAction(QIcon(":/sissyd.png"), tr("View by date"), this);
- viewByDateA->setCheckable(true);
- viewAG->addAction(viewByDateA);
- connect(viewByDateA, &QAction::triggered, this, &PlayerWidget::doPopulateByDate);
- QAction *viewByFavA = new QAction(QIcon(":/male_chastity_belt.png"), tr("View by favorites"), this);
- viewByFavA->setCheckable(true);
- viewAG->addAction(viewByFavA);
- connect(viewByFavA, &QAction::triggered, this, &PlayerWidget::doPopulateByFavorites);
- viewAG->addAction(Helper::createSeparator(this));
- QAction *viewByFolderA = new QAction(QIcon(":/folder.png"), tr("View by folder"), this);
- viewByFolderA->setCheckable(true);
- viewAG->addAction(viewByFolderA);
- connect(viewByFolderA, &QAction::triggered, this, &PlayerWidget::doPopulateByFolder);
- viewAG->addAction(Helper::createSeparator(this));
- mSearchA = new QAction(QIcon(":/gaping_ass.png"), tr("View search"), this);
- mSearchA->setCheckable(true);
- viewAG->addAction(mSearchA);
- connect(mSearchA, &QAction::triggered, this, &PlayerWidget::doFilter);
+ //THE views
+ QToolBar *bottomTB = new QToolBar;
+ QActionGroup *bottomTBG = new QActionGroup(this);
+ bottomTBG->setExclusive(true);
+ mCollectionStack = new QStackedWidget;
+ //artists view
+ CollectionArtistsView *artistsView = new CollectionArtistsView;
+ artistsView->setHeaders(QStringList() << tr("Artist"));
+ artistsView->setObjectName("artists");
+ splash->showMessage(tr("Populating Artists..."), Qt::AlignHCenter, Qt::yellow);
+ qApp->processEvents();
+ artistsView->populate();
+ int cIdx = mCollectionStack->addWidget(artistsView);
+ QAction *viewByArtistsA = new QAction(QIcon(":/artist.png"), tr("View by artist"), this);
+ viewByArtistsA->setCheckable(true);
+ connect(viewByArtistsA, &QAction::triggered, [this, cIdx] { mCollectionStack->setCurrentIndex(cIdx); });
+ bottomTBG->addAction(viewByArtistsA);
+ //albums view
+ CollectionAlbumsView *albumsView = new CollectionAlbumsView;
+ albumsView->setHeaders(QStringList() << tr("Album"));
+ albumsView->setObjectName("albums");
+ splash->showMessage(tr("Populating Albums..."), Qt::AlignHCenter, Qt::yellow);
+ qApp->processEvents();
+ albumsView->populate();
+ cIdx = mCollectionStack->addWidget(albumsView);
+ QAction *viewByAlbumsA = new QAction(QIcon(":/album.png"), tr("View by album"), this);
+ viewByAlbumsA->setCheckable(true);
+ connect(viewByAlbumsA, &QAction::triggered, [this, cIdx] { mCollectionStack->setCurrentIndex(cIdx); });
+ bottomTBG->addAction(viewByAlbumsA);
+ //dates view
+ CollectionDatesView *datesView = new CollectionDatesView;;
+ datesView->setHeaders(QStringList() << tr("Date added"));
+ datesView->setObjectName("dates");
+ splash->showMessage(tr("Populating Dates..."), Qt::AlignHCenter, Qt::yellow);
+ qApp->processEvents();
+ datesView->populate();
+ cIdx = mCollectionStack->addWidget(datesView);
+ QAction *viewByDatesA = new QAction(QIcon(":/sissyd.png"), tr("View by date"), this);
+ viewByDatesA->setCheckable(true);
+ connect(viewByDatesA, &QAction::triggered, [this, cIdx] { mCollectionStack->setCurrentIndex(cIdx); });
+ bottomTBG->addAction(viewByDatesA);
+ //favorites view
+ CollectionFavoritesView *favoritesView = new CollectionFavoritesView;
+ favoritesView->setHeaders(QStringList() << tr("Song"));
+ favoritesView->setObjectName("favorites");
+ splash->showMessage(tr("Populating Favorites..."), Qt::AlignHCenter, Qt::yellow);
+ qApp->processEvents();
+ favoritesView->populate();
+ cIdx = mCollectionStack->addWidget(favoritesView);
+ QAction *viewByFavoritesA = new QAction(QIcon(":/male_chastity_belt.png"), tr("View by favorites"), this);
+ viewByFavoritesA->setCheckable(true);
+ connect(viewByFavoritesA, &QAction::triggered, [this, cIdx] { mCollectionStack->setCurrentIndex(cIdx); });
+ bottomTBG->addAction(viewByFavoritesA);
+ //webradio view
+ CollectionWebradioView *webradioView = new CollectionWebradioView;
+ webradioView->setHeaders(QStringList() << tr("Webradio"));
+ webradioView->setObjectName("webradio");
+ splash->showMessage(tr("Populating Webradio..."), Qt::AlignHCenter, Qt::yellow);
+ qApp->processEvents();
+ webradioView->populate();
+ cIdx = mCollectionStack->addWidget(webradioView);
QAction *viewByWebradioA = new QAction(QIcon(":/dog_hood.png"), tr("Webradio"), this);
viewByWebradioA->setCheckable(true);
- viewAG->addAction(Helper::createSeparator(this));
- viewAG->addAction(viewByWebradioA);
- connect(viewByWebradioA, &QAction::triggered, this, &PlayerWidget::doPopulateByWebradio);
- viewTB->addActions(viewAG->actions());
- mSelectFilesA = new QAction(QIcon(":/bizarre_amputee.png"), tr("Select files..."), this);
- mSelectFilesA->setShortcut(tr("CTRL++"));
- connect(mSelectFilesA, &QAction::triggered, this, &PlayerWidget::doSelectFiles);
- mDeselectAllA = new QAction(QIcon(":/gaping_ass.png"), tr("Clear Selection"), this);
- mDeselectAllA->setShortcut(tr("CTRL+-"));
- connect(mDeselectAllA, &QAction::triggered, this, &PlayerWidget::doDeleteFiles);
- mDeleteFilesA = new QAction(QIcon(":/delete.png"), tr("Delete files..."), this);
- mDeleteFilesA->setShortcut(QKeySequence::Delete);
- connect(mDeleteFilesA, &QAction::triggered, this, &PlayerWidget::doDeleteFiles);
- mRefreshA = new QAction(QIcon(":/refresh.png"), tr("Refresh"), this);
- connect(mRefreshA, &QAction::triggered, this, &PlayerWidget::doPopulateByFolder);
- mRemoveFromFavoritesA = new QAction(QIcon(":/used_tampon.png"), tr("Remove from Favorites"), this);
- connect(mRemoveFromFavoritesA, &QAction::triggered, this, &PlayerWidget::removeFromFavorites);
-
- //filter
- QGroupBox *filterGB = new QGroupBox(tr("Search"));
- mSearch = new QLineEdit;
- connect(mSearch, &QLineEdit::returnPressed, this, &PlayerWidget::doFilter);
- QToolBar *searchTB = new QToolBar;
- QAction *clearSearchA = new QAction(QIcon(":/clean_tampon.png"), tr("Clear search"), this);
- connect(clearSearchA, &QAction::triggered, this, &PlayerWidget::clearFilter);
- searchTB->addAction(clearSearchA);
- QAction *doSearchA = new QAction(QIcon(":/stomp.png"), tr("Go searching!"), this);
- connect(doSearchA, &QAction::triggered, this, &PlayerWidget::doFilter);
- searchTB->addAction(doSearchA);
- QHBoxLayout *filterLayout = new QHBoxLayout;
- filterLayout->addWidget(mSearch);
- filterLayout->addWidget(searchTB);
- filterGB->setLayout(filterLayout);
-
- //directories
- QGroupBox *dirGB = new QGroupBox(QString(tr("Current Directory")));
- mDir = new QLineEdit;
- mDir->setReadOnly(true);
- QToolBar *dirTB = new QToolBar;
- QImage upImg(":/stomp.png");
- upImg = upImg.mirrored();
- QIcon upDirIcon = QPixmap::fromImage(upImg);
- QAction *upDirA = new QAction(upDirIcon, tr("Up directory"), this);
- connect(upDirA, &QAction::triggered, this, &PlayerWidget::dirUp);
- dirTB->addAction(upDirA);
- QAction *homeDirA = new QAction(QIcon(":/home.png"), tr("Go home"), this);
- connect(homeDirA, &QAction::triggered, this, &PlayerWidget::dirHome);
- dirTB->addAction(homeDirA);
- dirTB->addAction(mRefreshA);
- QHBoxLayout *dirLayout = new QHBoxLayout;
- dirLayout->addWidget(mDir);
- dirLayout->addWidget(dirTB);
- dirGB->setLayout(dirLayout);
-
- //stack it up!
- mSearchDirStack = new QStackedLayout;
- mSearchDirStack->addWidget(filterGB);
- mSearchDirStack->addWidget(dirGB);
+ connect(viewByWebradioA, &QAction::triggered, [this, cIdx] { mCollectionStack->setCurrentIndex(cIdx); });
+ bottomTBG->addAction(viewByWebradioA);
+ //folders view
+ CollectionFoldersView *foldersView = new CollectionFoldersView;
+ foldersView->setHeaders(QStringList() << tr("Folder contents"));
+ foldersView->setObjectName("foldersview");
+ splash->showMessage(tr("Populating Folders..."), Qt::AlignHCenter, Qt::yellow);
+ qApp->processEvents();
+ foldersView->populate();
+ cIdx = mCollectionStack->addWidget(foldersView);
+ QAction *viewByFoldersA = new QAction(QIcon(":/folder.png"), tr("View by folder"), this);
+ connect(viewByFoldersA, &QAction::triggered, [this, cIdx] { mCollectionStack->setCurrentIndex(cIdx); });
+ bottomTBG->addAction(viewByFoldersA);
+ for(QAction *a : bottomTBG->actions()){
+ bottomTB->addAction(a);
+ }
//left widget
QWidget *leftWidget = new QWidget;
QVBoxLayout *leftWidgetL = new QVBoxLayout;
- leftWidgetL->addLayout(mSearchDirStack);
- leftWidgetL->addWidget(mView, 999);
+ leftWidgetL->addWidget(mCollectionStack);
QHBoxLayout *selViewL = new QHBoxLayout;
selViewL->addWidget(new QLabel(tr("View by:")));
selViewL->addStretch();
- selViewL->addWidget(viewTB);
+ selViewL->addWidget(bottomTB);
selViewL->addStretch();
leftWidgetL->addLayout(selViewL);
leftWidget->setLayout(leftWidgetL);
- connect(this, &PlayerWidget::modelChanged, this, &PlayerWidget::doModelChanged);
//now playing label
mNowPlayingL = new QLabel;
@@ -340,8 +317,6 @@ void PlayerWidget::createActions(){
connect(addToPlayListAndClearA, &QAction::triggered, this, &PlayerWidget::addToPlayListAndClear);
QAction *expandA = new QAction(Helper::iconFromQChar(QChar(0x2640), 90), tr("Expand"), this);
connect(expandA, &QAction::triggered, this, &PlayerWidget::expand);
- QAction *collapseAllA = new QAction(Helper::iconFromQChar(QChar(0x2642), 120), tr("Collapse all"), this);
- connect(collapseAllA, &QAction::triggered, mView, &BeetView::collapseAll);
QAction *removeFromPlayListA = new QAction(QIcon(":/belly_left.png"), tr("Remove from playlist"), this);
connect(removeFromPlayListA, &QAction::triggered, this, &PlayerWidget::removeFromPlayList);
QAction *clearPlayListA = new QAction(QIcon(":/delete.png"), tr("Clear Playlist"), this);
@@ -381,40 +356,14 @@ void PlayerWidget::createActions(){
connect(miscMusicBrainzRightA, &QAction::triggered, this, &PlayerWidget::searchMusicbrainzRight);
QAction *miscMusicBrainzLeftA = new QAction(QIcon(":/bizarre_amputee.png"), tr("Search Musicbrainz"), this);
connect(miscMusicBrainzLeftA, &QAction::triggered, this, &PlayerWidget::searchMusicbrainzLeft);
- QAction *miscFilterFromPlaylistA = new QAction(QIcon(":/chastity_belt.png"), tr("Filter artist"), this);
- connect(miscFilterFromPlaylistA, &QAction::triggered, this, &PlayerWidget::filterFromPlaylist);
- QAction *addToWebRadioA = new QAction(QIcon(":/dog_hood.png"), tr("Edit Webradio..."), this);
- connect(addToWebRadioA, &QAction::triggered, this, &PlayerWidget::editWebradio);
- QAction *addToFavoritesA = new QAction(QIcon(":/male_chastity_belt.png"), tr("Add to Favorites"), this);
- connect(addToFavoritesA, &QAction::triggered, this, &PlayerWidget::addToFavorites);
- mView->addAction(addToPlayListA);
- mView->addAction(addToPlayListAndClearA);
- mView->addAction(Helper::createSeparator(this));
- mView->addAction(expandA);
- mView->addAction(collapseAllA);
- mView->addAction(Helper::createSeparator(this));
- mView->addAction(mSelectFilesA);
- mView->addAction(mDeselectAllA);
- mView->addAction(mDeleteFilesA);
- mView->addAction(Helper::createSeparator(this));
- mView->addAction(miscPrintA);
- mView->addAction(miscMusicBrainzLeftA);
- mView->addAction(Helper::createSeparator(this));
- mView->addAction(mRefreshA);
- mView->addAction(mRemoveFromFavoritesA);
- mView->addAction(Helper::createSeparator(this));
- mView->addAction(addToWebRadioA);
- mView->addAction(Helper::createSeparator(this));
- mView->addAction(randomPlayA);
+
mPlayListView->addAction(removeFromPlayListA);
mPlayListView->addAction(Helper::createSeparator(this));
mPlayListView->addAction(miscMusicBrainzRightA);
- mPlayListView->addAction(miscFilterFromPlaylistA);
mPlayListView->addAction(Helper::createSeparator(this));
mPlayListView->addAction(shufflePlayistA);
mPlayListView->addAction(clearPlayListA);
mPlayListView->addAction(Helper::createSeparator(this));
- mPlayListView->addAction(addToFavoritesA);
QWidget* spacer1 = new QWidget();
spacer1->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
mToolBar->addWidget(spacer1);
@@ -456,450 +405,6 @@ void PlayerWidget::createActions(){
mTrayIcon->setContextMenu(trayMenu);
}
-void PlayerWidget::populateByArtist(QStandardItem *parent, const QString &filter){
- QSqlDatabase db = QSqlDatabase::database("beetplayerdb");
- QStandardItem *root = parent;
- QSqlQuery artistsQ(db);
- 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, ilength FROM songs WHERE ialbums_id = :alid AND iartists_id = :arid ORDER BY sipos ASC");
- QIcon songIcon(":/song.png");
- QIcon albumIcon(":/album.png");
- QIcon artistIcon(":/artist.png");
-
- //read data
- artistsQ.exec();
- while(artistsQ.next()){
- QStandardItem *curArtist = new QStandardItem;
- curArtist->setEditable(false);
- curArtist->setFont(QFont("courier"));
- curArtist->setText(artistsQ.value(1).toString());
- curArtist->setIcon(artistIcon);
- curArtist->setData(Artist, TypeRole);
- curArtist->setData(artistsQ.value(0).toInt(), IdRole);
- curArtist->setData(artistsQ.value(1), ArtistRole);
- root->appendRow(curArtist);
- albumQ.bindValue(":artistid", artistsQ.value(0));
- albumQ.exec();
- while(albumQ.next()){
- QStandardItem *curAlbum = new QStandardItem;
- curAlbum->setEditable(false);
- curAlbum->setFont(QFont("courier"));
- QString albumText = QString(tr("%1 - %2")).arg(QString::number(albumQ.value(2).toInt())).arg(albumQ.value(1).toString());
- curAlbum->setText(albumText);
- curAlbum->setIcon(albumIcon);
- curAlbum->setData(Album, TypeRole);
- curAlbum->setData(albumQ.value(0), IdRole);
- curAlbum->setData(artistsQ.value(1), ArtistRole);
- curAlbum->setData(albumQ.value(1), AlbumRole);
- curArtist->appendRow(curAlbum);
- songQ.bindValue(":alid", albumQ.value(0));
- songQ.bindValue(":arid", artistsQ.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(artistsQ.value(1), ArtistRole);
- curSong->setData(songQ.value(1), TitleRole);
- curSong->setData(songQ.value(4), LengthRole);
- curSong->setData(albumQ.value(1), AlbumRole);
- curAlbum->appendRow(curSong);
- }
- }
- }
-}
-
-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()){
- QHash<QString, int> artistcount;
- QStandardItem *curAlbum = new QStandardItem;
- curAlbum->setEditable(false);
- curAlbum->setFont(QFont("courier"));
-
- 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, ilength 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 - %3")).arg(songQ.value(0).toInt(), 3, 10, QChar('0')).arg(songQ.value(1).toString()).arg(songQ.value(4).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);
- ++artistcount[songQ.value(4).toString()];
- curSong->setData(songQ.value(1), TitleRole);
- curSong->setData(songQ.value(5), AlbumRole);
- curSong->setData(songQ.value(6), LengthRole);
- curAlbum->appendRow(curSong);
- }
- QString albumText;
- if(artistcount.keys().count() > 1){
- albumText = QString(tr("%1 - VA - (%2)")).arg(albumQ.value(1).toString()).arg(QString::number(albumQ.value(2).toInt()));
- }else{
- albumText = QString(tr("%1 - %2 - (%3)")).arg(albumQ.value(1).toString()).arg(artistcount.keys().first()). arg(QString::number(albumQ.value(2).toInt()));
- }
- curAlbum->setText(albumText);
- }
-}
-
-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);
- if(type == EmptyType){
- songQ.prepare("SELECT sipos, ttitle, tfullpath, igenres_id, artists.tartists_name, albums.talbum_name, ilength 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, ilength 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;
- 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);
- 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);
- curSong->setData(songQ.value(6), LengthRole);
- root->appendRow(curSong);
- }
-}
-
-void PlayerWidget::populateByDate(QStandardItem *parent){
- QSqlDatabase db = QSqlDatabase::database("beetplayerdb");
- QStandardItem *root = parent;
- QIcon dateIcon(":/bizarre_amputee.png");
- root->setIcon(dateIcon);
- QIcon albumIcon(":/album.png");
- QIcon songIcon(":/song.png");
- QSqlQuery q1("SELECT DISTINCT(albums.ialbums_id), talbum_name, dadded, tartists_name FROM albums, artists, songs WHERE albums.ialbums_id = songs.ialbums_id AND songs.iartists_id = artists.iartists_id ORDER BY dadded DESC", db);
- QSqlQuery songQ(db);
- songQ.prepare("SELECT sipos, ttitle, tfullpath, igenres_id, artists.tartists_name, albums.talbum_name, ilength 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");
- QHash<int, QStandardItem*> years;
- QHash<QString, QStandardItem*> yearMonths;
- while(q1.next()){
- QDate added = q1.value(2).toDate();
- int year = added.year();
- QStandardItem *yearItem = nullptr;
- QStandardItem *ymItem = nullptr;
- if(years.contains(year)){
- yearItem = years.value(year);
- }else{
- yearItem = new QStandardItem;
- yearItem->setText(QString::number(year));
- years.insert(year, yearItem);
- yearItem->setIcon(dateIcon);
- root->appendRow(yearItem);
- }
- QString yearMonth = QString("%1-%2").arg(QString::number(added.year())).arg(added.month(), 2, 10, QChar('0'));
- if(yearMonths.contains(yearMonth)){
- ymItem = yearMonths.value(yearMonth);
- }else{
- ymItem = new QStandardItem;
- ymItem->setText(yearMonth);
- ymItem->setIcon(dateIcon);
- yearMonths.insert(yearMonth, ymItem);
- yearItem->appendRow(ymItem);
- }
- QStandardItem *albumItem = new QStandardItem;
- QString albumText = QString("%1 - %2").arg(q1.value(3).toString()).arg(q1.value(1).toString());
- albumItem->setText(albumText);
- albumItem->setIcon(albumIcon);
- ymItem->appendRow(albumItem);
- songQ.bindValue(":id", q1.value(0));
- songQ.exec();
- while(songQ.next()){
- QStandardItem *curSong = new QStandardItem;
- curSong->setEditable(false);
- curSong->setFont(QFont("courier"));
- QString songText = QString(tr("%1 - %2 - %3")).arg(songQ.value(0).toInt(), 3, 10, QChar('0')).arg(songQ.value(1).toString()).arg(songQ.value(4).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);
- curSong->setData(songQ.value(6), LengthRole);
- albumItem->appendRow(curSong);
- }
- }
-}
-
-void PlayerWidget::populateByGenre(QStandardItem *parent, const QString &filter){
- QSqlDatabase db = QSqlDatabase::database("beetplayerdb");
- QStandardItem *root = parent;
- QIcon songIcon(":/song.png");
- QIcon genreIcon(":/genre.png");
- QSqlQuery genreQ(db);
- 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;
- curGenre->setEditable(false);
- curGenre->setFont(QFont("courier"));
- curGenre->setText(genreQ.value(1).toString());
- curGenre->setIcon(genreIcon);
- 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, albums.talbum_name, ilength FROM songs, artists, albums WHERE igenres_id = :id AND songs.iartists_id = artists.iartists_id AND songs.ialbums_id = albums.ialbums_id ORDER BY ttitle ASC");
- songQ.bindValue(":id", genreQ.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(1).toString()).arg(songQ.value(4).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);
- curSong->setData(songQ.value(6), LengthRole);
- curGenre->appendRow(curSong);
- }
- }
-}
-
-void PlayerWidget::populateByWebradio(QStandardItem *parent){
- QSqlDatabase db = QSqlDatabase::database("beetplayerdb");
- QStandardItem *root = parent;
- QIcon wrIcon(":/dog_hood.png");
- QSqlQuery wrQ = QSqlQuery(db);
- wrQ.prepare("SELECT tdescription, turl FROM webradio ORDER BY tdescription DESC");
- wrQ.exec();
- while(wrQ.next()){
- QStandardItem *curWr = new QStandardItem;
- curWr->setEditable(false);
- curWr->setFont(QFont("courier"));
- curWr->setText(wrQ.value(0).toString());
- curWr->setIcon(wrIcon);
- curWr->setData(wrQ.value(1), UrlRole);
- root->appendRow(curWr);
- }
-}
-
-void PlayerWidget::doPopulateByFolder(){
- mCurrentModel = mFolderModel;
- mModelType = Folders;
- mFolderModel->clear();
- mFolderModel->setHorizontalHeaderLabels(QStringList() << tr("Name"));
- QDir d(mCurDir);
- if(!d.exists()){
- d = QDir(QDir::homePath());
- mCurDir = d.absolutePath();
- }
- QMimeDatabase db;
- QStandardItem *root = mFolderModel->invisibleRootItem();
- QIcon songIcon(":/song.png");
- QIcon otherIcon(":/belly_right_and_clear.png");
- QIcon dirIcon(":/folder.png");
- QFileInfoList fl = d.entryInfoList(QStringList() << "*", QDir::Files | QDir::Dirs | QDir::NoDot, QDir::Name | QDir::DirsFirst);
- for(const QFileInfo &fi : fl){
- QStandardItem *cur = new QStandardItem;
- cur->setEditable(false);
- cur->setText(fi.fileName());
- if(fi.isDir()){
- cur->setIcon(dirIcon);
- }else if(fi.isFile()){
- QMimeType mt = db.mimeTypeForFile(fi);
- if(mt.name().startsWith("audio")){
- cur->setIcon(songIcon);
- cur->setData(Song, TypeRole);
- cur->setData(-1, IdRole);
- TagLib::FileRef file(fi.absoluteFilePath().toUtf8());
- if(!file.isNull()){
- QString artist = QString::fromStdWString(file.tag()->artist().toWString());
- cur->setData(artist.toLower(), ArtistRole);
- QString album = QString::fromStdWString(file.tag()->album().toWString());
- cur->setData(album.toLower(), AlbumRole);
- QString genre = QString::fromStdWString(file.tag()->genre().toWString());
- cur->setData(genre.toLower(), GenreRole);
- QString title = QString::fromStdWString(file.tag()->title().toWString());
- cur->setData(title.toLower(), TitleRole);
- }
- }else{
- cur->setIcon(otherIcon);
- }
- }
- cur->setData(fi.absoluteFilePath(), FullPathRole);
- root->appendRow(cur);
- }
- mView->setModel(mFolderModel);
- emit viewModeChanged(tr("Folder"));
- emit modelChanged();
-}
-
-void PlayerWidget::doPopulateByWebradio(){
- mCurrentModel = mWebRadioModel;
- mWebRadioModel->clear();
- mWebRadioModel->setHorizontalHeaderLabels(QStringList() << tr("Description"));
- QStandardItem *root = mWebRadioModel->invisibleRootItem();
- populateByWebradio(root);
- mModelType = WebRadio;
- mView->setModel(mWebRadioModel);
- emit viewModeChanged("WebRadio");
- emit modelChanged();
- connect(mView->selectionModel(), &QItemSelectionModel::currentChanged, this, &PlayerWidget::leftCurrentChanged);
-}
-
-void PlayerWidget::doPopulateByFavorites(){
- qApp->setOverrideCursor(Qt::BusyCursor);
- mView->setModel(mViewModel);
- mCurrentModel = mViewModel;
- mViewModel->clear();
- mViewModel->setHorizontalHeaderLabels(QStringList() << tr("Song"));
- QStandardItem *root = mViewModel->invisibleRootItem();
- emit message(QString(tr("Populating by Favorites... Please wait!")));
- qApp->processEvents();
- populateByFavorites(root);
- mModelType = Favorites;
- qApp->restoreOverrideCursor();
- emit viewModeChanged(tr("Favorites"));
- emit message(QString(tr("Done!")));
- emit modelChanged();
-}
-
-void PlayerWidget::populateByFavorites(QStandardItem *parent){
- QSqlDatabase db = QSqlDatabase::database("beetplayerdb");
- QStandardItem *root = parent;
- QIcon songIcon(":/song.png");
- QSqlQuery favQ1(db);
- favQ1.prepare("SELECT tartist_name, talbum_name, ttitle FROM persistent_favorites");
- QSqlQuery favQ2(db);
- favQ2.prepare("SELECT sipos, tfullpath, igenres_id, artists.tartists_name, albums.talbum_name, ilength from songs, artists, albums WHERE songs.ttitle = :song AND albums.talbum_name = :album AND albums.ialbums_id = songs.ialbums_id AND artists.tartists_name = :artist AND artists.iartists_id = songs.iartists_id");
- favQ1.exec();
- while(favQ1.next()){
- QStandardItem *curSong = new QStandardItem;
- curSong->setEditable(false);
- curSong->setFont(QFont("courier"));
- favQ2.bindValue(":song", favQ1.value(2));
- favQ2.bindValue(":album", favQ1.value(1));
- favQ2.bindValue(":artist", favQ1.value(0));
- favQ2.exec();
- favQ2.next();
- QFontMetrics fm(QFont("courier"));
- QString songTitle = fm.elidedText(favQ1.value(2).toString(), Qt::ElideRight, fm.width('X') * 28);
- QString songText = QString("%1 - %2 - %3").arg(favQ1.value(0).toString(), -25).arg(songTitle, -30).arg(favQ1.value(1).toString());
- curSong->setText(songText);
- curSong->setIcon(songIcon);
- curSong->setData(Song, TypeRole);
- curSong->setData(favQ2.value(0), IdRole);
- curSong->setData(favQ2.value(1), FullPathRole);
- curSong->setData(favQ2.value(2), GenreRole);
- curSong->setData(favQ1.value(0), ArtistRole);
- curSong->setData(favQ1.value(2), TitleRole);
- curSong->setData(favQ1.value(1), AlbumRole);
- curSong->setData(favQ2.value(5), LengthRole);
- root->appendRow(QList<QStandardItem*>() << curSong);
- }
- mView->setSortingEnabled(true);
- mView->sortByColumn(0, Qt::AscendingOrder);
-}
-
-void PlayerWidget::doModelChanged(){
- mSelectFilesA->setEnabled(mModelType == Folders);
- mDeselectAllA->setEnabled(mModelType == Folders);
- mDeleteFilesA->setEnabled(mModelType == Folders);
- mRefreshA->setEnabled(mModelType == Folders);
- if(mModelType == Folders){
- mSearchDirStack->setCurrentIndex(1);
- }else{
- mSearchDirStack->setCurrentIndex(0);
- }
- mRemoveFromFavoritesA->setEnabled(mModelType == Favorites);
-}
-
-void PlayerWidget::viewDoubleClicked(const QModelIndex &idx){
- const QStandardItemModel *model = static_cast<const QStandardItemModel*>(idx.model());
- if(model == mViewModel || model == mSearchModel){
- addToPlayList();
- return;
- }
- if(model == mWebRadioModel){
- QString url(idx.data(UrlRole).toString());
- mPlayListModel->clear();
- mPlayListModel->setHorizontalHeaderLabels(QStringList() << tr("Title"));
- mRightTE->clear();
- playUrl(url);
- return;
- }
- QString fp(idx.data(FullPathRole).toString());
- QFileInfo fi(fp);
- if(fi.isDir()){
- mCurDir = fp;
- mDir->setText(fp);
- doPopulateByFolder();
- }else{
- addToPlayList();
- }
-}
-
void PlayerWidget::rightCurrentChanged(const QModelIndex &cur, const QModelIndex &prev){
Q_UNUSED(prev)
QString fullPath(cur.data(FullPathRole).toString());
@@ -969,47 +474,6 @@ void PlayerWidget::doPlayOrPause(){
}
}
-void PlayerWidget::doSelectFiles(){
- bool ok;
- QString pattern = QInputDialog::getText(this, tr("Select files..."), tr("Pattern:"), QLineEdit::Normal, QString(), &ok);
- if(ok && !pattern.isEmpty()){
- QList<QStandardItem*> items = mFolderModel->findItems(pattern, Qt::MatchWildcard);
- mView->selectionModel()->clear();
- for(QStandardItem *i : items){
- QModelIndex idx = mFolderModel->indexFromItem(i);
- mView->selectionModel()->select(idx, QItemSelectionModel::Rows | QItemSelectionModel::Toggle);
- }
- }
-}
-
-void PlayerWidget::doDeselect(){
- mView->selectionModel()->clearSelection();
-}
-
-void PlayerWidget::doDeleteFiles(){
- QModelIndexList sel = mView->selectionModel()->selectedRows();
- if(!sel.isEmpty()){
- QString msg = QString(tr("Really delete %1 file(s)?")).arg(QString::number(sel.count()));
- int r = QMessageBox::question(this, tr("Delete files..."), msg);
- if(r == QMessageBox::Yes){
- for(const QModelIndex &i : sel){
- QString cur = i.data(FullPathRole).toString();
- QFileInfo file(cur);
- if(file.isFile()){
- QFile::remove(cur);
- continue;
- }
- if(file.isDir()){
- QString d = file.absoluteFilePath();
- QDir toDel(d);
- toDel.removeRecursively();
- }
- }
- doPopulateByFolder();
- }
- }
-}
-
void PlayerWidget::volumeUp(){
adjustVolume(2);
}
@@ -1018,20 +482,6 @@ void PlayerWidget::volumeDown(){
adjustVolume(-2);
}
-void PlayerWidget::dirUp(){
- QDir d(mCurDir);
- d.cdUp();
- mDir->setText(d.absolutePath());
- mCurDir = d.absolutePath();
- doPopulateByFolder();
-}
-
-void PlayerWidget::dirHome(){
- mCurDir = QDir::homePath();
- mDir->setText(mCurDir);
- doPopulateByFolder();
-}
-
void PlayerWidget::showVolume(){
int volume = mVolumeSlider->value();
QString msg = QString(tr("Volume: %1%")).arg(volume, 3, 10, QChar('0'));
@@ -1079,8 +529,9 @@ void PlayerWidget::setNowPlaying(const QString &what){
}
void PlayerWidget::recurse(const QModelIndex &parent){
- for(int i = 0; i < mCurrentModel->rowCount(parent); ++i){
- QModelIndex cur = mCurrentModel->index(i, 0, parent);
+ const QStandardItemModel *m = qobject_cast<const QStandardItemModel*>(parent.model());
+ for(int i = 0; i < m->rowCount(parent); ++i){
+ QModelIndex cur = m->index(i, 0, parent);
int type = cur.data(TypeRole).toInt();
if(type == Song){
addSong(cur);
@@ -1120,153 +571,14 @@ void PlayerWidget::addSong(const QModelIndex &idx){
mPlayListLength += len;
}
-void PlayerWidget::doPopulateByArtist(){
- qApp->setOverrideCursor(Qt::BusyCursor);
- mView->setModel(mViewModel);
- mCurrentModel = mViewModel;
- mModelType = DoNotCare;
- mViewModel->clear();
- mViewModel->setHorizontalHeaderLabels(QStringList() << tr("Artist name"));
- QStandardItem *root = mViewModel->invisibleRootItem();
- emit message(QString(tr("Populating by artist... Please wait!")));
- qApp->processEvents();
- populateByArtist(root, QString());
- qApp->restoreOverrideCursor();
- mViewByArtistA->setChecked(true);
- emit viewModeChanged(tr("Artist"));
- emit message(QString(tr("Done!")));
- emit modelChanged();
-}
-
-void PlayerWidget::doPopulateByAlbum(){
- qApp->setOverrideCursor(Qt::BusyCursor);
- mView->setModel(mViewModel);
- mCurrentModel = mViewModel;
- mModelType = DoNotCare;
- mViewModel->clear();
- mViewModel->setHorizontalHeaderLabels(QStringList() << tr("Album name"));
- QStandardItem *root = mViewModel->invisibleRootItem();
- emit message(QString(tr("Populating by album... Please wait!")));
- qApp->processEvents();
- populateByAlbum(root, QString(), EmptyType);
- qApp->restoreOverrideCursor();
- emit viewModeChanged(tr("Album"));
- emit message(QString(tr("Done!")));
- emit modelChanged();
-}
-
-void PlayerWidget::doPopulateByGenre(){
- qApp->setOverrideCursor(Qt::BusyCursor);
- mView->setModel(mViewModel);
- mCurrentModel = mViewModel;
- mModelType = DoNotCare;
- mViewModel->clear();
- mViewModel->setHorizontalHeaderLabels(QStringList() << tr("Genre name"));
- QStandardItem *root = mViewModel->invisibleRootItem();
- emit message(QString(tr("Populating by genre... Please wait!")));
- qApp->processEvents();
- populateByGenre(root, QString());
- qApp->restoreOverrideCursor();
- emit viewModeChanged(tr("Genre"));
- emit message(QString(tr("Done!")));
- emit modelChanged();
-}
-
-void PlayerWidget::doPopulateBySong(){
- qApp->setOverrideCursor(Qt::BusyCursor);
- mView->setModel(mViewModel);
- mCurrentModel = mViewModel;
- mModelType = DoNotCare;
- mViewModel->clear();
- mViewModel->setHorizontalHeaderLabels(QStringList() << tr("Genre name"));
- QStandardItem *root = mViewModel->invisibleRootItem();
- emit message(QString(tr("Populating by song... Please wait!")));
- qApp->processEvents();
- populateBySong(root, QString(), EmptyType);
- qApp->restoreOverrideCursor();
- emit viewModeChanged(tr("Song"));
- emit message(QString(tr("Done!")));
- emit modelChanged();
-}
-
-void PlayerWidget::doPopulateByDate(){
- qApp->setOverrideCursor(Qt::BusyCursor);
- mView->setModel(mViewModel);
- mCurrentModel = mViewModel;
- mModelType = DoNotCare;
- mViewModel->clear();
- mViewModel->setHorizontalHeaderLabels(QStringList() << tr("Date added"));
- QStandardItem *root = mViewModel->invisibleRootItem();
- emit message(QString(tr("Populating by date... Please wait!")));
- qApp->processEvents();
- populateByDate(root);
- qApp->restoreOverrideCursor();
- emit viewModeChanged(tr("Date"));
- emit message(QString(tr("Done!")));
- emit modelChanged();
-}
-
-void PlayerWidget::doFilter(){
- mSearchDirStack->setCurrentIndex(0);
- QString filter = mSearch->text();
- mSearchModel->clear();
- mSearchModel->setHorizontalHeaderLabels(QStringList() << tr("Name"));
- mView->setModel(mSearchModel);
- mCurrentModel = mSearchModel;
- emit viewModeChanged(tr("Search"));
- mSearchA->setChecked(true);
- if(filter.isEmpty()){
- emit message(QString(tr("No search term set! Cowardly refusing to do anything!")));
- return;
- }
- QString msg = QString(tr("Searching for \"%1\"")).arg(filter);
- emit message(msg);
- qApp->setOverrideCursor(Qt::BusyCursor);
- QStandardItem *root = mSearchModel->invisibleRootItem();
- QStandardItem *artistI = new QStandardItem(QIcon(":/quadd.png"), tr("Artists"));
- artistI->setFont(QFont("courier", -1, QFont::Bold));
- root->appendRow(artistI);
- populateByArtist(artistI, filter);
- QStandardItem *albumI = new QStandardItem(QIcon(":/quadd.png"), tr("Albums"));
- albumI->setFont(QFont("courier", -1, QFont::Bold));
- root->appendRow(albumI);
- populateByAlbum(albumI, filter, FilterType);
- QStandardItem *genreI = new QStandardItem(QIcon(":/quadd.png"), tr("Genres"));
- genreI->setFont(QFont("courier", -1, QFont::Bold));
- root->appendRow(genreI);
- populateByGenre(genreI, filter);
- QStandardItem *songI = new QStandardItem(QIcon(":/quadd.png"), tr("Songs"));
- songI->setFont(QFont("courier", -1, QFont::Bold));
- root->appendRow(songI);
- populateBySong(songI, filter, FilterType);
- for(int i = 0; i < mCurrentModel->rowCount(); ++i){
- QModelIndex exp = mCurrentModel->index(i, 0, QModelIndex());
- if(exp.isValid()){
- mView->expand(exp);
- QModelIndex next = mCurrentModel->index(0, 0, exp);
- if(next.isValid()){
- mView->expand(next);
- }
- }
- }
- qApp->restoreOverrideCursor();
- emit viewModeChanged(tr("Search"));
- emit modelChanged();
-}
-
-void PlayerWidget::clearFilter(){
- mSearch->clear();
- mView->setModel(mViewModel);
- mCurrentModel = mViewModel;
-}
-
void PlayerWidget::reindex(){
IndexerDialog dlg(this);
dlg.exec();
}
void PlayerWidget::addToPlayList(){
- QModelIndexList sel = mView->selectionModel()->selectedRows();
+ CollectionWidget *curWidget = qobject_cast<CollectionWidget*>(mCollectionStack->currentWidget());
+ QModelIndexList sel = curWidget->view()->selectionModel()->selectedRows();
if(sel.isEmpty()){
return;
}
@@ -1305,61 +617,6 @@ void PlayerWidget::removeFromPlayList(){
emit playListLengthChanged(mPlayListLength);
}
-void PlayerWidget::removeFromFavorites(){
- QModelIndexList sel = mView->selectionModel()->selectedRows();
- QSqlDatabase db = QSqlDatabase::database("beetplayerdb");
- QSqlQuery favRemoveQ(db);
- favRemoveQ.prepare("DELETE FROM persistent_favorites WHERE tartist_name = :artist AND talbum_name = :album AND ttitle = :title");
- QVector<QStringList> toRemove;
- for(const QModelIndex &i : sel){
- QStringList cur;
- cur << i.data(ArtistRole).toString();
- cur << i.data(AlbumRole).toString();
- cur << i.data(TitleRole).toString();
- toRemove << cur;
- }
- int cnt = 0;
- for(const QStringList &sl : toRemove){
- favRemoveQ.bindValue(":artist", sl.at(0));
- favRemoveQ.bindValue(":album", sl.at(1));
- favRemoveQ.bindValue(":title", sl.at(2));
- if(favRemoveQ.exec()){
- ++cnt;
- }
- }
- QString msg;
- if(cnt){
- doPopulateByFavorites();
- msg = QString(tr("Removed %1 favorites")).arg(QString::number(cnt));
- }else{
- msg = QString(tr("Failed to remove Favorite!"));
- }
- emit message(msg);
-}
-
-void PlayerWidget::addToFavorites(){
- QModelIndexList sel = mPlayListView->selectionModel()->selectedRows();
- QSqlDatabase db = QSqlDatabase::database("beetplayerdb");
- QSqlQuery favInsertQ(db);
- favInsertQ.prepare("INSERT INTO persistent_favorites (tartist_name, talbum_name, ttitle) VALUES(:artist, :album, :title)");
- for(const QModelIndex &i : sel){
- QString artist = i.data(ArtistRole).toString();
- QString album = i.data(AlbumRole).toString();
- QString title = i.data(TitleRole).toString();
- QString msg;
- favInsertQ.bindValue(":artist", artist);
- favInsertQ.bindValue(":album", album);
- favInsertQ.bindValue(":title", title);
- if(favInsertQ.exec()){
- msg = QString(tr("Added %1 to favorites")).arg(title);
- }else{
- msg = QString(tr("Oops! Failed to add %1 to favorites")).arg(title);
- }
- emit message(msg);
- }
- doPopulateByFavorites();
-}
-
void PlayerWidget::clearPlayList(){
mPlayListModel->clear();
mPlayListModel->setHorizontalHeaderLabels(QStringList() << "Title");
@@ -1423,7 +680,8 @@ void PlayerWidget::playCurrent(const QModelIndex &index){
}
void PlayerWidget::printList(){
- QModelIndexList sel = mView->selectionModel()->selectedRows();
+ CollectionWidget *curWidget = qobject_cast<CollectionWidget*>(mCollectionStack->currentWidget());
+ QModelIndexList sel = curWidget->view()->selectionModel()->selectedRows();
if(sel.isEmpty()){
return;
}
@@ -1456,7 +714,8 @@ void PlayerWidget::searchMusicbrainzRight(){
}
void PlayerWidget::searchMusicbrainzLeft(){
- QModelIndex idx = mView->selectionModel()->currentIndex();
+ CollectionWidget *curWidget = qobject_cast<CollectionWidget*>(mCollectionStack->currentWidget());
+ QModelIndex idx = curWidget->view()->selectionModel()->currentIndex();
if(!idx.isValid()){
return;
}
@@ -1524,22 +783,6 @@ void PlayerWidget::webDlDone(){
mLeftTE->setText(text);
}
-void PlayerWidget::filterFromPlaylist(){
- QModelIndex idx = mPlayListView->selectionModel()->currentIndex();
- if(!idx.isValid()){
- return;
- }
- QString artist = idx.data(ArtistRole).toString();
- mSearch->setText(artist);
- doFilter();
-}
-
-void PlayerWidget::editWebradio(){
- WebRadioDialog dlg(this);
- dlg.exec();
- doPopulateByWebradio();
-}
-
void PlayerWidget::doMetadataChange(const QString &key, const QVariant &value){
if(key == "Title"){
QString np = value.toString();
@@ -1707,20 +950,22 @@ void PlayerWidget::continuePlaying(QMediaPlayer::MediaStatus state){
}
void PlayerWidget::expand(){
- QModelIndexList sel = mView->selectionModel()->selectedRows();
+ CollectionWidget *curWidget = qobject_cast<CollectionWidget*>(mCollectionStack->currentWidget());
+ QModelIndexList sel = curWidget->view()->selectionModel()->selectedRows();
for(const QModelIndex &i : sel){
- mView->expand(i);
+ curWidget->view()->expand(i);
expandRecursive(i);
}
}
void PlayerWidget::expandRecursive(const QModelIndex &idx){
const QStandardItemModel *model = static_cast<const QStandardItemModel*>(idx.model());
+ CollectionWidget *curWidget = qobject_cast<CollectionWidget*>(mCollectionStack->currentWidget());
QStandardItem *item = model->itemFromIndex(idx);
for(int i = 0; i < item->rowCount(); ++i){
QModelIndex cur = model->indexFromItem(item->child(i, 0));
if(cur.isValid()){
- mView->expand(cur);
+ curWidget->view()->expand(cur);
}
}
}
@@ -1731,15 +976,12 @@ void PlayerWidget::readSettings(){
int vol = s.value("volume").toInt();
mVolumeSlider->setValue(vol);
QString dir = s.value("folderdir", QDir::homePath()).toString();
- mCurDir = dir;
- mDir->setText(mCurDir);
mStarting = false;
}
void PlayerWidget::writeSettings(){
QSettings s;
s.setValue("volume", mVolumeSlider->value());
- s.setValue("folderdir", mCurDir);
}
void PlayerWidget::aboutDlg(){
diff --git a/playerwidget.h b/playerwidget.h
index 93efc2c..60e0df9 100644
--- a/playerwidget.h
+++ b/playerwidget.h
@@ -24,6 +24,8 @@ class BeetPlayerProxy;
class BeetView;
class QSystemTrayIcon;
class WebDownloader;
+class QStackedWidget;
+class QSplashScreen;
class PlayerWidget : public QWidget {
Q_OBJECT
@@ -32,43 +34,24 @@ class PlayerWidget : public QWidget {
enum PopulateType { FilterType, IdType, EmptyType };
enum CustomRoles { TypeRole = Qt::UserRole + 1, IdRole = Qt::UserRole + 2, FullPathRole = Qt::UserRole + 3, GenreRole = Qt::UserRole + 4, ArtistRole = Qt::UserRole + 5, TitleRole = Qt::UserRole + 6, AlbumRole = Qt::UserRole + 7, LengthRole = Qt::UserRole + 8, UrlRole = Qt::UserRole + 9, RemoteRole = Qt::UserRole + 10 };
enum ModelType { Webradio, Favorites, Folders, DoNotCare };
- explicit PlayerWidget(QWidget *parent = 0);
+ explicit PlayerWidget(QSplashScreen *splash, QWidget *parent = nullptr);
~PlayerWidget();
const QMediaPlayer* player() const { return mPlayer; }
public slots:
- void doPopulateByArtist();
- void doPopulateByAlbum();
- void doPopulateByGenre();
- void doPopulateBySong();
- void doPopulateByDate();
- void doPopulateByFolder();
- void doPopulateByWebradio();
- void doPopulateByFavorites();
- void doModelChanged();
- void viewDoubleClicked(const QModelIndex &idx);
void rightCurrentChanged(const QModelIndex &cur, const QModelIndex &prev);
void leftCurrentChanged(const QModelIndex &cur, const QModelIndex &prev);
void doPlay();
void doStop();
void doPause();
void doPlayOrPause();
- void doSelectFiles();
- void doDeselect();
- void doDeleteFiles();
void volumeUp();
void volumeDown();
- void dirUp();
- void dirHome();
void showVolume();
- void doFilter();
- void clearFilter();
void reindex();
void addToPlayList();
void addToPlayListAndClear();
void removeFromPlayList();
- void removeFromFavorites();
- void addToFavorites();
void clearPlayList();
void shufflePlayList();
void randomPlay();
@@ -77,8 +60,6 @@ class PlayerWidget : public QWidget {
void searchMusicbrainzRight();
void searchMusicbrainzLeft();
void webDlDone();
- void filterFromPlaylist();
- void editWebradio();
void doMetadataChange(const QString &key, const QVariant &value);
void updateStreamData();
@@ -105,15 +86,8 @@ class PlayerWidget : public QWidget {
void streamDataNeedsUpdate();
private:
- void setupGui();
+ void setupGui(QSplashScreen *splash);
void createActions();
- void populateByArtist(QStandardItem *parent, const QString &filter);
- void populateByAlbum(QStandardItem *parent, const QVariant &filter, int type);
- void populateBySong(QStandardItem *parent, const QVariant &filter, int type);
- void populateByDate(QStandardItem *parent);
- void populateByGenre(QStandardItem *parent, const QString &filter);
- void populateByWebradio(QStandardItem *parent);
- void populateByFavorites(QStandardItem *parent);
void recurse(const QModelIndex &parent);
void addSong(const QModelIndex &idx);
void play(const QString &fullPath);
@@ -123,15 +97,7 @@ class PlayerWidget : public QWidget {
void adjustVolume(int by);
void fillWithText(QTextEdit *te, const TagLib::FileRef &fr);
void setNowPlaying(const QString &what);
- QLineEdit *mSearch;
- QLineEdit *mDir;
QMediaPlayer *mPlayer;
- BeetView *mView;
- QStandardItemModel *mViewModel;
- QStandardItemModel *mSearchModel;
- QStandardItemModel *mCurrentModel;
- QStandardItemModel *mFolderModel;
- QStandardItemModel *mWebRadioModel;
QLabel *mNowPlayingL;
QSlider *mSongSlider;
QLabel *mPos;
@@ -146,26 +112,18 @@ class PlayerWidget : public QWidget {
QAction *mPlayA;
QAction *mStopA;
QAction *mPauseA;
- QAction *mSearchA;
- QAction *mViewByArtistA;
- QAction *mSelectFilesA;
- QAction *mDeselectAllA;
- QAction *mDeleteFilesA;
- QAction *mRefreshA;
- QAction *mRemoveFromFavoritesA;
qint64 mDurSecs;
quint64 mPlayListLength;
- QString mCurDir;
QString mCurWinTitle;
QString mCurToolTip;
QSystemTrayIcon *mTrayIcon;
QTimer *mVolumeTimer;
bool mStarting;
- QStackedLayout *mSearchDirStack;
WebDownloader *mWebDownloader;
QMap<QString, QVariant> mOtherMeta;
bool mIsStream;
int mModelType;
+ QStackedWidget *mCollectionStack;
};
#endif // PLAYERWIDGET_H