diff options
-rw-r--r-- | archivetreeview.cpp | 1 | ||||
-rw-r--r-- | filestreemodel.cpp | 19 | ||||
-rw-r--r-- | filestreemodel.h | 4 | ||||
-rw-r--r-- | newmoviewizard.cpp | 7 | ||||
-rw-r--r-- | seriestreewidget.cpp | 113 | ||||
-rw-r--r-- | seriestreewidget.h | 31 | ||||
-rw-r--r-- | shemov.cpp | 8 | ||||
-rw-r--r-- | shemov.h | 1 |
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 @@ -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); @@ -107,6 +107,7 @@ class SheMov : public QMainWindow { QAction *mCollapseAllSeriesA; QAction *mExpandCurrentA; QAction *mNewMovieWizardA; + QAction *mAddCoverA; //TreeView View Actions QAction *mShowLocalA; |