summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArno <am@disconnect.de>2010-07-18 14:42:26 +0200
committerArno <am@disconnect.de>2010-07-18 14:42:26 +0200
commita59ac6eb3cebdd4e3f41552c21f14165203c1ab2 (patch)
tree0ff0cec23fce7b08f02bc9acffa4adda02b906c2
parent6d00ae1d57ed37a8d3d6d35181cb6b155dd7801c (diff)
downloadSheMov-a59ac6eb3cebdd4e3f41552c21f14165203c1ab2.tar.gz
SheMov-a59ac6eb3cebdd4e3f41552c21f14165203c1ab2.tar.bz2
SheMov-a59ac6eb3cebdd4e3f41552c21f14165203c1ab2.zip
Implemented add covers
Finally we can add covers to already existsing series. Seems to work, but I encountered a crash when merging series while testing... Unfortunately I don't know the cause.
-rw-r--r--archivetreeview.cpp1
-rw-r--r--filestreemodel.cpp19
-rw-r--r--filestreemodel.h4
-rw-r--r--newmoviewizard.cpp7
-rw-r--r--seriestreewidget.cpp113
-rw-r--r--seriestreewidget.h31
-rw-r--r--shemov.cpp8
-rw-r--r--shemov.h1
8 files changed, 178 insertions, 6 deletions
diff --git a/archivetreeview.cpp b/archivetreeview.cpp
index 76af395..e13920c 100644
--- a/archivetreeview.cpp
+++ b/archivetreeview.cpp
@@ -47,6 +47,7 @@ ArchiveTreeView::ArchiveTreeView(QWidget *parent) : QWidget(parent){
for(int i = 5; i < 11; ++i){
mFilesWidget->filesTree()->setColumnHidden(i, true);
}
+ connect(mSeriesWidget, SIGNAL(filesReload()), mFilesWidget->filesTree(), SLOT(expandAll()));
// actors and genre
QWidget *genreActorWidget = new QWidget;
diff --git a/filestreemodel.cpp b/filestreemodel.cpp
index 3dc5dc1..38e86b8 100644
--- a/filestreemodel.cpp
+++ b/filestreemodel.cpp
@@ -16,6 +16,7 @@
#include "helper.h"
FilesTreeModel::FilesTreeModel(QStringList &headers, QObject *parent) : SmTreeModel(headers, parent){
+ //database setup
mDb = QSqlDatabase::database("treedb");
mUpdateDvdQuery = new QSqlQuery(mDb);
mUpdateDvdQuery->prepare("UPDATE files SET idvd = :dvd WHERE ifiles_id = :id");
@@ -27,6 +28,16 @@ FilesTreeModel::FilesTreeModel(QStringList &headers, QObject *parent) : SmTreeMo
mFilesQuery->prepare("SELECT tfilename, cmd5sum FROM files WHERE iseriespart_id = :id");
mDeleteFileQuery = new QSqlQuery(mDb);
mDeleteFileQuery->prepare("DELETE FROM files WHERE ifiles_id = :id");
+
+ //file types
+ mFileTypes.insert(1, "Movie");
+ mFileTypes.insert(2, tr("Front cover"));
+ mFileTypes.insert(3, tr("Back cover"));
+ mFileTypes.insert(4, tr("General cover"));
+
+ //cover types
+ mCoverTypes = mFileTypes;
+ mCoverTypes.remove(1);
}
FilesTreeModel::~FilesTreeModel(){
@@ -75,7 +86,7 @@ QVariant FilesTreeModel::data(const QModelIndex &index, int role) const{
SmTreeItem *item = static_cast<SmTreeItem*>(index.internalPointer());
if(role == Qt::DisplayRole){
- if(index.column())
+ //if(index.column())
if(index.column() == DvdNo){
if(index.data(FileTypeRole) == QVariant()){
return QVariant();
@@ -92,6 +103,12 @@ QVariant FilesTreeModel::data(const QModelIndex &index, int role) const{
return QVariant();
}
}
+ if(index.column() == Quality){
+ if(item->data(Quality).toInt() < 1){
+ return QVariant();
+ }
+ return item->data(Quality);
+ }
return item->data(index.column());
}
if(role == Qt::EditRole){
diff --git a/filestreemodel.h b/filestreemodel.h
index feba751..46a83c5 100644
--- a/filestreemodel.h
+++ b/filestreemodel.h
@@ -24,6 +24,8 @@ class FilesTreeModel : public SmTreeModel {
enum Fields { FileName = 0, PartNo = 1, SizeDisplay = 2, Quality = 3, DvdNo = 4, FullPath = 5, Size = 6, FileType = 7, Md5Sum = 8, SeriesPartId = 9, FilesId = 10, SeriesPart = 11, DisplayName = 12 };
enum Mode { Normal = 0, Archived = 1, Local = 2 };
explicit FilesTreeModel(QStringList &headers, QObject *parent = 0);
+ const QHash<int, QString> fileTypes() const { return mFileTypes; }
+ const QHash<int, QString> coverTypes() const { return mCoverTypes; }
~FilesTreeModel();
//data + flags
@@ -47,6 +49,8 @@ class FilesTreeModel : public SmTreeModel {
QSqlQuery *mInsertFileQuery;
QSqlQuery *mFilesQuery;
QSqlQuery *mDeleteFileQuery;
+ QHash<int, QString> mFileTypes;
+ QHash<int, QString> mCoverTypes;
};
#endif // FILESTREEMODEL_H
diff --git a/newmoviewizard.cpp b/newmoviewizard.cpp
index a38c6e9..cacd891 100644
--- a/newmoviewizard.cpp
+++ b/newmoviewizard.cpp
@@ -29,6 +29,7 @@
#include "smmodelsingleton.h"
#include "mappingtablewidget.h"
#include "mappingtablemodel.h"
+#include "filestreemodel.h"
#include "helper.h"
NewMovieWizard::NewMovieWizard(QWidget *parent) : QWizard(parent){
@@ -308,10 +309,8 @@ MovieMappingPage::MovieMappingPage(const QString &table, QWidget *parent) : QWiz
}
WizardTreeModel::WizardTreeModel(QStringList &headers, QObject *parent) : SmTreeModel(headers, parent){
- mFileTypeMap.insert(1, tr("Movie"));
- mFileTypeMap.insert(2, tr("Front cover"));
- mFileTypeMap.insert(3, tr("Back cover"));
- mFileTypeMap.insert(4, tr("General cover"));
+ FilesTreeModel *filesModel = static_cast<FilesTreeModel*>(SmModelSingleton::instance()->model("FilesModel"));
+ mFileTypeMap = filesModel->fileTypes();
}
Qt::ItemFlags WizardTreeModel::flags(const QModelIndex &index) const{
diff --git a/seriestreewidget.cpp b/seriestreewidget.cpp
index fdc9770..8abd359 100644
--- a/seriestreewidget.cpp
+++ b/seriestreewidget.cpp
@@ -17,11 +17,18 @@
#include <QAction>
#include <QMessageBox>
#include <QSettings>
+#include <QFileDialog>
+#include <QSettings>
+#include <QFileInfo>
+#include <QComboBox>
+#include <QFile>
#include "seriestreewidget.h"
#include "smtreemodel.h"
#include "smmodelsingleton.h"
#include "seriestreemodel.h"
+#include "filestreemodel.h"
+#include "helper.h"
SeriesTreeWidget::SeriesTreeWidget(QWidget *parent) : QWidget(parent){
//filter bar
@@ -52,6 +59,9 @@ SeriesTreeWidget::SeriesTreeWidget(QWidget *parent) : QWidget(parent){
connect(mView, SIGNAL(expanded(QModelIndex)), this, SLOT(itemExpanded(QModelIndex)));
connect(mView, SIGNAL(collapsed(QModelIndex)), this, SLOT(itemCollaped(QModelIndex)));
+ //cover dialog
+ mCoverDialog = new AddCoverDialog(this);
+
//layout
QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addLayout(filterLayout);
@@ -193,6 +203,39 @@ void SeriesTreeWidget::itemCollaped(const QModelIndex &what){
}
}
+void SeriesTreeWidget::addCover(){
+ QModelIndexList selected = mView->selectionModel()->selectedRows();
+ if(selected.isEmpty()){
+ return;
+ }
+ if(selected.count() > 1){
+ QMessageBox::critical(this, tr("Error"), tr("Please don't select more than one item when adding covers."));
+ return;
+ }
+ QModelIndex real = mProxy->mapToSource(selected.at(0));
+ if(real.data(SeriesTreeModel::TypeRole).toInt() != SeriesTreeModel::Part){
+ QMessageBox::critical(this, tr("Error"), tr("Please select a series part when adding covers."));
+ return;
+ }
+ int retval = mCoverDialog->exec();
+ if(retval == QDialog::Accepted){
+ QString fileName = mCoverDialog->file();
+ QFileInfo fi(fileName);
+ if(fi.exists()){
+ FilesTreeModel *filesModel = static_cast<FilesTreeModel*>(SmModelSingleton::instance()->model("FilesModel"));
+ int seriesPartId = real.data(SeriesTreeModel::SeriesPartIdRole).toInt();
+ int type = mCoverDialog->fileType();
+ if(filesModel->addFile(fileName, type, 0, -1, seriesPartId, -1)){
+ QString md5sum = Helper::md5Sum(fileName);
+ QString targetFile = Helper::createArchivePath(fileName, md5sum);
+ QFile::rename(fileName, targetFile);
+ filesModel->setIds(QList<int>() << seriesPartId);
+ emit filesReload();
+ }
+ }
+ }
+}
+
SeriesTreeView::SeriesTreeView(QWidget *parent) : QTreeView(parent) {}
void SeriesTreeView::contextMenuEvent(QContextMenuEvent *e){
@@ -211,3 +254,73 @@ bool SeriesTreeSortModel::lessThan(const QModelIndex &left, const QModelIndex &r
}
return QSortFilterProxyModel::lessThan(left, right);
}
+
+AddCoverDialog::AddCoverDialog(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f){
+ //File selection
+ QLabel *l1 = new QLabel(tr("Select file"));
+ mFile = new QLineEdit;
+ QPushButton *mSelectFile = new QPushButton(tr("Browse..."));
+ connect(mSelectFile, SIGNAL(clicked()), this, SLOT(selectFile()));
+ QHBoxLayout *fileLayout = new QHBoxLayout;
+ fileLayout->addWidget(l1);
+ fileLayout->addWidget(mFile);
+ fileLayout->addWidget(mSelectFile);
+
+ //file type
+ mFilesModel = static_cast<FilesTreeModel*>(SmModelSingleton::instance()->model("FilesModel"));
+ QHash<int, QString> coverTypes = mFilesModel->coverTypes();
+ mFileType = new QComboBox;
+ QStringList types;
+ foreach(QString t, coverTypes.values()){
+ types << t;
+ }
+ mFileType->addItems(types);
+ QHBoxLayout *typesLayout = new QHBoxLayout;
+ typesLayout->setAlignment(Qt::AlignCenter);
+ typesLayout->addWidget(mFileType);
+ connect(mFileType, SIGNAL(currentIndexChanged(QString)), this, SLOT(typeChanged(QString)));
+
+ //buttons
+ mOk = new QPushButton(tr("Ok"));
+ connect(mOk, SIGNAL(clicked()), this, SLOT(accept()));
+ mCancel = new QPushButton(tr("Cancel"));
+ connect(mCancel, SIGNAL(clicked()), this, SLOT(reject()));
+ QHBoxLayout *buttonLayout = new QHBoxLayout;
+ buttonLayout->addStretch();
+ buttonLayout->addWidget(mOk);
+ buttonLayout->addWidget(mCancel);
+
+ //main layout
+ QVBoxLayout *mainLayout = new QVBoxLayout;
+ mainLayout->addLayout(fileLayout);
+ mainLayout->addLayout(typesLayout);
+ mainLayout->addLayout(buttonLayout);
+ setLayout(mainLayout);
+}
+
+const QString AddCoverDialog::file() const {
+ return mFile->text();
+}
+
+void AddCoverDialog::selectFile(){
+ QString startDir = mLastOpenedDir;
+ if(startDir.isEmpty()){
+ QSettings s;
+ startDir = s.value("paths/selecteddir").toString();
+ }
+ QString file = QFileDialog::getOpenFileName(this, tr("Select cover"), startDir);
+ mFile->setText(file);
+ QFileInfo fi(file);
+ mLastOpenedDir = fi.absolutePath();
+}
+
+void AddCoverDialog::typeChanged(const QString &type){
+ QHash<int, QString>::const_iterator it = mFilesModel->coverTypes().constBegin();
+ while(it != mFilesModel->coverTypes().constEnd()){
+ if(it.value() == type){
+ mCurrentType = it.key();
+ return;
+ }
+ ++it;
+ }
+}
diff --git a/seriestreewidget.h b/seriestreewidget.h
index 0db8873..815b5f5 100644
--- a/seriestreewidget.h
+++ b/seriestreewidget.h
@@ -11,13 +11,17 @@
#include <QWidget>
#include <QTreeView>
#include <QSortFilterProxyModel>
+#include <QDialog>
class QLineEdit;
class QPushButton;
class QSortFilterProxyModel;
+class QComboBox;
class SeriesTreeModel;
class SeriesTreeView;
class SeriesTreeSortModel;
+class FilesTreeModel;
+class AddCoverDialog;
class SeriesTreeWidget : public QWidget {
Q_OBJECT
@@ -33,6 +37,7 @@ class SeriesTreeWidget : public QWidget {
void readSettings();
void writeSettings();
void expandCurrent();
+ void addCover();
private slots:
void filter();
@@ -40,12 +45,16 @@ class SeriesTreeWidget : public QWidget {
void itemExpanded(const QModelIndex &);
void itemCollaped(const QModelIndex &);
+ signals:
+ void filesReload();
+
private:
QLineEdit *mFilterEdit;
QPushButton *mFilter;
SeriesTreeView *mView;
SeriesTreeSortModel *mProxy;
SeriesTreeModel *mModel;
+ AddCoverDialog *mCoverDialog;
QStringList mExpandedItems;
};
@@ -68,4 +77,26 @@ class SeriesTreeSortModel : public QSortFilterProxyModel {
virtual bool lessThan(const QModelIndex &left, const QModelIndex &right) const;
};
+class AddCoverDialog : public QDialog {
+ Q_OBJECT
+ public:
+ explicit AddCoverDialog(QWidget *parent = 0, Qt::WindowFlags f = 0);
+ const QString file() const;
+ int fileType() const { return mCurrentType; }
+
+ private slots:
+ void selectFile();
+ void typeChanged(const QString &type);
+
+ private:
+ QLineEdit *mFile;
+ QComboBox *mFileType;
+ QPushButton *mSelectFile;
+ QPushButton *mOk;
+ QPushButton *mCancel;
+ QString mLastOpenedDir;
+ int mCurrentType;
+ FilesTreeModel *mFilesModel;
+};
+
#endif
diff --git a/shemov.cpp b/shemov.cpp
index 4d6302d..71a6c96 100644
--- a/shemov.cpp
+++ b/shemov.cpp
@@ -379,7 +379,7 @@ void SheMov::createActions(){
mStatisticsA = new QAction(tr("Some statistics..."), this);
connect(mStatisticsA, SIGNAL(triggered()), this, SLOT(showStatistics()));
- //Tree context menu
+ //Tree series context menu
mNewSeriesA = new QAction(tr("New series..."), this);
connect(mNewSeriesA, SIGNAL(triggered()), mATree->seriesWidget(), SLOT(newSeries()));
mDeleteFromSeriesA = new QAction(tr("Delete entries..."), this);
@@ -394,6 +394,8 @@ void SheMov::createActions(){
connect(mExpandCurrentA, SIGNAL(triggered()), mATree->seriesWidget(), SLOT(expandCurrent()));
mNewMovieWizardA = new QAction(tr("Archive movie..."), this);
connect(mNewMovieWizardA, SIGNAL(triggered()), this, SLOT(newMovieWizard()));
+ mAddCoverA = new QAction(tr("Add cover..."), this);
+ connect(mAddCoverA, SIGNAL(triggered()), mATree->seriesWidget(), SLOT(addCover()));
//Tree view menu
mViewTreeGroup = new QActionGroup(this);
@@ -565,6 +567,10 @@ void SheMov::createMenus(){
mATree->seriesWidget()->seriesTree()->addAction(mExpandCurrentA);
mATree->seriesWidget()->seriesTree()->addAction(mExpandAllSeriesA);
mATree->seriesWidget()->seriesTree()->addAction(mCollapseAllSeriesA);
+ QAction *sep12 = new QAction(this);
+ sep12->setSeparator(true);
+ mATree->seriesWidget()->seriesTree()->addAction(sep12);
+ mATree->seriesWidget()->seriesTree()->addAction(mAddCoverA);
//ArchiveTreeView fileWidget context menu
mATree->filesWidget()->filesTree()->addAction(mMoveToBurnA);
diff --git a/shemov.h b/shemov.h
index 7bf4913..602eddd 100644
--- a/shemov.h
+++ b/shemov.h
@@ -107,6 +107,7 @@ class SheMov : public QMainWindow {
QAction *mCollapseAllSeriesA;
QAction *mExpandCurrentA;
QAction *mNewMovieWizardA;
+ QAction *mAddCoverA;
//TreeView View Actions
QAction *mShowLocalA;