diff options
Diffstat (limited to 'archiveeditwidget.cpp')
-rw-r--r-- | archiveeditwidget.cpp | 165 |
1 files changed, 162 insertions, 3 deletions
diff --git a/archiveeditwidget.cpp b/archiveeditwidget.cpp index a404bc7..8f4d116 100644 --- a/archiveeditwidget.cpp +++ b/archiveeditwidget.cpp @@ -9,6 +9,17 @@ #include <QHBoxLayout> #include <QVBoxLayout> #include <QLabel> +#include <QApplication> +#include <QPushButton> +#include <QMessageBox> +#include <QFileInfo> +#include <QSettings> +#include <QDir> +#include <QList> +#include <QVariant> +#include <QFile> + +#include <QDebug> #include "archiveeditwidget.h" #include "archivefilewidget.h" @@ -16,12 +27,13 @@ #include "covereditor.h" #include "listmodel.h" #include "moviemodel.h" +#include "helper.h" +#include "coveritem.h" -ArchiveEditWidget::ArchiveEditWidget(QWidget *parent) : QWidget(parent){ +ArchiveEditDialog::ArchiveEditDialog(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f){ //init models mGenreModel = new ListModel("genre", this); mActorsModel = new ListModel("actor", this); - mMovieModel = new MovieModel(this); QSplitter *hSplitter = new QSplitter(Qt::Horizontal); QWidget *editorWidget = new QWidget; @@ -47,6 +59,7 @@ ArchiveEditWidget::ArchiveEditWidget(QWidget *parent) : QWidget(parent){ editorLayout->addStretch(); editorWidget->setLayout(editorLayout); + editorWidget->setMinimumWidth(300); //archive editor mFileWidget = new ArchiveFileWidget; @@ -59,10 +72,156 @@ ArchiveEditWidget::ArchiveEditWidget(QWidget *parent) : QWidget(parent){ hSplitter->addWidget(editorWidget); hSplitter->setStretchFactor(0, 2); hSplitter->setStretchFactor(1, 1); + + //button layout + QHBoxLayout *buttonLayout = new QHBoxLayout; + buttonLayout->addStretch(); + mArchive = new QPushButton(tr("Archive")); + connect(mArchive, SIGNAL(clicked()), this, SLOT(archive())); + buttonLayout->addWidget(mArchive); + mClose = new QPushButton(tr("Close")); + connect(mClose, SIGNAL(clicked()), this, SLOT(reject())); + buttonLayout->addWidget(mClose); - QHBoxLayout *mainLayout = new QHBoxLayout; + QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(hSplitter); + mainLayout->addLayout(buttonLayout); setLayout(mainLayout); + QString winTitle = QString("%1 - Archive files").arg(qApp->applicationName()); + setWindowTitle(winTitle); +} + +void ArchiveEditDialog::setFiles(const QStringList &files){ + mFileWidget->setFiles(files); + mCoverEditor->setCovers(files); +} + +void ArchiveEditDialog::archive(){ + const QHash<QString, QString> md5 = mFileWidget->md5Sums(); + const QList<int> actors = mFileWidget->actorIds(); + int genre = mFileWidget->genreId(); + QString front = mCoverEditor->frontCover(); + QString back = mCoverEditor->backCover(); + QString general = mCoverEditor->covers(); + QString file = mCoverEditor->movie(); + QString title = mFileWidget->movieTitle().toLower(); + int quality = mFileWidget->quality(); + QStringList files; + files << front << back << general; + files.removeAll(QString()); + files << file; + if(checkInput(genre, actors, files, title, file, quality) && checkMd5(md5, files)){ + QSettings s; + QString archivePath = s.value("paths/archivedir").toString(); + if(archivePath.isEmpty()){ + QMessageBox::critical(this, tr("Error"), tr("No archive path found. Please set it via Edit->Configure!")); + return; + } + QFileInfo archiveInfo(archivePath); + if(!archiveInfo.exists()){ + QDir root = QDir::root(); + root.mkpath(archivePath); + } + archiveInfo = QFileInfo(archivePath); + if(!archiveInfo.isDir()){ + QString msg = QString(tr("Archive path %1 is not a directory. Aborting!")).arg(archivePath); + QMessageBox::critical(this, tr("Error"), msg); + return; + } + QList<QVariant> data; + QFileInfo movie(file); + data << title << movie.fileName() << md5.value(file) << movie.size() << genre << quality << -1; + QList<CoverItem> covers; + if(!front.isEmpty()){ + covers << coverItem(front, "front", md5.value(front)); + } + if(!back.isEmpty()){ + covers << coverItem(back, "back", md5.value(back)); + } + if(!general.isEmpty()){ + covers << coverItem(general, "general", md5.value(general)); + } + QList<QVariant> vAList; + foreach(int a, actors){ + vAList << a; + } + mMovieModel->addMovie(data, vAList, covers); + QStringList refreshDirs; + foreach(QString f, files){ + QFileInfo file(f); + QString hash = md5.value(f); + QString destDirS = QString("%1/%2/%3").arg(archivePath).arg(hash[0]).arg(hash[1]); + QString destFileS = QString("%1/%2/%3/%4").arg(archivePath).arg(hash[0]).arg(hash[1]).arg(file.fileName()); + QFileInfo dir(destDirS); + if(!dir.exists()){ + QDir root = QDir::root(); + root.mkpath(destDirS); + } + QFileInfo destFile(destFileS); + if(destFile.exists()){ + destFileS = QString("%1/%2/%3/%4_%5.%6").arg(archivePath).arg(hash[0]).arg(hash[1]).arg(destFile.completeBaseName()).arg(hash).arg(destFile.suffix()); + } + QFile::rename(f, destFileS); + QString refreshDir = file.absoluteFilePath(); + if(!refreshDirs.contains(refreshDir)){ + refreshDirs << refreshDir; + } + } + foreach(QString r, refreshDirs){ + QModelIndex idx = mDirModel->index(r); + mDirModel->refresh(idx); + } + } +} + +bool ArchiveEditDialog::checkInput(int genre, const QList<int> &actors, const QStringList &files, const QString &title, const QString &movie, int quality) { + if(genre < 0){ + QMessageBox::critical(this, tr("Error"), tr("Genre is invalid")); + return false; + } + if(actors.isEmpty()){ + int answer = QMessageBox::question(this, tr("Question"), tr("No actors selected. Continue anyway?"), QMessageBox::Yes | QMessageBox::No); + return (answer == QMessageBox::Yes); + } + foreach(QString f, files){ + QFileInfo info(f); + if(!info.isFile()){ + QString msg = QString(tr("%1 does not seem to be a file. Aborting")).arg(info.fileName()); + QMessageBox::critical(this, tr("Error"), msg); + return false; + } + } + QString mt = Helper::mimeType(movie); + if(!mt.toLower().startsWith("video")){ + QString msg = QString(tr("Movie %1 is not of MIME type video (%2). Continue anyway?")).arg(movie).arg(mt); + int answer = QMessageBox::question(this, tr("Question"), msg, QMessageBox::Yes | QMessageBox::No); + return (answer == QMessageBox::Yes); + } + if(title.isEmpty()){ + QMessageBox::critical(this, tr("Error"), tr("No movie title given!")); + return false; + } + if(quality == 0){ + int answer = QMessageBox::question(this, tr("Question"), tr("Quality is set to 0. Continue anyway?"), QMessageBox::Yes | QMessageBox::No); + return (answer == QMessageBox::Yes); + } + return true; +} +bool ArchiveEditDialog::checkMd5(const QHash<QString, QString> &md5sums, const QStringList &files){ + foreach(QString f, files){ + if(!md5sums.contains(f)){ + QString msg = QString(tr("I don't have an MD5 hash for %1. Aborting!")).arg(f); + QMessageBox::critical(this, tr("Error"), msg); + return false; + } + } + return true; } + +const CoverItem ArchiveEditDialog::coverItem(const QString &filePath, const QString type, const QString &md5) const{ + QFileInfo info(filePath); + return CoverItem(info.fileName(), type, md5); +} + |