summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--archiveviewwidget.cpp120
-rw-r--r--archiveviewwidget.h4
-rw-r--r--filesystemwidget.cpp5
-rw-r--r--filesystemwidget.h1
-rw-r--r--moviemodel.cpp46
-rw-r--r--moviemodel.h3
-rw-r--r--shemov.cpp18
-rw-r--r--shemov.h3
-rw-r--r--textenterdialog.h1
9 files changed, 191 insertions, 10 deletions
diff --git a/archiveviewwidget.cpp b/archiveviewwidget.cpp
index e6ffb4b..cc018b2 100644
--- a/archiveviewwidget.cpp
+++ b/archiveviewwidget.cpp
@@ -16,6 +16,8 @@
#include <QApplication>
#include <QSettings>
#include <QProcess>
+#include <QDir>
+#include <QRegExp>
#include <QDebug>
@@ -130,19 +132,14 @@ void ArchiveViewWidget::addMovie(){
void ArchiveViewWidget::showMovie(const QModelIndex &movie){
QModelIndex real = mProxy->mapToSource(movie);
- QModelIndex dvd = mMovieModel->index(real.row(), MovieItem::Dvd, QModelIndex());
- int dvdno = dvd.data().toInt();
- if(dvdno != -1){
+ if(real.data(MovieModel::DvdRole).toInt() != -1){
emit statusbarMessage(tr("Movie is not present on filesystem"));
return;
}
- QModelIndex fnIdx = mMovieModel->index(real.row(), MovieItem::Filename, QModelIndex());
- QModelIndex md5Idx = mMovieModel->index(real.row(), MovieItem::Md5Sum, QModelIndex());
- QString path = Helper::createArchivePath(fnIdx.data().toString(), md5Idx.data().toString());
QSettings s;
QString playerPath = s.value("paths/movieviewer").toString();
QStringList args = s.value("paths/movieviewerargs").toStringList();
- args << path;
+ args << real.data(MovieModel::FullPathRole).toString();
QProcess::startDetached(playerPath, args);
}
@@ -169,6 +166,115 @@ void ArchiveViewWidget::setActorFilter(const QString &filter){
mProxy->setFilter(filter, ArchiveProxy::ActorFilter);
}
+void ArchiveViewWidget::moveBurn(){
+ QModelIndexList sel = fileView()->selectionModel()->selectedRows();
+ if(sel.isEmpty()){
+ return;
+ }
+ QSettings s;
+ QString destBase = QString("%1/%2").arg(s.value("paths/start").toString()).arg(tr("burn"));
+ QFileInfo dbi(destBase);
+ if(!dbi.exists()){
+ QDir bd(s.value("paths/start").toString());
+ bool success = bd.mkdir(tr("burn"));
+ if(!success){
+ QString msg = QString("Failed to create dir %1 in %2").arg(s.value("paths/start").toString()).arg(tr("burn"));
+ emit statusbarMessage(msg);
+ return;
+ }
+ }else{
+ if(!dbi.isDir()){
+ QString msg = QString("%1 exists but is not a directory").arg(destBase);
+ emit statusbarMessage(msg);
+ return;
+ }
+ }
+ QString question = QString(tr("Really move selected files and covers to %1?")).arg(destBase);
+ int answer = QMessageBox::question(this, tr("Question"), question, QMessageBox::Yes | QMessageBox::No);
+ if(answer == QMessageBox::Yes){
+ QDir destDir(destBase);
+ foreach(QModelIndex idx, sel){
+ QModelIndex real = mProxy->mapToSource(idx);
+ QString file = real.data(MovieModel::FullPathRole).toString();
+ QList<QVariant> covers = real.data(MovieModel::CoverPathRole).toList();
+ QFileInfo fi(file);
+ if(!fi.exists()){
+ QString msg = QString(tr("%1 does not exist on the filesystem")).arg(file);
+ emit statusbarMessage(msg);
+ return;
+ }
+ QString destDirName(real.data(MovieModel::TitleBaseRole).toString());
+ if(real.data(MovieModel::SeriesNoRole).toInt() != -1){
+ destDirName.append(QString(".%1").arg(QString::number(real.data(MovieModel::SeriesNoRole).toInt())));
+ }
+ QRegExp ws("\\s+");
+ destDirName.replace(ws, ".");
+ destDir.mkdir(destDirName);
+ QString finalDestDir = QString("%1/%2").arg(destBase).arg(destDirName);
+ QString newFn = QString("%1/%2").arg(finalDestDir).arg(fi.fileName());
+ QFile::rename(file, newFn);
+ foreach(QVariant c, covers){
+ QFileInfo ci(c.toString());
+ QString newCover = QString("%1/%2").arg(finalDestDir).arg(ci.fileName());
+ QFile::copy(c.toString(), newCover);
+ }
+ }
+ emit refreshDir(destBase);
+ }
+}
+
+void ArchiveViewWidget::setDvdNo(){
+ int dvdno = mMovieModel->maxValue(MovieItem::Dvd).toInt();
+ QModelIndexList idx = fileView()->selectionModel()->selectedRows();
+ if(idx.isEmpty()){
+ return;
+ }
+ if(dvdno != 0){
+ ++dvdno;
+ TextEnterDialog dlg(tr("Enter Dvd No."), this);
+ dlg.setText(QString::number(dvdno));
+ int retval = dlg.exec();
+ if(retval == QDialog::Accepted){
+ QString noString = dlg.text();
+ bool success(false);
+ int no = noString.toLongLong(&success);
+ if(success){
+ foreach(QModelIndex i, idx){
+ QModelIndex real = mProxy->mapToSource(i);
+ if(real.column() != MovieItem::Dvd){
+ real = mMovieModel->index(real.row(), MovieItem::Dvd, QModelIndex());
+ }
+ mMovieModel->setDataAt(real, no);
+ }
+ }
+ }
+ }
+}
+
+void ArchiveViewWidget::deleteFromArchive(){
+ QModelIndexList selected = fileView()->selectionModel()->selectedRows();
+ if(selected.isEmpty()){
+ return;
+ }
+ QString question = QString(tr("Really delete %1 file(s) from archive?")).arg(QString::number(selected.count()));
+ int retval = QMessageBox::question(this, tr("Question"), question, QMessageBox::Yes | QMessageBox::No);
+ if(retval == QMessageBox::Yes){
+ foreach(QModelIndex i, selected){
+ QModelIndex real = mProxy->mapToSource(i);
+ QString path = real.data(MovieModel::FullPathRole).toString();
+ QList<QVariant> covers = real.data(MovieModel::CoverPathRole).toList();
+ bool r = QFile::remove(path);
+ if(r){
+ mMovieModel->removeMovie(real);
+ }
+ foreach(QVariant c, covers){
+ QString cpath = c.toString();
+ QFile::remove(cpath);
+ }
+ }
+ }
+}
+
void ArchiveViewWidget::rowChanged(const QModelIndex &/*current*/, const QModelIndex & /*prev*/){
QModelIndex idx = getSourceColumnZero();
mWindowTitle = QString(tr("%1 - %2")).arg(qApp->applicationName()).arg(idx.data().toString());
diff --git a/archiveviewwidget.h b/archiveviewwidget.h
index f07d9af..6a9823b 100644
--- a/archiveviewwidget.h
+++ b/archiveviewwidget.h
@@ -43,10 +43,14 @@ class ArchiveViewWidget : public QWidget {
void setFilter();
void setGenreFilter(const QString &filter);
void setActorFilter(const QString &filter);
+ void moveBurn();
+ void setDvdNo();
+ void deleteFromArchive();
signals:
void statusbarMessage(const QString &message);
void windowTitle(const QString &title);
+ void refreshDir(const QString &dir);
private slots:
void rowChanged(const QModelIndex &current, const QModelIndex &prev);
diff --git a/filesystemwidget.cpp b/filesystemwidget.cpp
index 38d6a99..4f4e452 100644
--- a/filesystemwidget.cpp
+++ b/filesystemwidget.cpp
@@ -392,6 +392,11 @@ void FilesystemWidget::archiveFiles(){
mAEDialog->activateWindow();
}
+void FilesystemWidget::refreshDir(const QString &dir){
+ QModelIndex idx = mModel->index(dir);
+ mModel->refresh(idx);
+}
+
void FilesystemWidget::setWindowTitle(const QString &dir){
mWindowTitle = QString("%1 - %2").arg(qApp->applicationName()).arg(dir);
emit windowTitle(mWindowTitle);
diff --git a/filesystemwidget.h b/filesystemwidget.h
index c15d77b..b02939c 100644
--- a/filesystemwidget.h
+++ b/filesystemwidget.h
@@ -50,6 +50,7 @@ class FilesystemWidget : public QWidget {
void setTemplate();
void extract(const QString &destDir);
void archiveFiles();
+ void refreshDir(const QString &dir);
private slots:
void doRenameFile();
diff --git a/moviemodel.cpp b/moviemodel.cpp
index da921b4..d92692d 100644
--- a/moviemodel.cpp
+++ b/moviemodel.cpp
@@ -8,6 +8,7 @@
#include <QSqlQuery>
#include <QStringList>
#include <QIcon>
+#include <QSettings>
#include "moviemodel.h"
#include "coveritem.h"
@@ -113,6 +114,7 @@ QVariant MovieModel::data(const QModelIndex &index, int role) const{
if(!index.isValid()){
return QVariant();
}
+ QSettings s;
MovieItem *item = static_cast<MovieItem*>(index.internalPointer());
Q_ASSERT(item != 0);
if(role == Qt::DisplayRole){
@@ -170,6 +172,22 @@ QVariant MovieModel::data(const QModelIndex &index, int role) const{
if(role == DvdRole){
return item->dataAt(MovieItem::Dvd);
}
+ if(role == FullPathRole){
+ QString archivePath = s.value("paths/archivedir").toString();
+ QString md5 = item->dataAt(MovieItem::Md5Sum).toString();
+ QString fileName = item->dataAt(MovieItem::Filename).toString();
+ QString retval = QString("%1/%2/%3/%4").arg(archivePath).arg(md5.at(0)).arg(md5.at(1)).arg(fileName);
+ return retval;
+ }
+ if(role == CoverPathRole){
+ QList<QVariant> retval;
+ QList<QVariant> covers = item->covers();
+ foreach(QVariant c, covers){
+ CoverItem i = c.value<CoverItem>();
+ retval << i.fullPath();
+ }
+ return retval;
+ }
if((role == Qt::DecorationRole) && (index.column() == 0)){
return QIcon(":/dildo.png");
}
@@ -326,6 +344,34 @@ void MovieModel::removeMovie(const QModelIndex &idx){
removeRows(idx.row(), 1, QModelIndex());
}
+const QVariant MovieModel::maxValue(int column) const{
+ if(mItems.isEmpty()){
+ return QVariant();
+ }
+ QVariant sample = mItems.at(0)->dataAt(column);
+ if(sample.canConvert(QVariant::LongLong)){
+ qint64 retval(-1);
+ foreach(MovieItem* i, mItems){
+ qint64 value = i->dataAt(column).toLongLong();
+ if(value > retval){
+ retval = value;
+ }
+ }
+ return retval;
+ }
+ if(sample.canConvert(QVariant::String)){
+ QString retval;
+ foreach(MovieItem *i, mItems){
+ QString value = i->dataAt(column).toString();
+ if(value > retval){
+ retval = value;
+ }
+ }
+ return retval;
+ }
+ return QVariant();
+}
+
void MovieModel::populate(){
QSqlQuery movieQuery("SELECT imovid FROM movies");
while(movieQuery.next()){
diff --git a/moviemodel.h b/moviemodel.h
index 798a809..d757ac1 100644
--- a/moviemodel.h
+++ b/moviemodel.h
@@ -20,7 +20,7 @@ class MovieModel : public QAbstractItemModel {
Q_OBJECT
Q_ENUMS(CustomRoles)
public:
- enum CustomRoles { Md5Role = Qt::UserRole + 1, ActorsRole = Qt::UserRole + 2, ActorsMap = Qt::UserRole + 3, CoverRole = Qt::UserRole + 4, IdRole = Qt::UserRole + 5, TitleBaseRole = Qt::UserRole + 6, SeriesNoRole = Qt::UserRole + 7, PartNoRole = Qt::UserRole + 8, FilenameRole = Qt::UserRole + 9, SizeRole = Qt::UserRole + 10, GenreRole = Qt::UserRole + 11, QualityRole = Qt::UserRole + 12, DvdRole = Qt::UserRole + 13 };
+ enum CustomRoles { Md5Role = Qt::UserRole + 1, ActorsRole = Qt::UserRole + 2, ActorsMap = Qt::UserRole + 3, CoverRole = Qt::UserRole + 4, IdRole = Qt::UserRole + 5, TitleBaseRole = Qt::UserRole + 6, SeriesNoRole = Qt::UserRole + 7, PartNoRole = Qt::UserRole + 8, FilenameRole = Qt::UserRole + 9, SizeRole = Qt::UserRole + 10, GenreRole = Qt::UserRole + 11, QualityRole = Qt::UserRole + 12, DvdRole = Qt::UserRole + 13, FullPathRole = Qt::UserRole + 14, CoverPathRole = Qt::UserRole + 15 };
MovieModel(QObject *parent = 0);
~MovieModel();
QModelIndex index(int row, int column, const QModelIndex &parent) const;
@@ -40,6 +40,7 @@ class MovieModel : public QAbstractItemModel {
void setCovers(int id, const QList<CoverItem> &covers);
void addMovie(const QList<QVariant> &data, const QList<QVariant> &actors, const QList<CoverItem> &covers);
void removeMovie(const QModelIndex &idx);
+ const QVariant maxValue(int column) const;
signals:
void moviesChanged();
diff --git a/shemov.cpp b/shemov.cpp
index 4e18806..c769709 100644
--- a/shemov.cpp
+++ b/shemov.cpp
@@ -87,6 +87,7 @@ SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, fla
connect(mFSWidget, SIGNAL(statusbarMessage(const QString &)), this, SLOT(statusbarMessage(const QString &)));
connect(mFSWidget, SIGNAL(newTemplate(const QString &)), this, SLOT(setTemplate(const QString &)));
connect(mAVWidget, SIGNAL(statusbarMessage(const QString &)), this, SLOT(statusbarMessage(const QString &)));
+ connect(mAVWidget, SIGNAL(refreshDir(const QString &)), mFSWidget, SLOT(refreshDir(const QString &)));
connect(mTab, SIGNAL(currentChanged(int)), this, SLOT(tabChanged(int)));
QWidget *centralWidget = new QWidget;
@@ -140,11 +141,9 @@ void SheMov::tabChanged(int newTab){
mEditArchiveMenuA->setVisible(newTab == 1);
if(newTab == 0){
setWindowTitle(mFSWidget->windowTitle());
- //mSelectedItems->setText(QString::number(mFSWidget->fileView()->selectionModel()->selectedRows().count()));
}
if(newTab == 1){
setWindowTitle(mAVWidget->windowTitle());
- //mSelectedItems->setText(QString::number(mAVWidget->fileView()->selectionModel()->selectedRows().count()));
}
updateSelectionCount(QItemSelection(), QItemSelection());
}
@@ -265,6 +264,15 @@ void SheMov::createActions(){
mPropertiesA = new QAction(tr("Properties..."), this);
mAVWidget->fileView()->addAction(mPropertiesA);
connect(mPropertiesA, SIGNAL(triggered()), mAVWidget, SLOT(properties()));
+ mMoveBurnA = new QAction(tr("Move for burning..."), this);
+ mAVWidget->fileView()->addAction(mMoveBurnA);
+ connect(mMoveBurnA, SIGNAL(triggered()), mAVWidget, SLOT(moveBurn()));
+ mSetDvdA = new QAction(tr("Set DVD No. for selected..."), this);
+ mAVWidget->fileView()->addAction(mSetDvdA);
+ connect(mSetDvdA, SIGNAL(triggered()), mAVWidget, SLOT(setDvdNo()));
+ mDeleteFromArchiveA = new QAction(tr("Delete from archive..."), this);
+ mAVWidget->fileView()->addAction(mDeleteFromArchiveA);
+ connect(mDeleteFromArchiveA, SIGNAL(triggered()), mAVWidget, SLOT(deleteFromArchive()));
}
void SheMov::createMenus(){
@@ -299,7 +307,13 @@ void SheMov::createMenus(){
mEditArchiveMenu = new QMenu(tr("&Edit archive"), this);
mEditArchiveMenu->addAction(mEditArchiveFileA);
mEditArchiveMenu->addAction(mEditArchiveCoverA);
+ mEditArchiveMenu->addSeparator();
mEditArchiveMenu->addAction(mPropertiesA);
+ mEditArchiveMenu->addSeparator();
+ mEditArchiveMenu->addAction(mMoveBurnA);
+ mEditArchiveMenu->addAction(mSetDvdA);
+ mEditArchiveMenu->addSeparator();
+ mEditArchiveMenu->addAction(mDeleteFromArchiveA);
menuBar()->addMenu(fileMenu);
mEditFSMenuA = menuBar()->addMenu(mEditFSMenu);
diff --git a/shemov.h b/shemov.h
index 92a93b6..5b447d9 100644
--- a/shemov.h
+++ b/shemov.h
@@ -72,6 +72,9 @@ class SheMov : public QMainWindow {
QAction *mEditArchiveCoverA;
QAction *mAddMovieManuallyA;
QAction *mPropertiesA;
+ QAction *mMoveBurnA;
+ QAction *mSetDvdA;
+ QAction *mDeleteFromArchiveA;
QList<QAction*> mExtractToA;
//EndActions
diff --git a/textenterdialog.h b/textenterdialog.h
index f555b85..0f49199 100644
--- a/textenterdialog.h
+++ b/textenterdialog.h
@@ -21,6 +21,7 @@ class TextEnterDialog : public QDialog {
TextEnterDialog(const QString &text, QWidget *parent = 0, Qt::WindowFlags f = 0);
~TextEnterDialog() {};
const QString text() const { return mText->text(); };
+ void setText(const QString &text) { mText->setText(text); };
private:
QPushButton *mOk;