diff options
author | Arno <arno@disconnect.de> | 2018-02-17 10:59:01 +0100 |
---|---|---|
committer | Arno <arno@disconnect.de> | 2018-02-17 10:59:01 +0100 |
commit | 8b3e1bcfbf90659c31b0d311359f2f66305631cf (patch) | |
tree | 134f613ce239f18d7dfc2dd6785d5906df8fb478 | |
parent | 613f1e254738ee4b9e23c7dee14e901d50abfb49 (diff) | |
download | BeetPlayer-8b3e1bcfbf90659c31b0d311359f2f66305631cf.tar.gz BeetPlayer-8b3e1bcfbf90659c31b0d311359f2f66305631cf.tar.bz2 BeetPlayer-8b3e1bcfbf90659c31b0d311359f2f66305631cf.zip |
Make use of the new CollectionView classes
This removes pretty much any function. This commit compiles, but it's
completely useless. It can't even play a song, but it does display what
view we're populating on the splash screen, and the view buttons work :)
-rw-r--r-- | beetplayer.cpp | 4 | ||||
-rw-r--r-- | playerwidget.cpp | 970 | ||||
-rw-r--r-- | playerwidget.h | 52 |
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 |