diff options
author | Arno <arno@disconnect.de> | 2017-03-05 08:09:37 +0100 |
---|---|---|
committer | Arno <arno@disconnect.de> | 2017-03-05 08:09:37 +0100 |
commit | 51990db36b7b4c1ff8ca72ff16ded36c72be24b9 (patch) | |
tree | a66212ec9f99a6ced7d6c717e61b2f11fe684e9f | |
parent | 9343fc6c77da8678df98ceb6330c61f43aa48737 (diff) | |
download | BeetPlayer-51990db36b7b4c1ff8ca72ff16ded36c72be24b9.tar.gz BeetPlayer-51990db36b7b4c1ff8ca72ff16ded36c72be24b9.tar.bz2 BeetPlayer-51990db36b7b4c1ff8ca72ff16ded36c72be24b9.zip |
Implemet Filesystem View
Kinda works, but expect unexpected bugs :)
-rw-r--r-- | beetplayer.qrc | 1 | ||||
-rw-r--r-- | folder.png | bin | 0 -> 1412 bytes | |||
-rw-r--r-- | playerwidget.cpp | 91 | ||||
-rw-r--r-- | playerwidget.h | 5 |
4 files changed, 90 insertions, 7 deletions
diff --git a/beetplayer.qrc b/beetplayer.qrc index 7fb02ef..4ddfecf 100644 --- a/beetplayer.qrc +++ b/beetplayer.qrc @@ -21,5 +21,6 @@ <file>stomp.png</file> <file>clean_tampon.png</file> <file>belly_right_and_clear.png</file> + <file>folder.png</file> </qresource> </RCC> diff --git a/folder.png b/folder.png Binary files differnew file mode 100644 index 0000000..53954fa --- /dev/null +++ b/folder.png diff --git a/playerwidget.cpp b/playerwidget.cpp index deddfe6..40bca39 100644 --- a/playerwidget.cpp +++ b/playerwidget.cpp @@ -15,7 +15,8 @@ #include <QAction> #include <QToolBar> #include <QHash> -#include <QPainter> +#include <QDir> +#include <QMimeDatabase> #include <QApplication> #include <algorithm> @@ -46,7 +47,9 @@ void PlayerWidget::setupGui(){ mView->setModel(mViewModel); mSearchModel = new QStandardItemModel; mView->setSelectionMode(QAbstractItemView::ExtendedSelection); - currentModel = mViewModel; + connect(mView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(viewDoubleClicked(QModelIndex))); + mFolderModel = new QStandardItemModel; + mCurrentModel = mViewModel; QToolBar *viewTB = new QToolBar; QActionGroup *viewAG = new QActionGroup(this); viewAG->setExclusive(true); @@ -66,6 +69,11 @@ void PlayerWidget::setupGui(){ viewByGenreA->setCheckable(true); viewAG->addAction(viewByGenreA); connect(viewByGenreA, SIGNAL(triggered()), this, SLOT(doPopulateByGenre())); + 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, SIGNAL(triggered()), this, SLOT(doPopulateByFolder())); viewTB->addActions(viewAG->actions()); //filter @@ -459,9 +467,67 @@ void PlayerWidget::populateByGenre(QStandardItem *parent, const QString &filter) } } +void PlayerWidget::doPopulateByFolder(QString dir){ + mCurrentModel = mFolderModel; + mFolderModel->clear(); + mFolderModel->setHorizontalHeaderLabels(QStringList() << tr("Name")); + if(dir.isEmpty()){ + dir = QDir::homePath(); + } + QDir d(dir); + 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); + foreach(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()){ + cur->setData(QString::fromStdWString(file.tag()->artist().toWString()), ArtistRole); + cur->setData(QString::fromStdWString(file.tag()->album().toWString()), AlbumRole); + cur->setData(QString::fromStdWString(file.tag()->genre().toWString()), GenreRole); + cur->setData(QString::fromStdWString(file.tag()->title().toWString()), TitleRole); + } + }else{ + cur->setIcon(otherIcon); + } + } + cur->setData(fi.absoluteFilePath(), FullPathRole); + root->appendRow(cur); + } + mView->setModel(mFolderModel); +} + +void PlayerWidget::viewDoubleClicked(const QModelIndex &idx){ + const QStandardItemModel *model = static_cast<const QStandardItemModel*>(idx.model()); + if(model == mViewModel || model == mSearchModel){ + addToPlayList(); + return; + } + QString fp(idx.data(FullPathRole).toString()); + QFileInfo fi(fp); + if(fi.isDir()){ + doPopulateByFolder(fp); + }else{ + addToPlayList(); + } +} + void PlayerWidget::recurse(const QModelIndex &parent){ - for(int i = 0; i < currentModel->rowCount(parent); ++i){ - QModelIndex cur = currentModel->index(i, 0, parent); + for(int i = 0; i < mCurrentModel->rowCount(parent); ++i){ + QModelIndex cur = mCurrentModel->index(i, 0, parent); int type = cur.data(TypeRole).toInt(); if(type == Song){ addSong(cur); @@ -476,6 +542,12 @@ void PlayerWidget::addSong(const QModelIndex &idx){ QString title = idx.data(TitleRole).toString(); QString artist = idx.data(ArtistRole).toString(); QString album = idx.data(AlbumRole).toString(); + QStringList args = QStringList() << title << artist << album; + foreach(QString s, args){ + if(s.isEmpty()){ + s = QString(tr("n/a")); + } + } QString display = QString(tr("%1 - %2 - %3")).arg(artist).arg(title).arg(album); QStandardItem *item = new QStandardItem; item->setEditable(false); @@ -489,6 +561,7 @@ void PlayerWidget::addSong(const QModelIndex &idx){ void PlayerWidget::doPopulateByArtist(){ qApp->setOverrideCursor(Qt::BusyCursor); mView->setModel(mViewModel); + mCurrentModel = mViewModel; mViewModel->clear(); mViewModel->setHorizontalHeaderLabels(QStringList() << tr("Artist name")); QStandardItem *root = mViewModel->invisibleRootItem(); @@ -499,6 +572,7 @@ void PlayerWidget::doPopulateByArtist(){ void PlayerWidget::doPopulateByAlbum(){ qApp->setOverrideCursor(Qt::BusyCursor); mView->setModel(mViewModel); + mCurrentModel = mViewModel; mViewModel->clear(); mViewModel->setHorizontalHeaderLabels(QStringList() << tr("Album name")); QStandardItem *root = mViewModel->invisibleRootItem(); @@ -509,6 +583,7 @@ void PlayerWidget::doPopulateByAlbum(){ void PlayerWidget::doPopulateByGenre(){ qApp->setOverrideCursor(Qt::BusyCursor); mView->setModel(mViewModel); + mCurrentModel = mViewModel; mViewModel->clear(); mViewModel->setHorizontalHeaderLabels(QStringList() << tr("Genre name")); QStandardItem *root = mViewModel->invisibleRootItem(); @@ -519,6 +594,7 @@ void PlayerWidget::doPopulateByGenre(){ void PlayerWidget::doPopulateBySong(){ qApp->setOverrideCursor(Qt::BusyCursor); mView->setModel(mViewModel); + mCurrentModel = mViewModel; mViewModel->clear(); mViewModel->setHorizontalHeaderLabels(QStringList() << tr("Genre name")); QStandardItem *root = mViewModel->invisibleRootItem(); @@ -536,7 +612,7 @@ void PlayerWidget::doFilter(){ mSearchModel->clear(); mSearchModel->setHorizontalHeaderLabels(QStringList() << tr("Name")); mView->setModel(mSearchModel); - currentModel = mSearchModel; + mCurrentModel = mSearchModel; QStandardItem *root = mSearchModel->invisibleRootItem(); populateByArtist(root, filter); populateByGenre(root, filter); @@ -547,7 +623,7 @@ void PlayerWidget::doFilter(){ void PlayerWidget::clearFilter(){ mSearch->clear(); mView->setModel(mViewModel); - currentModel = mViewModel; + mCurrentModel = mViewModel; } void PlayerWidget::reindex(){ @@ -637,6 +713,9 @@ void PlayerWidget::play(const QString &fullPath){ mPlayer->setMedia(QUrl::fromLocalFile(fullPath)); mCurrentTE->clear(); TagLib::FileRef file(QString(fullPath).toUtf8()); + if(file.isNull()){ + return; + } QString artist = QString::fromStdWString(file.tag()->artist().toWString()); QString album = QString::fromStdWString(file.tag()->album().toWString()); QString title = QString::fromStdWString(file.tag()->title().toWString()); diff --git a/playerwidget.h b/playerwidget.h index 5f9210c..383cbc3 100644 --- a/playerwidget.h +++ b/playerwidget.h @@ -29,6 +29,8 @@ class PlayerWidget : public QWidget { void doPopulateByAlbum(); void doPopulateByGenre(); void doPopulateBySong(); + void doPopulateByFolder(QString dir = QString()); + void viewDoubleClicked(const QModelIndex &idx); void doFilter(); void clearFilter(); void reindex(); @@ -66,7 +68,8 @@ class PlayerWidget : public QWidget { BeetView *mView; QStandardItemModel *mViewModel; QStandardItemModel *mSearchModel; - QStandardItemModel *currentModel; + QStandardItemModel *mCurrentModel; + QStandardItemModel *mFolderModel; QLabel *mNowPlayingL; QSlider *mSongSlider; QLabel *mPos; |