From 18a94d2e4829f378bba7aaf97e2056b45b5ea7a8 Mon Sep 17 00:00:00 2001 From: Arno Date: Mon, 20 Mar 2017 05:07:26 +0100 Subject: Implement select, deselect all and delete for folder view CTRL++ -> select pattern CTRL+- -> deselect all Delete -> Delete selected files --- beetplayer.qrc | 1 + bizarre_amputee.png | Bin 0 -> 688 bytes playerwidget.cpp | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++ playerwidget.h | 8 ++++++ 4 files changed, 80 insertions(+) create mode 100644 bizarre_amputee.png diff --git a/beetplayer.qrc b/beetplayer.qrc index 9f495ac..5525157 100644 --- a/beetplayer.qrc +++ b/beetplayer.qrc @@ -25,5 +25,6 @@ splash.png gaping_ass.png fill-color.png + bizarre_amputee.png diff --git a/bizarre_amputee.png b/bizarre_amputee.png new file mode 100644 index 0000000..0b1d62a Binary files /dev/null and b/bizarre_amputee.png differ diff --git a/playerwidget.cpp b/playerwidget.cpp index 3645442..5a69744 100644 --- a/playerwidget.cpp +++ b/playerwidget.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -93,6 +94,15 @@ void PlayerWidget::setupGui(){ viewAG->addAction(mSearchA); connect(mSearchA, SIGNAL(triggered()), this, SLOT(doFilter())); viewTB->addActions(viewAG->actions()); + mSelectFilesA = new QAction(QIcon(":/bizarre_amputee.png"), tr("Select files..."), this); + mSelectFilesA->setShortcut(tr("CTRL++")); + connect(mSelectFilesA, SIGNAL(triggered()), this, SLOT(doSelectFiles())); + mDeselectAllA = new QAction(QIcon(":/gaping_ass.png"), tr("Clear Selection"), this); + mDeselectAllA->setShortcut(tr("CTRL+-")); + connect(mDeselectAllA, SIGNAL(triggered()), this, SLOT(doDeselect())); + mDeleteFilesA = new QAction(QIcon(":/delete.png"), tr("Delete files..."), this); + mDeleteFilesA->setShortcut(QKeySequence::Delete); + connect(mDeleteFilesA, SIGNAL(triggered()), this, SLOT(doDeleteFiles())); //filter QGroupBox *filterGB = new QGroupBox(tr("Search")); @@ -122,6 +132,7 @@ void PlayerWidget::setupGui(){ selViewL->addStretch(); leftWidgetL->addLayout(selViewL); leftWidget->setLayout(leftWidgetL); + connect(this, SIGNAL(modelChanged()), this, SLOT(doModelChanged())); //now playing label mNowPlayingL = new QLabel; @@ -282,6 +293,10 @@ void PlayerWidget::createActions(){ 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(randomPlayA); mPlayListView->addAction(removeFromPlayListA); mPlayListView->addAction(shufflePlayistA); @@ -578,6 +593,19 @@ void PlayerWidget::doPopulateByFolder(QString dir){ } mView->setModel(mFolderModel); emit viewModeChanged(tr("Folder")); + emit modelChanged(); +} + +void PlayerWidget::doModelChanged(){ + if(mCurrentModel == mFolderModel){ + mSelectFilesA->setEnabled(true); + mDeselectAllA->setEnabled(true); + mDeleteFilesA->setEnabled(true); + }else{ + mSelectFilesA->setEnabled(false); + mDeselectAllA->setEnabled(false); + mDeleteFilesA->setEnabled(false); + } } void PlayerWidget::viewDoubleClicked(const QModelIndex &idx){ @@ -648,6 +676,44 @@ 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 items = mFolderModel->findItems(pattern, Qt::MatchWildcard); + mView->selectionModel()->clear(); + foreach(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){ + foreach(QModelIndex i, sel){ + QString cur = i.data(FullPathRole).toString(); + QFileInfo file(cur); + if(file.isFile()){ + QFile::remove(cur); + } + if(file.isDir()){ + file.dir().removeRecursively(); + } + } + doPopulateByFolder(); + } + } +} + void PlayerWidget::volumeUp(){ adjustVolume(2); } @@ -721,6 +787,7 @@ void PlayerWidget::doPopulateByArtist(){ mViewByArtistA->setChecked(true); emit viewModeChanged(tr("Artist")); emit message(QString(tr("Done!"))); + emit modelChanged(); } void PlayerWidget::doPopulateByAlbum(){ @@ -736,6 +803,7 @@ void PlayerWidget::doPopulateByAlbum(){ qApp->restoreOverrideCursor(); emit viewModeChanged(tr("Album")); emit message(QString(tr("Done!"))); + emit modelChanged(); } void PlayerWidget::doPopulateByGenre(){ @@ -751,6 +819,7 @@ void PlayerWidget::doPopulateByGenre(){ qApp->restoreOverrideCursor(); emit viewModeChanged(tr("Genre")); emit message(QString(tr("Done!"))); + emit modelChanged(); } void PlayerWidget::doPopulateBySong(){ @@ -766,6 +835,7 @@ void PlayerWidget::doPopulateBySong(){ qApp->restoreOverrideCursor(); emit viewModeChanged(tr("Song")); emit message(QString(tr("Done!"))); + emit modelChanged(); } void PlayerWidget::doFilter(){ @@ -790,6 +860,7 @@ void PlayerWidget::doFilter(){ populateBySong(root, filter, FilterType); qApp->restoreOverrideCursor(); emit viewModeChanged(tr("Search")); + emit modelChanged(); } void PlayerWidget::clearFilter(){ diff --git a/playerwidget.h b/playerwidget.h index 2c5542b..0a1a9c2 100644 --- a/playerwidget.h +++ b/playerwidget.h @@ -33,11 +33,15 @@ class PlayerWidget : public QWidget { void doPopulateByGenre(); void doPopulateBySong(); void doPopulateByFolder(QString dir = QString()); + void doModelChanged(); void viewDoubleClicked(const QModelIndex &idx); void doPlay(); void doStop(); void doPause(); void doPlayOrPause(); + void doSelectFiles(); + void doDeselect(); + void doDeleteFiles(); void volumeUp(); void volumeDown(); void doFilter(); @@ -68,6 +72,7 @@ class PlayerWidget : public QWidget { void numFilesChanged(int numFiles); void playListLengthChanged(quint64 secs); void message(const QString &msg); + void modelChanged(); void setWinTitle(const QString &title); private: @@ -104,6 +109,9 @@ class PlayerWidget : public QWidget { QAction *mPauseA; QAction *mSearchA; QAction *mViewByArtistA; + QAction *mSelectFilesA; + QAction *mDeselectAllA; + QAction *mDeleteFilesA; qint64 mDurSecs; quint64 mPlayListLength; QString mCurDir; -- cgit v1.2.3-70-g09d2