From 92c0ab74e931ba8846de50cb0572df94472a40ce Mon Sep 17 00:00:00 2001 From: Arno Date: Fri, 14 May 2010 13:52:30 +0200 Subject: Added "Play selected" and "Open with" to ArchiveViewWidget Implemented "Play selected movies" and "Open with" functions in ArchiveViewWidget. Also fixed a potential crash when re-creating the "Open with"-submenus. It's not possible to remove actions from an ActionGroup while iterating over the group with foreach. The ActionGroup is modified when calling removeAction() thus throwing the iterator of the loop off. Solution: First remove the actions from the ActionGroup and then delete the ActionGroup itself. The QObject destructor will take care of the contained Actions. --- archiveviewwidget.cpp | 50 +++++++++++++++++++++++-- archiveviewwidget.h | 4 ++ shemov.cpp | 101 +++++++++++++++++++++++++++++++++----------------- shemov.h | 18 ++++++--- 4 files changed, 130 insertions(+), 43 deletions(-) diff --git a/archiveviewwidget.cpp b/archiveviewwidget.cpp index 22a51f1..42532c5 100644 --- a/archiveviewwidget.cpp +++ b/archiveviewwidget.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include "archiveviewwidget.h" #include "archivefileview.h" @@ -155,9 +156,9 @@ void ArchiveViewWidget::showMovie(const QModelIndex &movie){ emit statusbarMessage(tr("Movie is not present on filesystem")); return; } - QSettings s; - QString playerPath = s.value("paths/movieviewer").toString(); - QStringList args = s.value("paths/movieviewerargs").toStringList(); + QPair pData = playerData(QString()); + QString playerPath = pData.first; + QStringList args = pData.second; args << real.data(MovieModel::FullPathRole).toString(); QProcess::startDetached(playerPath, args); } @@ -295,6 +296,18 @@ void ArchiveViewWidget::deleteFromArchive(){ } } +void ArchiveViewWidget::playSelected(const QString &player){ + QStringList selectedMovies = selectedFiles(); + if(selectedMovies.isEmpty()){ + return; + } + QPair pData = playerData(player); + QString prog = pData.first; + QStringList args = pData.second; + args << selectedMovies; + QProcess::startDetached(prog, args); +} + void ArchiveViewWidget::rowChanged(const QModelIndex &/*current*/, const QModelIndex & /*prev*/){ QModelIndex idx = getSourceColumnZero(); mWindowTitle = QString(tr("%1 - %2")).arg(qApp->applicationName()).arg(idx.data().toString()); @@ -324,3 +337,34 @@ const QModelIndex ArchiveViewWidget::getSourceColumnZero(){ return retval; } +QPair ArchiveViewWidget::playerData(const QString &preferred){ + QSettings s; + QHash data = s.value("programs_movieviewer/data").toHash(); + if(!preferred.isEmpty()){ + if(data.keys().contains(preferred)){ + QHash pData = data.value(preferred).toHash(); + return qMakePair(pData.value("path").toString(), pData.value("args").toStringList()); + } + return QPair(); + } + QString defaultPlayer = s.value("programs_movieviewer/default").toString(); + if(data.keys().contains(defaultPlayer)){ + QHash pData = data.value(defaultPlayer).toHash(); + return qMakePair(pData.value("path").toString(), pData.value("args").toStringList()); + } + return QPair(); +} + +QStringList ArchiveViewWidget::selectedFiles(){ + QModelIndexList selected = fileView()->selectionModel()->selectedRows(); + if(selected.isEmpty()){ + return QStringList(); + } + QStringList retval; + foreach(QModelIndex idx, selected){ + if(idx.data(MovieModel::DvdRole).toInt() == -1){ + retval << idx.data(MovieModel::FullPathRole).toString(); + } + } + return retval; +} diff --git a/archiveviewwidget.h b/archiveviewwidget.h index 6a9823b..4f56af5 100644 --- a/archiveviewwidget.h +++ b/archiveviewwidget.h @@ -9,6 +9,7 @@ #define ARCHIVEVIEWWIDGET_H #include +#include #include "archivefileview.h" @@ -46,6 +47,7 @@ class ArchiveViewWidget : public QWidget { void moveBurn(); void setDvdNo(); void deleteFromArchive(); + void playSelected(const QString &player = QString()); signals: void statusbarMessage(const QString &message); @@ -58,6 +60,8 @@ class ArchiveViewWidget : public QWidget { private: const QModelIndex getSourceColumnZero(); + QPair playerData(const QString &preferred); + QStringList selectedFiles(); QComboBox *mGenre; QComboBox *mActors; QLineEdit *mName; diff --git a/shemov.cpp b/shemov.cpp index ceacdbb..503a2bc 100644 --- a/shemov.cpp +++ b/shemov.cpp @@ -43,7 +43,7 @@ #include "statisticsdialog.h" #include "filesystemfileproxy.h" -SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, flags) { +SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, flags), mOpenWithGroupFS(0), mOpenWithGroupAV(0) { qApp->setWindowIcon(QIcon(":/shemov.png")); QSettings s; @@ -161,6 +161,8 @@ void SheMov::configure(){ ConfigurationDialog dlg(this); dlg.exec(); createExtractMenu(); + createOpenWithMenuFS(); + createOpenWithMenuAV(); } void SheMov::tabChanged(int newTab){ @@ -258,8 +260,8 @@ void SheMov::createStatusbar(){ void SheMov::createActions(){ //File menu - mPlaySelectedA = new QAction(tr("Play selected movies..."), this); - connect(mPlaySelectedA, SIGNAL(triggered()), mFSWidget, SLOT(playSelected())); + mPlaySelectedFSA = new QAction(tr("Play selected movies..."), this); + connect(mPlaySelectedFSA, SIGNAL(triggered()), mFSWidget, SLOT(playSelected())); mQuitA = new QAction(tr("Quit"), this); mQuitA->setShortcut(tr("CTRL+q")); @@ -324,6 +326,8 @@ void SheMov::createActions(){ createExtractMenu(); //Edit menu (archive) + mPlaySelectedAVA = new QAction(tr("Play selected movies..."), this); + connect(mPlaySelectedAVA, SIGNAL(triggered()), mAVWidget, SLOT(playSelected())); mEditArchiveFileA = new QAction(tr("Edit file..."), this); mEditArchiveFileA->setShortcut(tr("CTRL+e")); connect(mEditArchiveFileA, SIGNAL(triggered()), mAVWidget, SLOT(editFile())); @@ -350,16 +354,17 @@ void SheMov::createActions(){ connect(mStatisticsA, SIGNAL(triggered()), this, SLOT(showStatistics())); // misc - mOpenWithGroup = new QActionGroup(this); - mOpenWithMapper = new QSignalMapper(this); - connect(mOpenWithMapper, SIGNAL(mapped(QString)), mFSWidget, SLOT(playSelected(QString))); + mOpenWithMapperFS = new QSignalMapper(this); + mOpenWithMapperAV = new QSignalMapper(this); + connect(mOpenWithMapperFS, SIGNAL(mapped(QString)), mFSWidget, SLOT(playSelected(QString))); + connect(mOpenWithMapperAV, SIGNAL(mapped(QString)), mAVWidget, SLOT(playSelected(QString))); connect(mFSWidget->dirModel(), SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(setFsFree())); connect(mFSWidget->dirModel(), SIGNAL(layoutChanged()), this, SLOT(setFsFree())); } void SheMov::createMenus(){ QMenu *fileMenu = new QMenu(tr("&File"), this); - fileMenu->addAction(mPlaySelectedA); + fileMenu->addAction(mPlaySelectedFSA); fileMenu->addSeparator(); fileMenu->addAction(mQuitA); mEditFSMenu = new QMenu(tr("&Edit"), this); @@ -412,12 +417,12 @@ void SheMov::createMenus(){ menuBar()->addMenu(helpMenu); // FilesystemWidget context menu - mOpenWithMenu = new QMenu(tr("Open with"), this); - mFSWidget->fileView()->addAction(mPlaySelectedA); - createOpenWithMenu(); - mOpenWithMenuA = new QAction(tr("Open with"), this); - mOpenWithMenuA->setMenu(mOpenWithMenu); - mFSWidget->fileView()->addAction(mOpenWithMenuA); + mOpenWithMenuFS = new QMenu(tr("Open with"), this); + mFSWidget->fileView()->addAction(mPlaySelectedFSA); + createOpenWithMenuFS(); + mOpenWithMenuFSA = new QAction(tr("Open with"), this); + mOpenWithMenuFSA->setMenu(mOpenWithMenuFS); + mFSWidget->fileView()->addAction(mOpenWithMenuFSA); QAction *sep1 = new QAction(this); sep1->setSeparator(true); mFSWidget->fileView()->addAction(sep1); @@ -442,48 +447,76 @@ void SheMov::createMenus(){ mFSWidget->fileView()->addAction(mArchiveA); //ArchiveViewWidget context menu + mOpenWithMenuAV = new QMenu(tr("Open with"), this); + mAVWidget->fileView()->addAction(mPlaySelectedAVA); + createOpenWithMenuAV(); + mOpenWithMenuAVA = new QAction(tr("Open with"), this); + mOpenWithMenuAVA->setMenu(mOpenWithMenuAV); + mAVWidget->fileView()->addAction(mOpenWithMenuAVA); + QAction *sep5 = new QAction(this); + sep5->setSeparator(true); + mAVWidget->fileView()->addAction(sep5); mAVWidget->fileView()->addAction(mEditArchiveFileA); mAVWidget->fileView()->addAction(mEditArchiveCoverA); mAVWidget->fileView()->addAction(mAddMovieManuallyA); mAVWidget->fileView()->addAction(mDeleteFromArchiveA); mAVWidget->fileView()->addAction(mSetDvdA); - QAction *sep5 = new QAction(this); - sep5->setSeparator(true); - mAVWidget->fileView()->addAction(sep5); - mAVWidget->fileView()->addAction(mMoveBurnA); QAction *sep6 = new QAction(this); sep6->setSeparator(true); mAVWidget->fileView()->addAction(sep6); + mAVWidget->fileView()->addAction(mMoveBurnA); + QAction *sep7 = new QAction(this); + sep7->setSeparator(true); + mAVWidget->fileView()->addAction(sep7); mAVWidget->fileView()->addAction(mPropertiesA); } -void SheMov::createOpenWithMenu(){ - foreach(QAction *a, mOpenWithGroup->actions()){ - mOpenWithMenu->removeAction(a); - mOpenWithGroup->removeAction(a); - delete a; +void SheMov::createOpenWithMenuFS(){ + if(mOpenWithGroupFS){ + foreach(QAction *a, mOpenWithGroupFS->actions()){ + mOpenWithMenuFS->removeAction(a); + } } + mOpenWithGroupFS->deleteLater(); + mOpenWithGroupFS = new QActionGroup(this); QSettings s; QStringList moviePlayers = s.value("programs_movieviewer/data").toHash().keys(); moviePlayers.sort(); foreach(QString p, moviePlayers){ - QAction *a = new QAction(p, this); - mOpenWithGroup->addAction(a); - mOpenWithMenu->addAction(a); - mOpenWithMapper->setMapping(a, p); - connect(a, SIGNAL(triggered()), mOpenWithMapper, SLOT(map())); + QAction *a = new QAction(p, mOpenWithGroupFS); + mOpenWithMenuFS->addAction(a); + mOpenWithMapperFS->setMapping(a, p); + connect(a, SIGNAL(triggered()), mOpenWithMapperFS, SLOT(map())); } - QAction *sep = new QAction(this); + QAction *sep = new QAction(mOpenWithGroupFS); sep->setSeparator(true); - mOpenWithMenu->addAction(sep); + mOpenWithMenuFS->addAction(sep); QStringList picViewers = s.value("programs_pictureviewer/data").toHash().keys(); picViewers.sort(); foreach(QString p, picViewers){ - QAction *a = new QAction(p, this); - mOpenWithGroup->addAction(a); - mOpenWithMenu->addAction(a); - mOpenWithMapper->setMapping(a, p); - connect(a, SIGNAL(triggered()), mOpenWithMapper, SLOT(map())); + QAction *a = new QAction(p, mOpenWithGroupFS); + mOpenWithMenuFS->addAction(a); + mOpenWithMapperFS->setMapping(a, p); + connect(a, SIGNAL(triggered()), mOpenWithMapperFS, SLOT(map())); + } +} + +void SheMov::createOpenWithMenuAV(){ + if(mOpenWithGroupAV){ + foreach(QAction *a, mOpenWithGroupAV->actions()){ + mOpenWithMenuAV->removeAction(a); + } + } + //this deletes all actions in the group also! + mOpenWithGroupAV->deleteLater(); + mOpenWithGroupAV = new QActionGroup(this); + QSettings s; + QStringList players = s.value("programs_movieviewer/data").toHash().keys(); + foreach(QString p, players){ + QAction *a = new QAction(p, mOpenWithGroupAV); + mOpenWithMenuAV->addAction(a); + mOpenWithMapperAV->setMapping(a, p); + connect(a, SIGNAL(triggered()), mOpenWithMapperAV, SLOT(map())); } } diff --git a/shemov.h b/shemov.h index 8d5ea56..5d6dc46 100644 --- a/shemov.h +++ b/shemov.h @@ -51,7 +51,8 @@ class SheMov : public QMainWindow { void createStatusbar(); void createActions(); void createMenus(); - void createOpenWithMenu(); + void createOpenWithMenuFS(); + void createOpenWithMenuAV(); void createExtractMenu(); void writeSettings(); void readSettings(); @@ -89,21 +90,26 @@ class SheMov : public QMainWindow { QAction *mAboutShemovA; QAction *mAboutQtA; QAction *mStatisticsA; - QAction *mPlaySelectedA; - QAction *mOpenWithMenuA; + QAction *mPlaySelectedFSA; + QAction *mPlaySelectedAVA; + QAction *mOpenWithMenuFSA; + QAction *mOpenWithMenuAVA; QAction *mRenameMenuA; QList mExtractToA; - QActionGroup *mOpenWithGroup; + QActionGroup *mOpenWithGroupFS; + QActionGroup *mOpenWithGroupAV; //EndActions QSignalMapper *mRenameMapper; QSignalMapper *mExtractMapper; - QSignalMapper *mOpenWithMapper; + QSignalMapper *mOpenWithMapperFS; + QSignalMapper *mOpenWithMapperAV; QMenu *mExtractMenu; QMenu *mEditFSMenu; QMenu *mEditArchiveMenu; - QMenu *mOpenWithMenu; + QMenu *mOpenWithMenuFS; + QMenu *mOpenWithMenuAV; QMenu *mRenameMenu; QAction *mEditFSMenuA; QAction *mEditArchiveMenuA; -- cgit v1.2.3-70-g09d2