diff options
-rw-r--r-- | archiveviewwidget.cpp | 120 | ||||
-rw-r--r-- | archiveviewwidget.h | 4 | ||||
-rw-r--r-- | filesystemwidget.cpp | 5 | ||||
-rw-r--r-- | filesystemwidget.h | 1 | ||||
-rw-r--r-- | moviemodel.cpp | 46 | ||||
-rw-r--r-- | moviemodel.h | 3 | ||||
-rw-r--r-- | shemov.cpp | 18 | ||||
-rw-r--r-- | shemov.h | 3 | ||||
-rw-r--r-- | textenterdialog.h | 1 |
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 ¤t, 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(); @@ -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); @@ -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; |