summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--archivecontroller.cpp142
-rw-r--r--archivecontroller.h12
-rw-r--r--archivemodel.cpp44
-rw-r--r--archivemodel.h8
-rw-r--r--archiveview.cpp2
-rw-r--r--shemov.cpp41
-rw-r--r--shemov.h9
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);
diff --git a/shemov.cpp b/shemov.cpp
index 4ce5114..be3c0d3 100644
--- a/shemov.cpp
+++ b/shemov.cpp
@@ -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);
diff --git a/shemov.h b/shemov.h
index 97fc340..8abc17b 100644
--- a/shemov.h
+++ b/shemov.h
@@ -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;