From d2b854121266e32164290ee4e683c0c8388d7d41 Mon Sep 17 00:00:00 2001 From: am Date: Sun, 19 Jul 2009 16:12:02 +0000 Subject: -added ActorRole in MovieModel -Fixed bug in MovieItem returning data and filling the model -Started on archive viewing git-svn-id: file:///var/svn/repos2/shemov/trunk@391 f440f766-f032-0410-8965-dc7d17de2ca0 --- archiveeditdialog.cpp | 223 +++++++++++++++++++++++++++++++++++++++++++++++++ archiveeditdialog.h | 53 ++++++++++++ archiveeditwidget.cpp | 227 -------------------------------------------------- archiveeditwidget.h | 54 ------------ archivefileview.cpp | 37 ++++++++ archivefileview.h | 29 +++++++ archiveproxy.cpp | 69 +++++++++++++++ archiveproxy.h | 37 ++++++++ archiveviewwidget.cpp | 96 +++++++++++++++++++++ archiveviewwidget.h | 55 ++++++++++++ movieitem.cpp | 4 +- moviemodel.cpp | 13 ++- moviemodel.h | 2 +- shemov.cpp | 11 ++- shemov.h | 5 ++ shemov.pro | 14 +++- 16 files changed, 637 insertions(+), 292 deletions(-) create mode 100644 archiveeditdialog.cpp create mode 100644 archiveeditdialog.h delete mode 100644 archiveeditwidget.cpp delete mode 100644 archiveeditwidget.h create mode 100644 archivefileview.cpp create mode 100644 archivefileview.h create mode 100644 archiveproxy.cpp create mode 100644 archiveproxy.h create mode 100644 archiveviewwidget.cpp create mode 100644 archiveviewwidget.h diff --git a/archiveeditdialog.cpp b/archiveeditdialog.cpp new file mode 100644 index 0000000..350597f --- /dev/null +++ b/archiveeditdialog.cpp @@ -0,0 +1,223 @@ +/* + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "archiveeditdialog.h" +#include "archivefilewidget.h" +#include "listeditor.h" +#include "covereditor.h" +#include "listmodel.h" +#include "moviemodel.h" +#include "helper.h" +#include "coveritem.h" + +ArchiveEditDialog::ArchiveEditDialog(ListModel *genre, ListModel *actors, QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f), mGenreModel(genre), mActorsModel(actors){ + QSplitter *hSplitter = new QSplitter(Qt::Horizontal); + QWidget *editorWidget = new QWidget; + QVBoxLayout *editorLayout = new QVBoxLayout; + + //genre editor + QLabel *l1 = new QLabel(tr("Edit genres")); + mGenreEditor = new ListEditor(mGenreModel); + editorLayout->addWidget(l1); + editorLayout->addWidget(mGenreEditor); + + //actor editor + QLabel *l2 = new QLabel(tr("Edit actors")); + mActorsEditor = new ListEditor(mActorsModel); + editorLayout->addWidget(l2); + editorLayout->addWidget(mActorsEditor); + + //cover editor + QLabel *l3 = new QLabel(tr("Configure cover pictures")); + mCoverEditor = new CoverEditor; + editorLayout->addWidget(l3); + editorLayout->addWidget(mCoverEditor); + + editorLayout->addStretch(); + editorWidget->setLayout(editorLayout); + editorWidget->setMinimumWidth(300); + + //archive editor + mFileWidget = new ArchiveFileWidget; + mFileWidget->setMovieModel(mMovieModel); + mFileWidget->setGenreModel(mGenreModel); + mFileWidget->setActorsModel(mActorsModel); + + //join splitters + hSplitter->addWidget(mFileWidget); + 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); + + 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 md5 = mFileWidget->md5Sums(); + const QList 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 data; + QFileInfo movie(file); + data << title << movie.fileName() << md5.value(file) << movie.size() << genre << quality << -1; + QList 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 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 &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 &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); +} + diff --git a/archiveeditdialog.h b/archiveeditdialog.h new file mode 100644 index 0000000..23f8614 --- /dev/null +++ b/archiveeditdialog.h @@ -0,0 +1,53 @@ +/* + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ + +#ifndef ARCHIVEEDITWIDGET_H +#define ARCHIVEEDITWIDGET_H + +#include +#include + +class ArchiveFileWidget; +class ListEditor; +class CoverEditor; +class ListModel; +class MovieModel; +class QPushButton; +class CoverItem; +class ListModel; + +class ArchiveEditDialog : public QDialog { + Q_OBJECT + public: + ArchiveEditDialog(ListModel *genre, ListModel *actors, QWidget *parent = 0, Qt::WindowFlags f = 0); + ~ArchiveEditDialog() {}; + void setFiles(const QStringList &files); + void setMovieModel(MovieModel *model) { mMovieModel = model; }; + void setDirModel(QDirModel *model) { mDirModel = model; }; + + private slots: + void archive(); + + private: + bool checkInput(int genre, const QList &actors, const QStringList &files, const QString &title, const QString &movie, int quality); + bool checkMd5(const QHash &md5sums, const QStringList &files); + const CoverItem coverItem(const QString &filePath, const QString type, const QString &md5) const; + ArchiveFileWidget *mFileWidget; + ListEditor *mGenreEditor; + ListEditor *mActorsEditor; + CoverEditor *mCoverEditor; + ListModel *mGenreModel; + ListModel *mActorsModel; + MovieModel *mMovieModel; + QDirModel *mDirModel; + QPushButton *mArchive; + QPushButton *mClose; + +}; + +#endif + diff --git a/archiveeditwidget.cpp b/archiveeditwidget.cpp deleted file mode 100644 index 8f4d116..0000000 --- a/archiveeditwidget.cpp +++ /dev/null @@ -1,227 +0,0 @@ -/* - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version - 2 of the License, or (at your option) any later version. -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "archiveeditwidget.h" -#include "archivefilewidget.h" -#include "listeditor.h" -#include "covereditor.h" -#include "listmodel.h" -#include "moviemodel.h" -#include "helper.h" -#include "coveritem.h" - -ArchiveEditDialog::ArchiveEditDialog(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f){ - //init models - mGenreModel = new ListModel("genre", this); - mActorsModel = new ListModel("actor", this); - - QSplitter *hSplitter = new QSplitter(Qt::Horizontal); - QWidget *editorWidget = new QWidget; - QVBoxLayout *editorLayout = new QVBoxLayout; - - //genre editor - QLabel *l1 = new QLabel(tr("Edit genres")); - mGenreEditor = new ListEditor(mGenreModel); - editorLayout->addWidget(l1); - editorLayout->addWidget(mGenreEditor); - - //actor editor - QLabel *l2 = new QLabel(tr("Edit actors")); - mActorsEditor = new ListEditor(mActorsModel); - editorLayout->addWidget(l2); - editorLayout->addWidget(mActorsEditor); - - //cover editor - QLabel *l3 = new QLabel(tr("Configure cover pictures")); - mCoverEditor = new CoverEditor; - editorLayout->addWidget(l3); - editorLayout->addWidget(mCoverEditor); - - editorLayout->addStretch(); - editorWidget->setLayout(editorLayout); - editorWidget->setMinimumWidth(300); - - //archive editor - mFileWidget = new ArchiveFileWidget; - mFileWidget->setMovieModel(mMovieModel); - mFileWidget->setGenreModel(mGenreModel); - mFileWidget->setActorsModel(mActorsModel); - - //join splitters - hSplitter->addWidget(mFileWidget); - 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); - - 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 md5 = mFileWidget->md5Sums(); - const QList 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 data; - QFileInfo movie(file); - data << title << movie.fileName() << md5.value(file) << movie.size() << genre << quality << -1; - QList 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 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 &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 &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); -} - diff --git a/archiveeditwidget.h b/archiveeditwidget.h deleted file mode 100644 index 731214a..0000000 --- a/archiveeditwidget.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - as published by the Free Software Foundation; either version - 2 of the License, or (at your option) any later version. -*/ - -#ifndef ARCHIVEEDITWIDGET_H -#define ARCHIVEEDITWIDGET_H - -#include -#include - -class ArchiveFileWidget; -class ListEditor; -class CoverEditor; -class ListModel; -class MovieModel; -class QPushButton; -class CoverItem; - -class ArchiveEditDialog : public QDialog { - Q_OBJECT - public: - ArchiveEditDialog(QWidget *parent = 0, Qt::WindowFlags f = 0); - ~ArchiveEditDialog() {}; - - public: - void setFiles(const QStringList &files); - void setMovieModel(MovieModel *model) { mMovieModel = model; }; - void setDirModel(QDirModel *model) { mDirModel = model; }; - - private slots: - void archive(); - - private: - bool checkInput(int genre, const QList &actors, const QStringList &files, const QString &title, const QString &movie, int quality); - bool checkMd5(const QHash &md5sums, const QStringList &files); - const CoverItem coverItem(const QString &filePath, const QString type, const QString &md5) const; - ArchiveFileWidget *mFileWidget; - ListEditor *mGenreEditor; - ListEditor *mActorsEditor; - CoverEditor *mCoverEditor; - ListModel *mGenreModel; - ListModel *mActorsModel; - MovieModel *mMovieModel; - QDirModel *mDirModel; - QPushButton *mArchive; - QPushButton *mClose; - -}; - -#endif - diff --git a/archivefileview.cpp b/archivefileview.cpp new file mode 100644 index 0000000..333f292 --- /dev/null +++ b/archivefileview.cpp @@ -0,0 +1,37 @@ +/* + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ + +#include +#include +#include +#include + +#include "archivefileview.h" + +ArchiveFileView::ArchiveFileView(QWidget *parent) : QTreeView(parent) {}; + +void ArchiveFileView::contextMenuEvent(QContextMenuEvent *e){ + QMenu contextMenu(this); + int ctr(0); + foreach(QAction *a, actions()){ + contextMenu.addAction(a); + if(false){ + contextMenu.addSeparator(); + } + ++ctr; + } + contextMenu.exec(e->globalPos()); +} + +void ArchiveFileView::resizeEvent(QResizeEvent *e){ + if(e->size().width() != e->oldSize().width()){ + int width = e->size().width(); + int newWidth = (width / 3 * 2) / 2; + setColumnWidth(0, newWidth); + setColumnWidth(1, newWidth); + } +} diff --git a/archivefileview.h b/archivefileview.h new file mode 100644 index 0000000..180f706 --- /dev/null +++ b/archivefileview.h @@ -0,0 +1,29 @@ +/* + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ + +#ifndef ARCHIVEFILEVIEW_H +#define ARCHIVEFILEVIEW_H + +#include + +class QContextMenuEvent; +class QResizeEvent; + +class ArchiveFileView : public QTreeView { + Q_OBJECT + public: + ArchiveFileView(QWidget *parent = 0); + ~ArchiveFileView() {}; + + protected: + virtual void contextMenuEvent(QContextMenuEvent *e); + virtual void resizeEvent(QResizeEvent *e); + +}; + +#endif + diff --git a/archiveproxy.cpp b/archiveproxy.cpp new file mode 100644 index 0000000..6b1a9e7 --- /dev/null +++ b/archiveproxy.cpp @@ -0,0 +1,69 @@ +/* + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ + +#include +#include + +#include "archiveproxy.h" +#include "moviemodel.h" + +ArchiveProxy::ArchiveProxy(QObject *parent) : QSortFilterProxyModel(parent){}; + +void ArchiveProxy::setFilter(const QString &filter, FilterMode mode){ + mFilterMode = mode; + switch(mFilterMode){ + case NoFilter: + mGenreFilter = QString(); + mActorFilter = QString(); + mTitleFilter = QString(); + break; + case GenreFilter: + mGenreFilter = filter; + break; + case ActorFilter: + mActorFilter = filter; + break; + case TitleFilter: + mTitleFilter = filter.toLower(); + break; + } + invalidate(); +} + +bool ArchiveProxy::filterAcceptsRow(int sourceRow, const QModelIndex & /*sourceParent*/) const{ + if(mFilterMode == NoFilter){ + return true; + } + MovieModel *model = static_cast(sourceModel()); + Q_ASSERT(model != 0); + if(mFilterMode == ActorFilter){ + QModelIndex idx = model->index(sourceRow, 0, QModelIndex()); + QStringList actors = model->data(idx, MovieModel::ActorsRole).toStringList(); + return actors.contains(mActorFilter); + } + if(mFilterMode == GenreFilter){ + QModelIndex idx = model->index(sourceRow, 4, QModelIndex()); + QString genre = idx.data().toString(); + return (genre == mGenreFilter); + } + if(mFilterMode == TitleFilter){ + QModelIndex idx = model->index(sourceRow, 0, QModelIndex()); + QString title = idx.data().toString(); + QRegExp re(mTitleFilter); + return( re.indexIn(title) != -1); + } + return true; +} + +void ArchiveProxy::clearFilter(){ + mFilterMode = NoFilter; + mGenreFilter = QString(); + mActorFilter = QString(); + mTitleFilter = QString(); + invalidate(); +} + diff --git a/archiveproxy.h b/archiveproxy.h new file mode 100644 index 0000000..94e8d19 --- /dev/null +++ b/archiveproxy.h @@ -0,0 +1,37 @@ +/* + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ + +#ifndef ARCHIVEPROXY_H +#define ARCHIVEPROXY_H + +#include + +class QString; +class QModelIndex; + +class ArchiveProxy : public QSortFilterProxyModel { + Q_OBJECT + Q_ENUMS(FilterMode) + public: + enum FilterMode { NoFilter, GenreFilter, ActorFilter, TitleFilter }; + ArchiveProxy(QObject *parent = 0); + ~ArchiveProxy() {}; + void setFilter(const QString &filter, FilterMode mode); + virtual bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; + + public slots: + void clearFilter(); + + private: + FilterMode mFilterMode; + QString mGenreFilter; + QString mActorFilter; + QString mTitleFilter; +}; + +#endif + diff --git a/archiveviewwidget.cpp b/archiveviewwidget.cpp new file mode 100644 index 0000000..9a0e76e --- /dev/null +++ b/archiveviewwidget.cpp @@ -0,0 +1,96 @@ +/* + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "archiveviewwidget.h" +#include "archivefileview.h" +#include "moviemodel.h" +#include "listmodel.h" +#include "archiveproxy.h" + +ArchiveViewWidget::ArchiveViewWidget(MovieModel *model, ListModel *genre, ListModel *actors, QWidget *parent) : QWidget(parent), mMovieModel(model), mGenreModel(genre), mActorsModel(actors){ + //filter bar + QHBoxLayout *filterLayout = new QHBoxLayout; + QLabel *l1 = new QLabel(tr("Filter by &genre")); + mGenre = new QComboBox; + l1->setBuddy(mGenre); + mGenre->setModel(mGenreModel); + connect(mGenre, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(setGenreFilter(const QString &))); + filterLayout->addWidget(l1); + filterLayout->addWidget(mGenre); + QLabel *l2 = new QLabel(tr("Filter by &actor")); + mActors = new QComboBox; + mActors->setModel(mActorsModel); + connect(mActors, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(setActorFilter(const QString &))); + l2->setBuddy(mActors); + filterLayout->addWidget(l2); + filterLayout->addWidget(mActors); + QLabel *l3 = new QLabel(tr("Filter by &title")); + mName = new QLineEdit; + l3->setBuddy(mName); + filterLayout->addWidget(l3); + filterLayout->addWidget(mName); + mFilter = new QPushButton(tr("Filter")); + connect(mFilter, SIGNAL(clicked()), this, SLOT(setFilter())); + filterLayout->addWidget(mFilter); + mClearFilter = new QPushButton(tr("Clear filter")); + filterLayout->addWidget(mClearFilter); + + //treeview + mFileView = new ArchiveFileView; + mProxy = new ArchiveProxy(this); + mProxy->setSourceModel(mMovieModel); + mFileView->setModel(mProxy); + mFileView->setSortingEnabled(true); + mFileView->setItemsExpandable(false); + mFileView->setRootIsDecorated(false); + connect(mClearFilter, SIGNAL(clicked()), mProxy, SLOT(clearFilter())); + + //main layout + QVBoxLayout *mainLayout = new QVBoxLayout; + mainLayout->addLayout(filterLayout); + mainLayout->addWidget(mFileView); + + connect(mFileView->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex &, const QModelIndex)), this, SLOT(rowChanged(const QModelIndex &, const QModelIndex &))); + + setLayout(mainLayout); +} + +void ArchiveViewWidget::setFilter(){ + QString filter = mName->text().toLower(); + if(filter.isEmpty()){ + return; + } + mProxy->setFilter(filter, ArchiveProxy::TitleFilter); +} + +void ArchiveViewWidget::setGenreFilter(const QString &filter){ + mProxy->setFilter(filter, ArchiveProxy::GenreFilter); +} + +void ArchiveViewWidget::setActorFilter(const QString &filter){ + mProxy->setFilter(filter, ArchiveProxy::ActorFilter); +} + +void ArchiveViewWidget::rowChanged(const QModelIndex ¤t, const QModelIndex & /*prev*/){ + if(current.isValid()){ + QModelIndex idx = current; + if(current.column() != 0){ + idx = mProxy->index(current.row(), 0, current.parent()); + } + QString title = QString(tr("%1 - %2")).arg(qApp->applicationName()).arg(idx.data().toString()); + emit windowTitle(title); + } +} diff --git a/archiveviewwidget.h b/archiveviewwidget.h new file mode 100644 index 0000000..ea90a6f --- /dev/null +++ b/archiveviewwidget.h @@ -0,0 +1,55 @@ +/* + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ + +#ifndef ARCHIVEVIEWWIDGET_H +#define ARCHIVEVIEWWIDGET_H + +#include + +class MovieModel; +class ListModel; +class QComboBox; +class QLineEdit; +class QPushButton; +class QModelIndex; +class ArchiveFileView; +class ArchiveProxy; + +class ArchiveViewWidget : public QWidget { + Q_OBJECT + public: + ArchiveViewWidget(MovieModel *model, ListModel *genre, ListModel *actors, QWidget *parent = 0); + ~ArchiveViewWidget() {}; + ArchiveFileView* fileView() { return mFileView; }; + + signals: + void statusbarMessage(const QString &message); + void windowTitle(const QString &title); + + public slots: + void setFilter(); + void setGenreFilter(const QString &filter); + void setActorFilter(const QString &filter); + + private slots: + void rowChanged(const QModelIndex ¤t, const QModelIndex &prev); + + private: + QComboBox *mGenre; + QComboBox *mActors; + QLineEdit *mName; + QPushButton *mFilter; + QPushButton *mClearFilter; + MovieModel *mMovieModel; + ListModel *mGenreModel; + ListModel *mActorsModel; + ArchiveFileView *mFileView; + ArchiveProxy *mProxy; +}; + +#endif + diff --git a/movieitem.cpp b/movieitem.cpp index 9fb11e1..de2382c 100644 --- a/movieitem.cpp +++ b/movieitem.cpp @@ -57,8 +57,8 @@ void MovieItem::populate(){ movieData.prepare("SELECT ttitle, tfilename, cmd5sum, bisize, igenreid, iquality, idvd FROM movies WHERE imovid = :id"); movieData.bindValue(":id", mId); movieData.exec(); - for(int i = 0; i < mNumRows; ++i){ - if(movieData.next()){ + if(movieData.next()){ + for(int i = 0; i < mNumRows; ++i){ mRows[i] = movieData.value(i); } } diff --git a/moviemodel.cpp b/moviemodel.cpp index 3d93d41..389f456 100644 --- a/moviemodel.cpp +++ b/moviemodel.cpp @@ -6,6 +6,8 @@ */ #include +#include +#include #include "moviemodel.h" #include "coveritem.h" @@ -71,15 +73,22 @@ QVariant MovieModel::data(const QModelIndex &index, int role) const{ if(!index.isValid()){ return QVariant(); } + MovieItem *item = static_cast(index.internalPointer()); + Q_ASSERT(item != 0); if(role == Qt::DisplayRole){ - MovieItem *item = static_cast(index.internalPointer()); - Q_ASSERT(item != 0); switch (index.column()){ case MovieItem::Dvd: return QVariant(QString(tr("DVD %1")).arg(QString::number(item->dataAt(MovieItem::Dvd).toInt()))); + break; } return item->dataAt(index.column()); } + if(role == ActorsRole){ + return item->actors(); + } + if((role == Qt::DecorationRole) && (index.column() == 0)){ + return QIcon(":/dildo.png"); + } return QVariant(); } diff --git a/moviemodel.h b/moviemodel.h index 2f3587a..cf2e1f2 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}; + enum CustomRoles { Md5Role = Qt::UserRole + 1, ActorsRole = Qt::UserRole +2 }; MovieModel(QObject *parent = 0); ~MovieModel(); QModelIndex index(int row, int column, const QModelIndex &parent) const; diff --git a/shemov.cpp b/shemov.cpp index 28e4924..4b54d78 100644 --- a/shemov.cpp +++ b/shemov.cpp @@ -25,8 +25,10 @@ #include "filesystemwidget.h" #include "fileview.h" #include "configurationdialog.h" -#include "archiveeditwidget.h" +#include "archiveeditdialog.h" #include "moviemodel.h" +#include "listmodel.h" +#include "archiveviewwidget.h" SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, flags) { qApp->setWindowIcon(QIcon(":/shemov.png")); @@ -46,14 +48,19 @@ SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, fla } mMovieModel = new MovieModel(this); + mGenreModel = new ListModel("genre", this); + mActorModel = new ListModel("actor", this); mFSWidget = new FilesystemWidget; setWindowTitle(mFSWidget->windowTitle()); mTab = new QTabWidget; mTab->addTab(mFSWidget, tr("Filemanager")); + mAVWidget = new ArchiveViewWidget(mMovieModel, mGenreModel, mActorModel); + mTab->addTab(mAVWidget, tr("Archive")); + connect(mAVWidget, SIGNAL(windowTitle(const QString &)), this, SLOT(newWindowTitle(const QString &))); - mAEdit = new ArchiveEditDialog(this); + mAEdit = new ArchiveEditDialog(mGenreModel, mActorModel, this); mAEdit->setMovieModel(mMovieModel); mFSWidget->setArchiveDialog(mAEdit); diff --git a/shemov.h b/shemov.h index b59f865..0e985ec 100644 --- a/shemov.h +++ b/shemov.h @@ -21,6 +21,8 @@ class QSignalMapper; class QMenu; class ArchiveEditDialog; class MovieModel; +class ListModel; +class ArchiveViewWidget; class SheMov : public QMainWindow { Q_OBJECT @@ -72,8 +74,11 @@ class SheMov : public QMainWindow { QTabWidget *mTab; FilesystemWidget *mFSWidget; + ArchiveViewWidget *mAVWidget; ArchiveEditDialog *mAEdit; MovieModel *mMovieModel; + ListModel *mGenreModel; + ListModel *mActorModel; }; #endif diff --git a/shemov.pro b/shemov.pro index 8b4c196..781d22f 100644 --- a/shemov.pro +++ b/shemov.pro @@ -17,10 +17,13 @@ shemoviconprovider.cpp \ messagedialog.cpp \ configurationdialog.cpp \ extractordialog.cpp \ -archiveeditwidget.cpp \ +archiveeditdialog.cpp \ listeditor.cpp \ covereditor.cpp \ -archivefilewidget.cpp +archivefilewidget.cpp \ +archiveviewwidget.cpp \ +archivefileview.cpp \ +archiveproxy.cpp HEADERS = listitem.h \ listmodel.h \ movieitem.h \ @@ -36,10 +39,13 @@ shemoviconprovider.h \ messagedialog.h \ configurationdialog.h \ extractordialog.h \ -archiveeditwidget.h \ +archiveeditdialog.h \ listeditor.h \ covereditor.h \ -archivefilewidget.h +archivefilewidget.h \ +archiveviewwidget.h \ +archivefileview.h \ +archiveproxy.h LIBS += -lmagic LIBS += -lcryptopp INCLUDEPATH += /usr/include/cryptopp -- cgit v1.2.3-70-g09d2