diff options
-rw-r--r-- | archivecontroller.cpp | 142 | ||||
-rw-r--r-- | archivecontroller.h | 12 | ||||
-rw-r--r-- | archivemodel.cpp | 44 | ||||
-rw-r--r-- | archivemodel.h | 8 | ||||
-rw-r--r-- | archiveview.cpp | 2 | ||||
-rw-r--r-- | shemov.cpp | 41 | ||||
-rw-r--r-- | shemov.h | 9 |
7 files changed, 249 insertions, 9 deletions
diff --git a/archivecontroller.cpp b/archivecontroller.cpp index 32528aa..855e1bb 100644 --- a/archivecontroller.cpp +++ b/archivecontroller.cpp @@ -5,11 +5,24 @@ 2 of the License, or (at your option) any later version. */ +#include <QSettings> +#include <QProcess> +#include <QFileInfo> +#include <QMessageBox> +#include <QInputDialog> + #include "archivecontroller.h" #include "archivemodel.h" #include "archiveview.h" +#include "pictureviewer2.h" +#include "smglobals.h" +#include "helper.h" -ArchiveController::ArchiveController(QObject *parent) : QObject(parent) {} +ArchiveController::ArchiveController(QObject *parent) : QObject(parent) { + if(parent){ + mParentWidget = qobject_cast<QWidget*>(this->parent()); + } +} void ArchiveController::setArchiveView(ArchiveTree *atree, ArchiveProxy *aproxy){ mArchiveTree = atree; @@ -20,6 +33,7 @@ void ArchiveController::setArchiveView(ArchiveTree *atree, ArchiveProxy *aproxy) void ArchiveController::setArchiveFiles(ArchiveFiles *afiles, ArchiveFilesProxy *afilesproxy){ mArchiveFiles = afiles; mArchiveFilesProxy = afilesproxy; + mFileSelection = mArchiveFiles->selectionModel(); } void ArchiveController::setModels(ArchiveModel *amodel, ArchiveFilesModel *afilesmodel){ @@ -29,6 +43,108 @@ void ArchiveController::setModels(ArchiveModel *amodel, ArchiveFilesModel *afile void ArchiveController::init(){ connect(mArchiveSelection, SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(treeSelectionChanged(QItemSelection,QItemSelection))); + connect(mArchiveFiles, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(fileDoubleClicked(QModelIndex))); +} + +void ArchiveController::playSelectedFiles(){ + QModelIndexList sel = mFileSelection->selectedRows(); + QStringList files; + foreach(QModelIndex i, sel){ + if(i.data(ArchiveFilesModel::FileTypeRole).toInt() == ArchiveFilesModel::Movie){ + QString fullPath = i.data(ArchiveFilesModel::FullPathRole).toString(); + QFileInfo fi(fullPath); + if(fi.exists()){ + files << fullPath; + } + } + } + if(!files.isEmpty()){ + QPair<QString, QStringList> playerData = Helper::programData("movieviewer"); + QStringList args = playerData.second; + args << files; + QProcess::startDetached(playerData.first, args); + } +} + +void ArchiveController::editQuality(){ + QModelIndexList sel = mFileSelection->selectedRows(ArchiveFilesModel::Quality); + if(sel.isEmpty()){ + return; + } + bool ok; + int quality = QInputDialog::getInt(mParentWidget, tr("Set Quality"), tr("Quality"), 7, 1, 10, 1, &ok); + if(ok){ + foreach(QModelIndex i, sel){ + QModelIndex real = mArchiveFilesProxy->mapToSource(i); + if(mArchiveFilesModel->isMovie(real)){ + mArchiveFilesModel->setData(real, quality, ArchiveFilesModel::QualityRole); + } + } + } +} + +void ArchiveController::editDvdNo(){ + QModelIndexList sel = mFileSelection->selectedRows(ArchiveFilesModel::DvdNo); + if(sel.isEmpty()){ + return; + } + bool ok; + int dvdNo = QInputDialog::getInt(mParentWidget, tr("Set DVD no."), tr("Number (-1 for local)"), mArchiveFilesModel->nextDvd(), -1, 1024 * 1024, 1, &ok); + if(ok){ + foreach(QModelIndex i, sel){ + QModelIndex real = mArchiveFilesProxy->mapToSource(i); + if(mArchiveFilesModel->isMovie(real)){ + mArchiveFilesModel->setData(real, dvdNo, ArchiveFilesModel::DvdNoRole); + } + } + } +} + +void ArchiveController::editFileType(){ + QModelIndexList sel = mFileSelection->selectedRows(ArchiveFilesModel::FileType); + if(sel.isEmpty()){ + return; + } + bool ok; + QStringList types = QStringList() << tr("Movie") << tr("Front Cover") << tr("Back Cover") << tr("General Cover"); + QString item = QInputDialog::getItem(mParentWidget, tr("Set file type"), tr("Type:"), types, 0, false, &ok); + if(ok && !item.isEmpty()){ + int newType = 0; + if(item == tr("Movie")){ + newType = ArchiveFilesModel::Movie; + }else if(item == tr("Front Cover")){ + newType = ArchiveFilesModel::FrontCover; + }else if(item == tr("Back Cover")){ + newType = ArchiveFilesModel::BackCover; + }else if(item == tr("General Cover")){ + newType = ArchiveFilesModel::GeneralCover; + } + if(newType){ + foreach(QModelIndex i, sel){ + QModelIndex real = mArchiveFilesProxy->mapToSource(i); + mArchiveFilesModel->setData(real, newType, ArchiveFilesModel::FileTypeRole); + } + mArchiveFilesModel->refresh(); + mArchiveFiles->expandAll(); + } + } +} + +void ArchiveController::editFileNo(){ + QModelIndexList sel = mFileSelection->selectedRows(ArchiveFilesModel::FileNumber); + if(sel.isEmpty()){ + return; + } + bool ok; + int fileNo = QInputDialog::getInt(mParentWidget, tr("Set DVD no."), tr("Number (-1 for none)"), -1, -1, 1024 * 1024, 1, &ok); + if(ok){ + foreach(QModelIndex i, sel){ + QModelIndex real = mArchiveFilesProxy->mapToSource(i); + if(mArchiveFilesModel->isMovie(real)){ + mArchiveFilesModel->setData(real, fileNo, ArchiveFilesModel::FileNumberRole); + } + } + } } void ArchiveController::treeSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected){ @@ -46,6 +162,30 @@ void ArchiveController::treeSelectionChanged(const QItemSelection &selected, con mArchiveFiles->expandAll(); } +void ArchiveController::fileDoubleClicked(const QModelIndex &idx){ + if(!idx.isValid()){ + return; + } + int type = idx.data(ArchiveFilesModel::FileTypeRole).toInt(); + if(type == ArchiveFilesModel::Movie){ + QString fullPath = idx.data(ArchiveFilesModel::FullPathRole).toString(); + QFileInfo fi(fullPath); + if(!fi.exists()){ + QString msg = QString(tr("%1 not available!")).arg(idx.data(ArchiveFilesModel::FilenameRole).toString()); + QMessageBox::critical(mParentWidget, tr("Error"), msg); + return; + } + QPair<QString, QStringList> playerData = Helper::programData("movieviewer"); + QStringList args = playerData.second; + args << idx.data(ArchiveFilesModel::FullPathRole).toString(); + QProcess::startDetached(playerData.first, args); + return; + } + PictureViewer2 *pv = SmGlobals::instance()->pictureViewer(); + pv->setFile(idx.data(ArchiveFilesModel::FullPathRole).toString()); + pv->show(); +} + QModelIndexList ArchiveController::mapToSource(const QSortFilterProxyModel *proxy, const QModelIndexList idxs) const{ QModelIndexList retval; foreach(QModelIndex idx, idxs){ diff --git a/archivecontroller.h b/archivecontroller.h index 22789bd..b863f29 100644 --- a/archivecontroller.h +++ b/archivecontroller.h @@ -29,10 +29,20 @@ class ArchiveController : public QObject { void setModels(ArchiveModel *amodel, ArchiveFilesModel *afilesmodel); ArchiveFilesModel *archiveFilesModel() { return mArchiveFilesModel; } ArchiveFiles *archiveFiles() { return mArchiveFiles; } + ArchiveModel *archiveTreeModel() { return mArchiveModel; } + ArchiveTree *archiveTree() { return mArchiveTree; } void init(); + public slots: + void playSelectedFiles(); + void editQuality(); + void editDvdNo(); + void editFileType(); + void editFileNo(); + private slots: void treeSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected); + void fileDoubleClicked(const QModelIndex &idx); private: QModelIndexList mapToSource(const QSortFilterProxyModel *proxy, const QModelIndexList idxs) const; @@ -43,6 +53,8 @@ class ArchiveController : public QObject { ArchiveFilesProxy *mArchiveFilesProxy; ArchiveModel *mArchiveModel; ArchiveFilesModel *mArchiveFilesModel; + QItemSelectionModel *mFileSelection; + QWidget *mParentWidget; }; #endif // ARCHIVECONTROLLER_H diff --git a/archivemodel.cpp b/archivemodel.cpp index 2dd151b..d6a30ef 100644 --- a/archivemodel.cpp +++ b/archivemodel.cpp @@ -416,6 +416,9 @@ QVariant ArchiveFilesModel::data(const QModelIndex &index, int role) const { } SmTreeItem *item = itemAt(index); int col = index.column(); + if(role == ExpansionRole){ + return item->data(Expansion); + } if(role == SeriesPartIdRole){ return item->data(SeriesPartId); } @@ -498,9 +501,10 @@ bool ArchiveFilesModel::setData(const QModelIndex &idx, const QVariant &value, i return SmTreeModel::setData(idx, value, role); } QString queryString = QString("UPDATE files SET %1 = :value WHERE ifiles_id = :id").arg(dbColumn); - QSqlQuery q(queryString, mDb); + QSqlQuery q(mDb); + q.prepare(queryString); q.bindValue(":value", value); - q.bindValue(":id", idx.data()); + q.bindValue(":id", idx.data(FileIdRole)); mDb.transaction(); bool success = q.exec(); if(success){ @@ -514,6 +518,8 @@ bool ArchiveFilesModel::setData(const QModelIndex &idx, const QVariant &value, i // check rename, too! if(success){ mDb.commit(); + SmTreeItem *item = itemAt(idx); + item->setData(idx.column(), value); emit dataChanged(idx, idx); return true; } @@ -522,17 +528,40 @@ bool ArchiveFilesModel::setData(const QModelIndex &idx, const QVariant &value, i return false; } +Qt::ItemFlags ArchiveFilesModel::flags(const QModelIndex &index) const{ + if(index.isValid()){ + QVariant v = index.data(ExpansionRole); + if(!v.isNull()){ + return Qt::ItemIsEnabled; + } + } + return SmTreeModel::flags(index); +} + +int ArchiveFilesModel::nextDvd() const{ + int retval; + QSqlQuery q("SELECT max(idvd) FROM files", mDb); + while(q.next()){ + retval = q.value(0).toInt(); + } + return retval + 1; +} + +bool ArchiveFilesModel::isMovie(const QModelIndex &idx) const{ + return idx.data(FileTypeRole).toInt() == Movie; +} + void ArchiveFilesModel::populate(const QSet<int> &seriesPartIds){ if(seriesPartIds.isEmpty()){ return; } + mSeriesPartIds = seriesPartIds; SmTreeItem *root = new SmTreeItem(NumFields); SmTreeItem *movies = new SmTreeItem(NumFields, root); movies->setData(Expansion, QChar(0x2642)); root->appendChild(movies); SmTreeItem *pictures = new SmTreeItem(NumFields, root); pictures->setData(Expansion, QChar(0x2640)); - root->appendChild(pictures); QStringList ids; foreach(int i, seriesPartIds){ ids << QString::number(i); @@ -560,9 +589,18 @@ void ArchiveFilesModel::populate(const QSet<int> &seriesPartIds){ pictures->appendChild(newItem); } } + if(pictures->childCount()){ + root->appendChild(pictures); + }else{ + delete pictures; + } setRoot(root); } +void ArchiveFilesModel::refresh(){ + populate(mSeriesPartIds); +} + /* * ArchiveCollector BEGIN */ diff --git a/archivemodel.h b/archivemodel.h index 62c6508..7e77642 100644 --- a/archivemodel.h +++ b/archivemodel.h @@ -76,10 +76,16 @@ class ArchiveFilesModel : public SmTreeModel { explicit ArchiveFilesModel(const QStringList &headers, QObject *parent = 0); virtual QVariant data(const QModelIndex &index, int role) const; virtual bool setData(const QModelIndex &idx, const QVariant &value, int role); + virtual Qt::ItemFlags flags(const QModelIndex &index) const; + int nextDvd() const; + bool isMovie(const QModelIndex &idx) const; void populate(const QSet<int> &seriesPartIds); + public slots: + void refresh(); + private: - QList<int> mSeriesPartIds; + QSet<int> mSeriesPartIds; QHash<int, QString> mRoleDbColumnMap; QSqlDatabase mDb; }; diff --git a/archiveview.cpp b/archiveview.cpp index 53903f9..d829356 100644 --- a/archiveview.cpp +++ b/archiveview.cpp @@ -84,6 +84,8 @@ ArchiveView::ArchiveView(QWidget *parent) : QWidget(parent) { mFiles->setItemDelegateForColumn(ArchiveFilesModel::Size, new SizeDelegate(this)); mFiles->setItemDelegateForColumn(ArchiveFilesModel::SizeDur, new DurationDelegate(this)); mFiles->setItemDelegateForColumn(ArchiveFilesModel::FileNumber, new EmptyDelegate(this)); + mFiles->setSelectionMode(QAbstractItemView::ExtendedSelection); + mFiles->setSelectionBehavior(QAbstractItemView::SelectRows); mFilesModel = new ArchiveFilesModel(QStringList() << QChar(0x26A7) << tr("Seriespartid") << tr("Filename") << tr("Md5Sum") << tr("Size") << tr("Dvd") << tr("Type") << tr("No") << tr("Q") << tr("Fileid") << tr("S/Dur") << tr("Full Path"), this); mFilesProxy = new ArchiveFilesProxy; mFilesProxy->setSourceModel(mFilesModel); @@ -185,6 +185,7 @@ void SheMov::tabChanged(int newTab){ mViewAVMenuA->setVisible(newTab == Archive); mViewPicMenuA->setVisible(newTab == Pictures); mArchiveViewMenuA->setVisible(newTab == Experimental); + mArchiveMenuA->setVisible(newTab == Experimental); mCdupA->setEnabled(newTab == FileManager); mBackDirA->setEnabled(newTab == FileManager); mFilesTreeHeadersGroup->setEnabled(newTab == Archive); @@ -743,14 +744,26 @@ void SheMov::createActions(){ /* picView(er) END Actions! */ // ArchiveView actions + ArchiveController *c = SmGlobals::instance()->archiveController(); // rename mArchiveViewRenameA = new QAction(tr("Rename..."), this); - connect(mArchiveViewRenameA, SIGNAL(triggered()), mArchive->archiveTree(), SLOT(rename())); - mArchive->archiveTree()->addAction(mArchiveViewRenameA); + connect(mArchiveViewRenameA, SIGNAL(triggered()), c->archiveTree(), SLOT(rename())); // remove mArchiveViewRemoveA = new QAction(tr("Remove..."), this); - connect(mArchiveViewRemoveA, SIGNAL(triggered()), mArchive->archiveTree(), SLOT(remove())); - mArchive->archiveTree()->addAction(mArchiveViewRemoveA); + connect(mArchiveViewRemoveA, SIGNAL(triggered()), c->archiveTree(), SLOT(remove())); + + // ArchiveFiles actions + mArchiveFilesPlayA = new QAction(tr("Play selected..."), this); + connect(mArchiveFilesPlayA, SIGNAL(triggered()), c, SLOT(playSelectedFiles())); + mArchiveFilesQualityA = new QAction(tr("Set Quality..."), this); + connect(mArchiveFilesQualityA, SIGNAL(triggered()), c, SLOT(editQuality())); + mArchiveFilesDvdNoA = new QAction(tr("Set Dvd No. ..."), this); + connect(mArchiveFilesDvdNoA, SIGNAL(triggered()), c, SLOT(editDvdNo())); + mArchiveFilesTypeA = new QAction(tr("Set file type..."), this); + connect(mArchiveFilesTypeA, SIGNAL(triggered()), c, SLOT(editFileType())); + mArchiveFilesFileNoA = new QAction(tr("Set File No. ..."), this); + connect(mArchiveFilesFileNoA, SIGNAL(triggered()), c, SLOT(editFileNo())); + //don't add actions with checkable(true) unless you know what you're doing! mPicActionGroup = new QActionGroup(this); @@ -824,6 +837,10 @@ void SheMov::createMenus(){ mEditPicMenu->addAction(mPWEditPicMappingsA); mEditPicMenuA = menuBar()->addMenu(mEditPicMenu); + //Archive edit menu: populated when creating context menu! + mArchiveEditMenu = new QMenu(tr("&Edit"), this); + mArchiveMenuA = menuBar()->addMenu(mArchiveEditMenu); + //TreeView view menu mTreeViewMenu = new QMenu(tr("&View"), this); mTreeViewMenu->addAction(mShowNormalA); @@ -972,6 +989,22 @@ void SheMov::createMenus(){ mATree->filesWidget()->filesTree()->addAction(mDeleteFilesFromTreeA); mATree->filesWidget()->filesTree()->addAction(createSeparator()); + // Archive tree (exp.) + ArchiveController *c = SmGlobals::instance()->archiveController(); + c->archiveTree()->addAction(mArchiveViewRenameA); + c->archiveTree()->addAction(mArchiveViewRemoveA); + + // Archive files (exp.) + c->archiveFiles()->addAction(mArchiveFilesPlayA); + c->archiveFiles()->addAction(createSeparator()); + c->archiveFiles()->addAction(mArchiveFilesQualityA); + c->archiveFiles()->addAction(mArchiveFilesDvdNoA); + c->archiveFiles()->addAction(mArchiveFilesTypeA); + c->archiveFiles()->addAction(mArchiveFilesFileNoA); + mArchiveEditMenu->addActions(c->archiveTree()->actions()); + mArchiveEditMenu->addAction(createSeparator()); + mArchiveEditMenu->addActions(c->archiveFiles()->actions()); + QMenu *copyMenu = new QMenu(this); copyMenu->addAction(mCopyUnixFullPathA); copyMenu->addAction(mCopyUnixDirA); @@ -191,6 +191,14 @@ class SheMov : public QMainWindow { QAction *mArchiveViewRemoveA; QActionGroup *mArchiveFilesAG; + //ArchiveFiles actions + QAction *mArchiveMenuA; + QAction *mArchiveFilesPlayA; + QAction *mArchiveFilesQualityA; + QAction *mArchiveFilesDvdNoA; + QAction *mArchiveFilesTypeA; + QAction *mArchiveFilesFileNoA; + QSignalMapper *mOpenWithMapperFS; QSignalMapper *mOpenWithMapperAV; QSignalMapper *mFilterMapper; @@ -198,6 +206,7 @@ class SheMov : public QMainWindow { QMenu *mEditFSMenu; QMenu *mEditAVMenu; QMenu *mEditPicMenu; + QMenu *mArchiveEditMenu; QMenu *mOpenWithMenuFS; QMenu *mOpenWithMenuAV; QMenu *mTreeViewMenu; |