summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--beetplayer.qrc1
-rw-r--r--folder.pngbin0 -> 1412 bytes
-rw-r--r--playerwidget.cpp91
-rw-r--r--playerwidget.h5
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
new file mode 100644
index 0000000..53954fa
--- /dev/null
+++ b/folder.png
Binary files differ
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;