diff options
author | Arno <am@disconnect.de> | 2013-07-08 22:09:36 +0200 |
---|---|---|
committer | Arno <am@disconnect.de> | 2013-07-08 22:09:36 +0200 |
commit | 9dc2528dfdb04f18641602cfd24c09cb9b119107 (patch) | |
tree | 3849b34fea7be7db681af81ab732c4cbe72371ac | |
parent | 1013140a8b66968de1cfa0d07a353b47b8234899 (diff) | |
download | SheMov-9dc2528dfdb04f18641602cfd24c09cb9b119107.tar.gz SheMov-9dc2528dfdb04f18641602cfd24c09cb9b119107.tar.bz2 SheMov-9dc2528dfdb04f18641602cfd24c09cb9b119107.zip |
Make new archive work
Well, this is a huge commit. Should be severals, but who knew...
First and foremost feature: Make NewMovieWizard work with the
experimental model. This change obsoleted a lot of code. Also, the old
archive won't work with with the new Wizward...
There are most probably many other features I forgot about.
-rw-r--r-- | archivecontroller.cpp | 7 | ||||
-rw-r--r-- | archivecontroller.h | 7 | ||||
-rw-r--r-- | archiveview.cpp | 66 | ||||
-rw-r--r-- | archiveview.h | 26 | ||||
-rw-r--r-- | helper.cpp | 6 | ||||
-rw-r--r-- | helper.h | 1 | ||||
-rw-r--r-- | newmoviewizard.cpp | 694 | ||||
-rw-r--r-- | newmoviewizard.h | 43 | ||||
-rw-r--r-- | shemov.cpp | 4 | ||||
-rw-r--r-- | smglobals.cpp | 7 | ||||
-rw-r--r-- | smglobals.h | 2 | ||||
-rw-r--r-- | smtreemodel.cpp | 9 | ||||
-rw-r--r-- | smtreemodel.h | 1 |
13 files changed, 408 insertions, 465 deletions
diff --git a/archivecontroller.cpp b/archivecontroller.cpp index 855e1bb..82d0bd8 100644 --- a/archivecontroller.cpp +++ b/archivecontroller.cpp @@ -24,7 +24,11 @@ ArchiveController::ArchiveController(QObject *parent) : QObject(parent) { } } -void ArchiveController::setArchiveView(ArchiveTree *atree, ArchiveProxy *aproxy){ +void ArchiveController::setArchiveView(ArchiveView *view){ + mArchiveView = view; +} + +void ArchiveController::setArchiveTree(ArchiveTree *atree, ArchiveProxy *aproxy){ mArchiveTree = atree; mArchiveProxy = aproxy; mArchiveSelection = mArchiveTree->selectionModel(); @@ -160,6 +164,7 @@ void ArchiveController::treeSelectionChanged(const QItemSelection &selected, con } mArchiveFilesModel->populate(ids); mArchiveFiles->expandAll(); + mArchiveView->setCurrentArchivePath(mArchiveModel->indexToPath(sel.first())); } void ArchiveController::fileDoubleClicked(const QModelIndex &idx){ diff --git a/archivecontroller.h b/archivecontroller.h index b863f29..66068dc 100644 --- a/archivecontroller.h +++ b/archivecontroller.h @@ -10,7 +10,9 @@ #include <QObject> #include <QItemSelection> +#include <QStringList> +class ArchiveView; class ArchiveTree; class ArchiveProxy; class ArchiveFiles; @@ -24,13 +26,15 @@ class ArchiveController : public QObject { Q_OBJECT public: explicit ArchiveController(QObject *parent = 0); - void setArchiveView(ArchiveTree *atree, ArchiveProxy *aproxy); + void setArchiveView(ArchiveView *view); + void setArchiveTree(ArchiveTree *atree, ArchiveProxy *aproxy); void setArchiveFiles(ArchiveFiles *afiles, ArchiveFilesProxy *afilesproxy); void setModels(ArchiveModel *amodel, ArchiveFilesModel *afilesmodel); ArchiveFilesModel *archiveFilesModel() { return mArchiveFilesModel; } ArchiveFiles *archiveFiles() { return mArchiveFiles; } ArchiveModel *archiveTreeModel() { return mArchiveModel; } ArchiveTree *archiveTree() { return mArchiveTree; } + ArchiveView *archiveView() { return mArchiveView; } void init(); public slots: @@ -46,6 +50,7 @@ class ArchiveController : public QObject { private: QModelIndexList mapToSource(const QSortFilterProxyModel *proxy, const QModelIndexList idxs) const; + ArchiveView *mArchiveView; ArchiveTree *mArchiveTree; ArchiveProxy *mArchiveProxy; QItemSelectionModel *mArchiveSelection; diff --git a/archiveview.cpp b/archiveview.cpp index d829356..8e1257c 100644 --- a/archiveview.cpp +++ b/archiveview.cpp @@ -17,6 +17,7 @@ #include <QSplitter> #include <QVBoxLayout> #include <QHeaderView> +#include <QSpinBox> #include "archiveview.h" #include "archivecontroller.h" @@ -54,7 +55,7 @@ ArchiveView::ArchiveView(QWidget *parent) : QWidget(parent) { // item in the list, nothing will happen otherwise! mArchiveModel->setOrder(sortOrderName); connect(mSortOrder, SIGNAL(currentIndexChanged(QString)), mArchiveModel, SLOT(setOrder(QString))); - connect(mArchiveModel, SIGNAL(modelReset()), this, SLOT(expandedItems())); + connect(mArchiveModel, SIGNAL(modelReset()), this, SLOT(doSelection())); QLabel *l1 = new QLabel(tr("Filter")); mFilter = new QLineEdit; @@ -115,7 +116,8 @@ void ArchiveView::readSettings(){ mExpandedItems[ArchiveModel::Actor] = list; list = s.value("archivemodel/expandedseries").toList(); mExpandedItems[ArchiveModel::SeriesName] = list; - expandedItems(); + mCurrentArchivePath = s.value("archivemodel/selectedseries").toStringList(); + doSelection(); mFiles->readHeaderConfig(); mFiles->setSortingEnabled(true); } @@ -127,16 +129,17 @@ void ArchiveView::writeSettings() { s.setValue("archivemodel/expandedgenres", mExpandedItems.value(ArchiveModel::Genre)); s.setValue("archivemodel/expandedactors", mExpandedItems.value(ArchiveModel::Actor)); s.setValue("archivemodel/expandedseries", mExpandedItems.value(ArchiveModel::SeriesName)); + s.setValue("archivemodel/selectedseries", mCurrentArchivePath); mFiles->writeHeaderConfig(); } void ArchiveView::refreshArchive(){ writeSettings(); mArchiveModel->refresh(); - expandedItems(); + doSelection(); } -void ArchiveView::expandedItems(){ +void ArchiveView::doSelection(){ QVariantList list = mExpandedItems.value(currentSortOrder()); foreach(QVariant p, list){ QStringList path = p.toStringList(); @@ -145,6 +148,13 @@ void ArchiveView::expandedItems(){ mTree->setExpanded(mProxy->mapFromSource(idx), true); } } + if(!mCurrentArchivePath.isEmpty()){ + QModelIndexList l = mArchiveModel->pathToIndex(mCurrentArchivePath); + if(!l.isEmpty()){ + QModelIndex sel = mProxy->mapFromSource(l.last()); + mTree->selectionModel()->select(sel, QItemSelectionModel::Rows | QItemSelectionModel::ClearAndSelect); + } + } } void ArchiveView::setFilter(){ @@ -186,7 +196,8 @@ void ArchiveView::collapseItem(const QModelIndex &idx){ void ArchiveView::initController(){ mController = new ArchiveController(this); - mController->setArchiveView(mTree, mProxy); + mController->setArchiveView(this); + mController->setArchiveTree(mTree, mProxy); mController->setArchiveFiles(mFiles, mFilesProxy); mController->setModels(mArchiveModel, mFilesModel); mController->init(); @@ -258,24 +269,47 @@ ArchiveFilesProxy::ArchiveFilesProxy(QObject *parent) : QSortFilterProxyModel(pa /* Delegate for file type */ +FileTypeDelegate::FileTypeDelegate(QObject *parent) : QStyledItemDelegate(parent){ + mFiletypeMap = SmGlobals::instance()->filetypeMap(); +} + QString FileTypeDelegate::displayText(const QVariant &value, const QLocale &locale) const{ Q_UNUSED(locale); int type = value.toInt(); - switch(type){ - case ArchiveFilesModel::Movie: - return tr("Movie"); - case ArchiveFilesModel::FrontCover: - return tr("Front Cover"); - case ArchiveFilesModel::BackCover: - return tr("Back Cover"); - case ArchiveFilesModel::GeneralCover: - return tr("General Cover"); - default: - ; + QString retval = mFiletypeMap.value(type); + if(!retval.isEmpty()){ + return retval; } return tr("n/a"); } +QWidget *FileTypeDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const{ + Q_UNUSED(option); + Q_UNUSED(index); + QComboBox *retval = new QComboBox(parent); + retval->addItems(mFiletypeMap.values()); + return retval; +} + +/* Delegate for File no. */ + +QString FileNoDelegate::displayText(const QVariant &value, const QLocale &locale) const{ + Q_UNUSED(locale); + int no = value.toInt(); + if(no){ + return QString::number(no); + } + return QString(); +} + +QWidget *FileNoDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const{ + Q_UNUSED(option); + QSpinBox *retval = new QSpinBox(parent); + int no = index.data().toInt(); + retval->setValue(no); + return retval; +} + /* Delegate for Dvd no. */ QString DvdNoDelegate::displayText(const QVariant &value, const QLocale &locale) const{ diff --git a/archiveview.h b/archiveview.h index 7507320..ac7cda4 100644 --- a/archiveview.h +++ b/archiveview.h @@ -35,12 +35,13 @@ class ArchiveView : public QWidget { int currentSortOrder() const; void readSettings(); void writeSettings(); + void setCurrentArchivePath(const QStringList &p) { mCurrentArchivePath = p; } ArchiveModel *archiveModel() { return mArchiveModel; } ArchiveTree *archiveTree() { return mTree; } public slots: void refreshArchive(); - void expandedItems(); + void doSelection(); private slots: void setFilter(); @@ -61,6 +62,7 @@ class ArchiveView : public QWidget { ArchiveFilesProxy *mFilesProxy; QHash<int, QVariantList> mExpandedItems; ArchiveController *mController; + QStringList mCurrentArchivePath; }; class ArchiveTree : public SmTreeView { @@ -109,35 +111,47 @@ class ArchiveFilesProxy : public QSortFilterProxyModel { class FileTypeDelegate : public QStyledItemDelegate { Q_OBJECT public: - explicit FileTypeDelegate(QObject *parent = 0) : QStyledItemDelegate(parent) {}; + explicit FileTypeDelegate(QObject *parent = 0); virtual QString displayText(const QVariant &value, const QLocale &locale) const; + virtual QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; + + private: + QHash<int, QString> mFiletypeMap; +}; + +class FileNoDelegate : public QStyledItemDelegate { + Q_OBJECT + public: + explicit FileNoDelegate(QObject *parent = 0) : QStyledItemDelegate(parent) {} + virtual QString displayText(const QVariant &value, const QLocale &locale) const; + virtual QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; }; class DvdNoDelegate : public QStyledItemDelegate { Q_OBJECT public: - explicit DvdNoDelegate(QObject *parent = 0) : QStyledItemDelegate(parent) {}; + explicit DvdNoDelegate(QObject *parent = 0) : QStyledItemDelegate(parent) {} virtual QString displayText(const QVariant &value, const QLocale &locale) const; }; class SizeDelegate : public QStyledItemDelegate { Q_OBJECT public: - explicit SizeDelegate(QObject *parent = 0) : QStyledItemDelegate(parent) {}; + explicit SizeDelegate(QObject *parent = 0) : QStyledItemDelegate(parent) {} virtual QString displayText(const QVariant &value, const QLocale &locale) const; }; class DurationDelegate : public QStyledItemDelegate { Q_OBJECT public: - explicit DurationDelegate(QObject *parent = 0) : QStyledItemDelegate(parent) {}; + explicit DurationDelegate(QObject *parent = 0) : QStyledItemDelegate(parent) {} virtual QString displayText(const QVariant &value, const QLocale &locale) const; }; class EmptyDelegate : public QStyledItemDelegate { Q_OBJECT public: - explicit EmptyDelegate(QObject *parent = 0) : QStyledItemDelegate(parent) {}; + explicit EmptyDelegate(QObject *parent = 0) : QStyledItemDelegate(parent) {} virtual QString displayText(const QVariant &value, const QLocale &locale) const; }; @@ -287,4 +287,10 @@ namespace Helper { return mHours == 0 && mMinutes == 0 && mSeconds == 0; } + qint64 Duration::toSeconds() const { + qint64 retval; + retval = mHours * 60 * 60 + mMinutes * 60 + mSeconds; + return retval; + } + } @@ -41,6 +41,7 @@ namespace Helper { Duration operator+(const Duration &dur) const; const QString toString() const; bool isNull() const; + qint64 toSeconds() const; private: int mHours; diff --git a/newmoviewizard.cpp b/newmoviewizard.cpp index 1115145..8e4e684 100644 --- a/newmoviewizard.cpp +++ b/newmoviewizard.cpp @@ -5,19 +5,24 @@ 2 of the License, or (at your option) any later version. */ -#include <QtWidgets/QLabel> -#include <QtWidgets/QPushButton> -#include <QtWidgets/QComboBox> -#include <QtWidgets/QLineEdit> -#include <QtWidgets/QSpinBox> -#include <QtWidgets/QFileDialog> -#include <QtWidgets/QCompleter> -#include <QtWidgets/QCheckBox> -#include <QtWidgets/QMessageBox> +#include <QLabel> +#include <QPushButton> +#include <QComboBox> +#include <QLineEdit> +#include <QSpinBox> +#include <QFileDialog> +#include <QCompleter> +#include <QCheckBox> +#include <QMessageBox> #include <QSettings> #include <QDate> -#include <QtWidgets/QPlainTextEdit> -#include <QtWidgets/QFormLayout> +#include <QPlainTextEdit> +#include <QFormLayout> +#include <QSqlDatabase> +#include <QSqlQuery> +#include <QFileInfo> +#include <QPixmap> +#include <QHeaderView> #include "newmoviewizard.h" #include "smtreeitem.h" @@ -28,7 +33,10 @@ #include "filestreemodel.h" #include "helper.h" #include "pictureviewer2.h" +#include "archivemodel.h" #include "framecache.h" +#include "archivecontroller.h" +#include "archiveview.h" NewMovieWizard::NewMovieWizard(QWidget *parent) : QWizard(parent){ mInfoPage = new MovieInfoPage; @@ -47,153 +55,204 @@ void NewMovieWizard::showEvent(QShowEvent *){ } void NewMovieWizard::accept(){ - //conjure up models - SeriesTreeModel *seriesModel = static_cast<SeriesTreeModel*>(SmGlobals::instance()->model("SeriesModel")); - FilesTreeModel *filesModel = static_cast<FilesTreeModel*>(SmGlobals::instance()->model("FilesModel")); - - //handle series - QString series = field("title").toString(); - bool hasPartNo = field("hasPartNo").toBool(); - series = series.toLower().trimmed(); - QModelIndex seriesIdx = seriesModel->find(series); - if(!seriesIdx.isValid()){ - if(seriesModel->addSeries(series, QModelIndex())){ - seriesIdx = seriesModel->find(series); - }else{ - QMessageBox::critical(this, tr("Error"), tr("Failed to create new series!")); - return; - } - } - - //handle seriespart - QModelIndex seriesPartIdx; - QString subTitle; - if(!hasPartNo){ - subTitle = field("subtitle").toString(); + QSqlDatabase db = QSqlDatabase::database("treedb"); + db.open(); + db.transaction(); + QString seriesName = field("title").toString().toLower().trimmed(); + QSqlQuery seriesIdQ(db); + seriesIdQ.prepare("SELECT iseries_id FROM series WHERE tseries_name = :value"); + seriesIdQ.bindValue(":value", seriesName); + //see if we already have a series with this name + int seriesId = 0; + seriesIdQ.exec(); + while(seriesIdQ.next()){ + seriesId = seriesIdQ.value(0).toInt(); } - int seriesno = 0; - if(hasPartNo){ - seriesno = field("seriesNo").toInt(); - seriesPartIdx = seriesModel->find(seriesno, SeriesTreeModel::SeriesPart, seriesIdx); - }else{ - seriesPartIdx = seriesModel->find(subTitle, SeriesTreeModel::Subtitle, seriesIdx); - } - - bool addSeriesPart = true; - if(seriesPartIdx.isValid()){ - if(hasPartNo){ - QString error = QString(tr("Already have part %1 of %2")).arg(seriesno).arg(series); - QMessageBox::critical(this, tr("Error"), error); - return; - }else{ - // this is getting a little convoluted now - QString question = QString(tr("Already have a part with subtitle %1. To add current file click OK.")).arg(seriesPartIdx.data(SeriesTreeModel::SubtitleRole).toString()); - int r = QMessageBox::question(this, tr("Question"), question, QMessageBox::Ok | QMessageBox::Cancel); - if(r == QMessageBox::Ok){ - addSeriesPart = false; - }else{ - return; + //we don't have an id + if(!seriesId){ + QSqlQuery insertSeriesQ(db); + insertSeriesQ.prepare("INSERT INTO series (tseries_name) VALUES(:name)"); + insertSeriesQ.bindValue(":name", seriesName); + if(insertSeriesQ.exec()){ + seriesIdQ.bindValue(":value", seriesName); + seriesIdQ.exec(); + while(seriesIdQ.next()){ + seriesId = seriesIdQ.value(0).toInt(); } - } - } - - // we don't have an already existing SeriesPart, so add it - if(addSeriesPart){ - if(!seriesModel->addSeriesPart(seriesno, seriesIdx, subTitle)){ - QMessageBox::critical(this, tr("Error"), tr("Failed to create series part!")); + }else{ + db.rollback(); return; } - //model has changed, so we need to reevaluate... - if(hasPartNo){ - seriesPartIdx = seriesModel->find(seriesno, SeriesTreeModel::SeriesPart, seriesIdx); + } + //now we have a series id, handle seriespart + int partNo = field("seriesNo").toInt(); + QString subtitle = field("subtitle").toString(); + QSqlQuery insertPartQ(db); + insertPartQ.prepare("INSERT INTO seriesparts (iseries_id, iseriespart, tsubtitle) VALUES(:sid, :pid, :tsub)"); + insertPartQ.bindValue(":sid", seriesId); + insertPartQ.bindValue(":pid", partNo); + insertPartQ.bindValue(":tsub", subtitle); + int seriesPartId = 0; + if(!insertPartQ.exec()){ + db.rollback(); + return; + } + QSqlQuery partNoQ(db); + partNoQ.prepare("SELECT iseriesparts_id FROM seriesparts WHERE iseries_id = :sid AND iseriespart = :pid AND tsubtitle = :tsub"); + partNoQ.bindValue(":sid", seriesId); + partNoQ.bindValue(":pid", partNo); + partNoQ.bindValue(":tsub", subtitle); + if(!partNoQ.exec()){ + db.rollback(); + return; + } + while(partNoQ.next()){ + seriesPartId = partNoQ.value(0).toInt(); + } + //since we're in a transaction, we have to have a valid seriespart + //handle files + MovieInfoPage *movieInfoPage = qobject_cast<MovieInfoPage*>(page(0)); + WizardTreeModel *wizardModel = movieInfoPage->model(); + int quality = field("quality").toInt(); + QSqlQuery insertFilesQ(db); + insertFilesQ.prepare("INSERT INTO files (iseriespart_id, tfilename, cmd5sum, bisize, sifiletype, sifileno, siquality, cpicsize, iduration) VALUES(:ipid, :tfn, :md5, :size, :ft, :fno, :qual, :psize, :dur)"); + QHash<QString, QString> md5Sums; + for(int i = 0; i < wizardModel->rowCount(QModelIndex()); ++i){ + QList<QVariant> fData = wizardModel->fileData(i); + QString fullPath = fData.value(WizardTreeModel::FullPath).toString(); + QFileInfo fi(fullPath); + qint64 size = fi.size(); + QString md5 = Helper::md5Sum(fullPath); + md5Sums.insert(fullPath, md5); + int secs = 0; + QString picSize; + int type = fData.value(WizardTreeModel::FileType).toInt(); + if(type == ArchiveFilesModel::Movie){ + QVariant v = Helper::duration(fullPath).value(0); + Helper::Duration dur = v.value<Helper::Duration>(); + secs = dur.toSeconds(); }else{ - seriesPartIdx = seriesModel->find(subTitle, SeriesTreeModel::Subtitle, seriesIdx); + QPixmap pix(fullPath); + picSize = QString("%1x%2").arg(QString::number(pix.width())).arg(QString::number(pix.height())); } - if(!seriesPartIdx.isValid()){ - QMessageBox::critical(this, tr("Error"), tr("Strange. Could not find series part! Cowardly bailing out.")); + insertFilesQ.bindValue(":ipid", seriesPartId); + insertFilesQ.bindValue(":tfn", fi.fileName()); + insertFilesQ.bindValue(":md5", md5); + insertFilesQ.bindValue(":size", size); + insertFilesQ.bindValue(":ft", type); + insertFilesQ.bindValue(":fno", fData.value(WizardTreeModel::FilePart)); + insertFilesQ.bindValue(":qual", quality); + insertFilesQ.bindValue(":psize", picSize); + insertFilesQ.bindValue(":dur", secs); + if(!insertFilesQ.exec()){ + db.rollback(); return; } } - int seriesPartId = seriesPartIdx.data(SeriesTreeModel::SeriesPartIdRole).toInt(); - - //handle files - MovieInfoPage *movieInfoPage = static_cast<MovieInfoPage*>(page(0)); - WizardTreeModel *wizardModel = movieInfoPage->model(); - int quality = field("quality").toInt(); - int dvdNo = -1; - bool onDvd = field("onDvd").toBool(); - if(onDvd){ - dvdNo = field("dvdNo").toInt(); - } - QHash<QString, int> fileData = wizardModel->files(); - QHash<QString, int>::const_iterator it = fileData.constBegin(); - while(it != fileData.constEnd()){ - QString path = it.key(); - int type = it.value(); - int partNo = wizardModel->filesPart(path); - if(filesModel->addFile(path, type, quality, partNo, seriesPartId, dvdNo)){ - QString md5sum = Helper::md5Sum(path); - Helper::moveToArchive(path, md5sum); - } - ++it; - } - if(onDvd){ - filesModel->addFile(tr("DVD"), FilesTreeModel::Movie, quality, -1, seriesPartId, dvdNo); - } - - //handle actors - MovieMappingPage *actorPage = static_cast<MovieMappingPage*>(page(1)); - MappingTableItemModel *actorItemModel = actorPage->model(); - QStringList actors = actorItemModel->stringList(); - MappingTableModel *actorModel = static_cast<MappingTableModel*>(SmGlobals::instance()->model("actors")); - actorModel->setMappings(actors, seriesPartId); - - //handle genres - MovieMappingPage *genrePage = static_cast<MovieMappingPage*>(page(2)); - MappingTableItemModel *genreItemModel = genrePage->model(); - QStringList genres = genreItemModel->stringList(); - MappingTableModel *genreModel = static_cast<MappingTableModel*>(SmGlobals::instance()->model("genres")); - genreModel->setMappings(genres, seriesPartId); - - //handle metadata - doMetadata(seriesPartIdx); - - //make picviewer setting persistent - QSettings s; - s.setValue("ui/archiveusepicviewer", field("usePicViewer")); - - //done - emit seriesAdded(series, seriesno); - QDialog::accept(); -} - -void NewMovieWizard::doMetadata(const QModelIndex &idx){ - bool isEnabled = field("enabled").toBool(); - if(!isEnabled){ - return; - } - int seriesPartId = idx.data(SeriesTreeModel::SeriesPartIdRole).toInt(); - SeriesMetadataModel *metadataModel = static_cast<SeriesMetadataModel*>(SmGlobals::instance()->model("SeriesMetadata")); - metadataModel->populate(seriesPartId); - QList<QVariant> metaData; - for(int i = 0; i < metadataModel->numFields(); ++i){ - metaData << QVariant(); - } - metaData[SeriesMetadataModel::ReleaseYear] = field("year"); - metaData[SeriesMetadataModel::Subject] = field("subject"); - metaData[SeriesMetadataModel::EncoderOpts] = field("encoder"); - metaData[SeriesMetadataModel::Passes] = field("passes"); - metaData[SeriesMetadataModel::SourceMedium] = mMetadataPage->sourceMedium(); - metaData[SeriesMetadataModel::ReleaseGroup] = mMetadataPage->releaseGroup(); - metaData[SeriesMetadataModel::Comment] = mMetadataPage->comment(); - metaData[SeriesMetadataModel::Added] = QDate::currentDate(); - metadataModel->setAllData(seriesPartId, metaData); + //files have landed + //handle actors + MovieMappingPage *actorPage = static_cast<MovieMappingPage*>(page(1)); + MappingTableItemModel *actorItemModel = actorPage->model(); + QStringList actors = actorItemModel->stringList(); + QSqlQuery actorIdQ(db); + actorIdQ.prepare("SELECT iactors_id FROM actors WHERE tactorname = :name"); + QSqlQuery insertActorQ(db); + insertActorQ.prepare("INSERT INTO actors (tactorname) VALUES(:name)"); + QSqlQuery actorMapQ(db); + actorMapQ.prepare("INSERT INTO seriesparts_actormap (iseriesparts_id, iactors_id) VALUES(:pid, :aid)"); + foreach(QString a, actors){ + a = a.toLower().trimmed(); + int actorId = 0; + actorIdQ.bindValue(":name", a); + actorIdQ.exec(); + while(actorIdQ.next()){ + actorId = actorIdQ.value(0).toInt(); + } + if(!actorId){ + insertActorQ.bindValue(":name", a); + insertActorQ.exec(); + actorIdQ.bindValue(":name", a); + actorIdQ.exec(); + while(actorIdQ.next()){ + actorId = actorIdQ.value(0).toInt(); + } + } + actorMapQ.bindValue(":pid", seriesPartId); + actorMapQ.bindValue(":aid", actorId); + if(!actorMapQ.exec()){ + db.rollback(); + return; + } + } + //actors are in place! + //handle genres + MovieMappingPage *genrePage = static_cast<MovieMappingPage*>(page(2)); + MappingTableItemModel *genreItemModel = genrePage->model(); + QStringList genres = genreItemModel->stringList(); + QSqlQuery genreIdQ(db); + genreIdQ.prepare("SELECT igenres_id FROM genres WHERE tgenrename = :name"); + QSqlQuery insertGenreQ(db); + insertGenreQ.prepare("INSERT INTO genres (tgenrename) VALUES(:name)"); + QSqlQuery genreMapQ(db); + genreMapQ.prepare("INSERT INTO seriesparts_genremap (iseriesparts_id, igenres_id) VALUES(:pid, :gid)"); + foreach(QString g, genres){ + g = g.toLower().trimmed(); + int genreId = 0; + genreIdQ.bindValue(":name", g); + genreIdQ.exec(); + while(genreIdQ.next()){ + genreId = genreIdQ.value(0).toInt(); + } + if(!genreId){ + insertGenreQ.bindValue(":name", g); + insertGenreQ.exec(); + genreIdQ.bindValue(":name", g); + genreIdQ.exec(); + while(genreIdQ.next()){ + genreId = genreIdQ.value(0).toInt(); + } + } + genreMapQ.bindValue(":pid", seriesPartId); + genreMapQ.bindValue(":gid", genreId); + if(!genreMapQ.exec()){ + db.rollback(); + return; + } + } + //genres done! + //now handle metadata + bool isEnabled = field("enabled").toBool(); + if(isEnabled){ + QSqlQuery insertMetadataQ(db); + insertMetadataQ.prepare("INSERT INTO metadata (iseriespart_id, sireleaseyear, tsourcemedium, tsubject, treleasegroup, tencoderopts, tcomment, sipasses, dadded) VALUES(:pid, :rely, :source, :sub, :group, :encopts, :comment, :passes, :added)"); + insertMetadataQ.bindValue(":pid", seriesPartId); + insertMetadataQ.bindValue(":rely", field("year")); + insertMetadataQ.bindValue(":source", mMetadataPage->sourceMedium()); + insertMetadataQ.bindValue(":sub", field("subject")); + insertMetadataQ.bindValue(":group", mMetadataPage->releaseGroup()); + insertMetadataQ.bindValue(":encopts", field("encoder")); + insertMetadataQ.bindValue(":comment", mMetadataPage->comment()); + insertMetadataQ.bindValue(":passes", field("passes")); + insertMetadataQ.bindValue(":added", QDate::currentDate()); + if(!insertMetadataQ.exec()){ + db.rollback(); + return; + } + } + //we're still here, good + //now actually move the files + for(int i = 0; i < wizardModel->rowCount(QModelIndex()); ++i){ + QList<QVariant> fData = wizardModel->fileData(i); + QString fullPath = fData.value(WizardTreeModel::FullPath).toString(); + QString md5 = md5Sums.value(fullPath); + Helper::moveToArchive(fullPath, md5); + } + db.commit(); + QWizard::accept(); } MovieInfoPage::MovieInfoPage(QWidget *parent) : QWizardPage(parent){ setupGui(); - mPicViewer = SmGlobals::instance()->pictureViewer(); - connect(mFileView, SIGNAL(clicked(QModelIndex)), this, SLOT(itemClicked(QModelIndex))); } void MovieInfoPage::setupGui(){ @@ -202,14 +261,19 @@ void MovieInfoPage::setupGui(){ setPixmap(QWizard::LogoPixmap, QPixmap(":/shemov.png")); //files model setup - QStringList modelHeaders = QStringList() << tr("File name") << tr("Size") << tr("File Type") << tr("Part") << tr("Full path"); + QStringList modelHeaders = QStringList() << tr("File name") << tr("Size") << tr("File Type") << tr("No.") << tr("Full path"); mFileModel = new WizardTreeModel(modelHeaders, this); - initModel(); //files view mFileView = new SmTreeView; - mFileView->setModel(mFileModel); - connect(mFileView->selectionModel(), SIGNAL(currentRowChanged(QModelIndex,QModelIndex)), this, SLOT(fileSelectionChanged(QModelIndex,QModelIndex))); + QSortFilterProxyModel *p = new QSortFilterProxyModel(this); + p->setSourceModel(mFileModel); + mFileView->setModel(p); + mFileView->setItemDelegateForColumn(WizardTreeModel::FileType, new FileTypeDelegate(mFileView)); + mFileView->setItemDelegateForColumn(WizardTreeModel::FileSize, new SizeDelegate(mFileView)); + mFileView->setItemDelegateForColumn(WizardTreeModel::FilePart, new FileNoDelegate(mFileView)); + mFileView->setSortingEnabled(true); + mFileView->header()->moveSection(1, 3); //add + remove files QHBoxLayout *fileButtonLayout = new QHBoxLayout; @@ -228,36 +292,20 @@ void MovieInfoPage::setupGui(){ mSubtitle->setEnabled(false); movieTitleLayout->addRow(tr("Movie &title"), mTitle); movieTitleLayout->addRow(tr("Movie &subtitle"), mSubtitle); - SeriesTreeModel *seriesModel = static_cast<SeriesTreeModel*>(SmGlobals::instance()->model("SeriesModel")); - QCompleter *completer = new QCompleter(this); - completer->setModel(seriesModel); - mTitle->setCompleter(completer); + mSeriesCompleter = new QCompleter(this); + mSeriesCompleterModel = new QStringListModel(this); + mSeriesCompleter->setModel(mSeriesCompleterModel); + mTitle->setCompleter(mSeriesCompleter); - //file type + //series, part + quality QHBoxLayout *numberLayout = new QHBoxLayout; - QLabel *l2 = new QLabel(tr("File &type")); - mFileType = new QComboBox; - l2->setBuddy(mFileType); - mFileType->addItems(mFileModel->types()); - numberLayout->addWidget(l2); - numberLayout->addWidget(mFileType); numberLayout->addStretch(); - connect(mFileType, SIGNAL(currentIndexChanged(QString)), this, SLOT(typeChanged(QString))); - - //series, part + quality QLabel *l3 = new QLabel(tr("&Series no.")); mSeriesNo = new QSpinBox; l3->setBuddy(mSeriesNo); mSeriesNo->setMinimum(1); numberLayout->addWidget(l3); numberLayout->addWidget(mSeriesNo); - QLabel *l4 = new QLabel(tr("&Part no.")); - mPartno = new QSpinBox; - l4->setBuddy(mPartno); - mPartno->setMinimum(-1); - connect(mPartno, SIGNAL(valueChanged(int)), this, SLOT(seriesPartChanged(int))); - numberLayout->addWidget(l4); - numberLayout->addWidget(mPartno); QLabel *l5 = new QLabel(tr("&Quality")); mQuality = new QSpinBox; l5->setBuddy(mQuality); @@ -266,78 +314,40 @@ void MovieInfoPage::setupGui(){ numberLayout->addWidget(l5); numberLayout->addWidget(mQuality); - //dvd - QHBoxLayout *dvdLayout = new QHBoxLayout; - mOnDvd = new QCheckBox(tr("Movie is on DVD")); - dvdLayout->addWidget(mOnDvd); - mHasPartno = new QCheckBox(tr("Movie has part no.")); - connect(mHasPartno, SIGNAL(stateChanged(int)), this, SLOT(hasPartnoStateChanged(int))); - mHasPartno->setChecked(true); - dvdLayout->addWidget(mHasPartno); - dvdLayout->addStretch(); - QLabel *l6 = new QLabel(tr("Dvd no.")); - dvdLayout->addWidget(l6); - mDvdNo = new QSpinBox; - mDvdNo->setMinimum(1); - dvdLayout->addWidget(mDvdNo); - connect(mOnDvd, SIGNAL(stateChanged(int)), this, SLOT(onDvd(int))); - mNextDvdNo = new QPushButton(tr("Get next")); - dvdLayout->addWidget(mNextDvdNo); - connect(mNextDvdNo, SIGNAL(clicked()), this, SLOT(setNextDvdNo())); - setNextDvdNo(); - mNextDvdNo->setChecked(false); - mDvdNo->setEnabled(false); - mNextDvdNo->setEnabled(false); - - //picviewer - QHBoxLayout *picViewerLayout = new QHBoxLayout; - picViewerLayout->setAlignment(Qt::AlignRight | Qt::AlignHCenter); - mUsePicViewer = new QCheckBox(tr("Use picture viewer when selecting item")); - picViewerLayout->addWidget(mUsePicViewer); - QSettings s; - bool usePicViewer = s.value("ui/archiveusepicviewer", false).toBool(); - mUsePicViewer->setChecked(usePicViewer); - QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(mFileView); mainLayout->addLayout(fileButtonLayout); mainLayout->addLayout(movieTitleLayout); mainLayout->addLayout(numberLayout); - mainLayout->addLayout(dvdLayout); - mainLayout->addLayout(picViewerLayout); setLayout(mainLayout); + initCompleters(); //expose data registerField("title*", mTitle); registerField("subtitle", mSubtitle); registerField("seriesNo", mSeriesNo); - registerField("partNo", mPartno); registerField("quality", mQuality); - registerField("dvdNo", mDvdNo); - registerField("onDvd", mOnDvd); - registerField("usePicViewer", mUsePicViewer); - registerField("hasPartNo", mHasPartno); } void MovieInfoPage::initializePage(){ - initModel(); + initCompleters(); mTitle->clear(); mSeriesNo->setValue(1); - mPartno->setValue(1); mQuality->setValue(8); - mOnDvd->setChecked(false); + mFileModel->clear(); } void MovieInfoPage::addFile(const QString &file){ QFileInfo fi(file); if(fi.exists()){ + if(mFileModel->find(file, WizardTreeModel::FullPath).isValid()){ + return; + } QList<QVariant> itemData; - QModelIndex parent = QModelIndex(); itemData << fi.fileName() << fi.size() << QVariant() << QVariant() << fi.absoluteFilePath(); - QString mimeType = Helper::mimeType(fi.absoluteFilePath()); + QString mimeType = Helper::mimeType(fi.absoluteFilePath()); if(mimeType.startsWith("video")){ itemData[WizardTreeModel::FileType] = WizardTreeModel::Movie; - parent = mFileModel->find("Movie files"); }else{ QString baseName = fi.completeBaseName(); QRegExp reFront = QRegExp("front"); @@ -351,18 +361,25 @@ void MovieInfoPage::addFile(const QString &file){ }else{ itemData[WizardTreeModel::FileType] = WizardTreeModel::GeneralCover; } - parent = mFileModel->find("Cover files"); - } - if(parent.isValid()){ - mFileModel->addRow(itemData, parent); } + mFileModel->appendRow(itemData, mFileModel->rootIndex()); } - mFileView->expandAll(); mFileView->resizeColumnToContents(0); mFileView->resizeColumnToContents(1); mFileView->resizeColumnToContents(2); } +void MovieInfoPage::initCompleters(){ + QSqlDatabase db = QSqlDatabase::database("treedb"); + db.open(); + QStringList series; + QSqlQuery seriesQ("SELECT tseries_name FROM series", db); + while(seriesQ.next()){ + series << seriesQ.value(0).toString(); + } + mSeriesCompleterModel->setStringList(series); +} + void MovieInfoPage::addFiles(){ QSettings s; QString startDir = s.value("paths/addfilespath", QDir::homePath()).toString(); @@ -385,121 +402,6 @@ void MovieInfoPage::removeFile(){ mFileModel->removeRows(selected.at(0).row(), 1, selected.at(0).parent()); } -void MovieInfoPage::onDvd(int state){ - mDvdNo->setEnabled(state == Qt::Checked); - mNextDvdNo->setEnabled(state == Qt::Checked); -} - -void MovieInfoPage::typeChanged(QString type){ - QModelIndexList selected = mFileView->selectionModel()->selectedRows(); - if(selected.isEmpty()){ - return; - } - int newTypeId = mFileModel->typeId(type); - if(newTypeId == -1){ - return; - } - QModelIndex item = selected.at(0); - QModelIndex typeIndex = mFileModel->index(item.row(), WizardTreeModel::FileType, item.parent()); - QModelIndex oldParent = typeIndex.parent(); - mFileModel->setData(typeIndex, newTypeId, Qt::EditRole); - QModelIndex newParent; - if(newTypeId == WizardTreeModel::Movie){ - newParent = mFileModel->find("Movie files"); - }else{ - newParent = mFileModel->find("Cover files"); - } - if(oldParent != newParent){ - mFileModel->reparent(item, newParent); - } -} - -void MovieInfoPage::seriesPartChanged(int partNo){ - QModelIndexList selected = mFileView->selectionModel()->selectedRows(); - if(selected.isEmpty()){ - return; - } - QModelIndex item = selected.at(0); - if(item.data(WizardTreeModel::FileTypeRole).toInt() == WizardTreeModel::Movie){ - QModelIndex seriesPartIdx = mFileModel->index(item.row(), WizardTreeModel::FilePart, item.parent()); - QVariant data = (partNo == 0) ? QVariant() : QVariant(partNo); - mFileModel->setData(seriesPartIdx, data, Qt::EditRole); - } -} - -void MovieInfoPage::setNextDvdNo(){ - SeriesTreeModel *seriesTreeModel = static_cast<SeriesTreeModel*>(SmGlobals::instance()->model("SeriesModel")); - int nextdvd = seriesTreeModel->findNextDvdNo(); - mDvdNo->setValue(nextdvd + 1); -} - -void MovieInfoPage::initModel(){ - SmTreeItem *root = new SmTreeItem(5); - mMoviesItem= new SmTreeItem(QList<QVariant>() << tr("Movie files") << QVariant() << QVariant() << QVariant() << QVariant(), root); - root->appendChild(mMoviesItem); - mCoversItem = new SmTreeItem(QList<QVariant>() << tr("Cover files") << QVariant() << QVariant() << QVariant() << QVariant(), root); - root->appendChild(mCoversItem); - mFileModel->setRoot(root); -} - -void MovieInfoPage::fileSelectionChanged(const QModelIndex ¤t, const QModelIndex &previous){ - Q_UNUSED(previous); - int type = current.data(WizardTreeModel::FileTypeRole).toInt(); - if(type == WizardTreeModel::Movie){ - int part = 1; - QVariant filePart= current.data(WizardTreeModel::FilePartRole); - if(filePart.isValid()){ - part = filePart.toInt(); - } - mPartno->blockSignals(true); - mPartno->setValue(part); - mPartno->blockSignals(false); - } - QString typeString = mFileModel->typeName(type); - int comboIdx = mFileType->findText(typeString); - if(comboIdx != -1){ - mFileType->blockSignals(true); - mFileType->setCurrentIndex(comboIdx); - mFileType->blockSignals(false); - } -} - -void MovieInfoPage::itemClicked(const QModelIndex &index){ - if(!field("usePicViewer").toBool()){ - return; - } - int type = index.data(WizardTreeModel::FileTypeRole).toInt(); - switch(type){ - case WizardTreeModel::Movie:{ - QString framePath = SmGlobals::instance()->frameCache()->entryPath(index.data(WizardTreeModel::FullPathRole).toString(), QString()); - mPicViewer->setFile(framePath); - break; - } - case WizardTreeModel::FrontCover: - case WizardTreeModel::BackCover: - case WizardTreeModel::GeneralCover: - mPicViewer->setFile(index.data(WizardTreeModel::FullPathRole).toString()); - break; - default: - mPicViewer->setVisible(false); - return; - } - mPicViewer->setVisible(true); - mPicViewer->raise(); -} - -void MovieInfoPage::hasPartnoStateChanged(int state){ - if(state == Qt::Checked){ - mPartno->setEnabled(true); - mSubtitle->setText(tr("<fuck off!>")); - mSubtitle->setEnabled(false); - }else{ - mPartno->setEnabled(false); - mSubtitle->clear(); - mSubtitle->setEnabled(true); - } -} - MovieMappingPage::MovieMappingPage(const QString &table, QWidget *parent) : QWizardPage(parent){ QString title = QString(tr("Edit %1")).arg(table); QString subTitle = QString(tr("Edit %1 by adding them from the text field below")).arg(table); @@ -574,15 +476,28 @@ void MovieMetadataPage::setupGui(){ } void MovieMetadataPage::initializePage(){ - QStringList relGroups = Helper::toStringList(mModel->fieldList(SeriesMetadataModel::ReleaseGroup)); - mReleaseGroup->clear(); + //release groups + mReleaseGroup->clear(); + QSqlDatabase db = QSqlDatabase::database("treedb"); + db.open(); + QSqlQuery releaseGroupsQ("SELECT DISTINCT(treleasegroup) FROM metadata ORDER BY treleasegroup ASC", db); + QStringList relGroups; + while(releaseGroupsQ.next()){ + relGroups << releaseGroupsQ.value(0).toString(); + } mReleaseGroup->addItems(relGroups); int relg = mReleaseGroup->findText("unknown"); if(relg != -1){ mReleaseGroup->setCurrentIndex(relg); } - QStringList sourceMediums = Helper::toStringList(mModel->fieldList(SeriesMetadataModel::SourceMedium)); + + //source mediums mSourceMedium->clear(); + QStringList sourceMediums; + QSqlQuery sourceMediumsQ("SELECT DISTINCT(tsourcemedium) FROM metadata ORDER BY tsourcemedium ASC", db); + while(sourceMediumsQ.next()){ + sourceMediums << sourceMediumsQ.value(0).toString(); + } mSourceMedium->addItems(sourceMediums); int uks = mSourceMedium->findText("unknown"); if(uks != -1){ @@ -615,56 +530,35 @@ void MovieMetadataPage::toggleMetadata(int state){ } WizardTreeModel::WizardTreeModel(QStringList &headers, QObject *parent) : SmTreeModel(headers, parent){ - FilesTreeModel *filesModel = static_cast<FilesTreeModel*>(SmGlobals::instance()->model("FilesModel")); - mFileTypeMap = filesModel->fileTypes(); + mFiletypeMap = SmGlobals::instance()->filetypeMap(); } Qt::ItemFlags WizardTreeModel::flags(const QModelIndex &index) const{ - if(!index.parent().isValid()){ - return Qt::ItemIsEnabled; - } + if(index.column() == FileType || index.column() == FilePart){ + return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable; + } return Qt::ItemIsEnabled | Qt::ItemIsSelectable; } -QHash<QString, int> WizardTreeModel::files() { - QHash<QString, int> retval; - mFilePartMap.clear(); - SmTreeItem *rootItem = root(); - for(int i = 0; i < rootItem->childCount(); ++i){ - SmTreeItem *firstChild = rootItem->child(i); - for(int j = 0; j < firstChild->childCount(); ++j){ - SmTreeItem *secondChild = firstChild->child(j); - retval.insert(secondChild->data(WizardTreeModel::FullPath).toString(), secondChild->data(WizardTreeModel::FileType).toInt()); - if(secondChild->data(WizardTreeModel::FilePart).isValid()){ - mFilePartMap.insert(secondChild->data(WizardTreeModel::FullPath).toString(), secondChild->data(WizardTreeModel::FilePart).toInt()); - } - } - } - return retval; +QList<QVariant> WizardTreeModel::fileData(int column) const{ + if(column >= columnCount(rootIndex())){ + return QList<QVariant>(); + } + SmTreeItem *item = root()->child(column); + QList<QVariant> retval; + for(int i = 0; i < item->columnCount(); ++i){ + retval << item->data(i); + } + return retval; } -int WizardTreeModel::filesPart(const QString &fullPath) const{ - if(mFilePartMap.contains(fullPath)){ - return mFilePartMap.value(fullPath); - } - return -1; +void WizardTreeModel::clear(){ + SmTreeItem *rootItem = new SmTreeItem(NumFields); + setRoot(rootItem); } QVariant WizardTreeModel::data(const QModelIndex &index, int role) const{ SmTreeItem *item = static_cast<SmTreeItem*>(index.internalPointer()); - if(role == Qt::DisplayRole){ - if(index.column() == FileSize){ - if(item->parent() == root()){ - return QVariant(); - } - QLocale l; - return l.toString(item->data(FileSize).toLongLong()); - } - if(index.column() == FileType){ - return mFileTypeMap.value(item->data(FileType).toInt()); - } - return item->data(index.column()); - } if(role == Qt::TextAlignmentRole){ if(index.column() == FileSize){ return Qt::AlignRight; @@ -675,9 +569,6 @@ QVariant WizardTreeModel::data(const QModelIndex &index, int role) const{ return item->data(FileName); } if(role == FileSizeRole){ - if(item->parent() == root()){ - return QVariant(); - } return item->data(FileSize); } if(role == FileTypeRole){ @@ -689,37 +580,20 @@ QVariant WizardTreeModel::data(const QModelIndex &index, int role) const{ if(role == FilePartRole){ return item->data(FilePart); } - if(role == Qt::DecorationRole){ - if(index.column() == 0){ - QSettings s; - bool iconizeCover = s.value("ui/iconizecovers", false).toBool(); - if(iconizeCover){ - int fileType = item->data(FileType).toInt(); - if((fileType == FrontCover) || (fileType == BackCover) || (fileType == GeneralCover)){ - return QIcon(item->data(FullPath).toString()); - } - } - } - return SmTreeModel::data(index, role); - } - return QVariant(); -} - -QStringList WizardTreeModel::types() const { - return mFileTypeMap.values(); + return SmTreeModel::data(index, role); } -int WizardTreeModel::typeId(const QString &value) const{ - QHash<int, QString>::const_iterator it = mFileTypeMap.constBegin(); - while(it != mFileTypeMap.constEnd()){ - if(it.value() == value){ - return it.key(); - } - ++it; - } - return -1; -} - -QString WizardTreeModel::typeName(int typeId) const{ - return mFileTypeMap.value(typeId); +bool WizardTreeModel::setData(const QModelIndex &index, const QVariant &value, int role){ + if(role == Qt::EditRole){ + SmTreeItem *item = itemAt(index); + if(index.column() == FileType){ + QVariant realVal = mFiletypeMap.key(value.toString()); + item->setData(index.column(), realVal); + }else{ + item->setData(index.column(), value); + } + emit dataChanged(index, index); + return true; + } + return false; } diff --git a/newmoviewizard.h b/newmoviewizard.h index ecc416a..b793ea0 100644 --- a/newmoviewizard.h +++ b/newmoviewizard.h @@ -8,7 +8,8 @@ #ifndef NEWMOVIEWIZARD_H #define NEWMOVIEWIZARD_H -#include <QtWidgets/QWizardPage> +#include <QWizardPage> +#include <QStyledItemDelegate> #include "smtreemodel.h" #include "mappingtablewidget.h" @@ -23,6 +24,8 @@ class MovieInfoPage; class MovieMappingPage; class MovieMetadataPage; class PictureViewer2; +class QCompleter; +class QStringListModel; class NewMovieWizard : public QWizard { Q_OBJECT @@ -36,11 +39,7 @@ class NewMovieWizard : public QWizard { protected: void showEvent(QShowEvent *); - signals: - void seriesAdded(const QString series, int seriesPart); - private: - void doMetadata(const QModelIndex &idx); MovieInfoPage *mInfoPage; MovieMappingPage *mActorPage; MovieMappingPage *mGenrePage; @@ -56,17 +55,12 @@ class MovieInfoPage : public QWizardPage { virtual void initializePage(); void addFile(const QString &file); + public slots: + void initCompleters(); + private slots: void addFiles(); void removeFile(); - void onDvd(int); - void typeChanged(QString); - void seriesPartChanged(int); - void setNextDvdNo(); - void initModel(); - void fileSelectionChanged(const QModelIndex ¤t, const QModelIndex &previous); - void itemClicked(const QModelIndex &index); - void hasPartnoStateChanged(int state); private: void setupGui(); @@ -74,20 +68,14 @@ class MovieInfoPage : public QWizardPage { QLineEdit *mTitle; QLineEdit *mSubtitle; QSpinBox *mSeriesNo; - QSpinBox *mPartno; QSpinBox *mQuality; - QSpinBox *mDvdNo; QPushButton *mAddFile; QPushButton *mRemoveFile; - QComboBox *mFileType; - QCheckBox *mOnDvd; - QCheckBox *mHasPartno; - QCheckBox *mUsePicViewer; - QPushButton *mNextDvdNo; WizardTreeModel *mFileModel; SmTreeItem *mMoviesItem; SmTreeItem *mCoversItem; - PictureViewer2 *mPicViewer; + QCompleter *mSeriesCompleter; + QStringListModel *mSeriesCompleterModel; }; class MovieMappingPage : public QWizardPage { @@ -136,23 +124,20 @@ class WizardTreeModel : public SmTreeModel { public: enum CustomRoles { FileNameRole = Qt::UserRole + 1, FileSizeRole = Qt::UserRole + 2, FileTypeRole = Qt::UserRole + 3, FilePartRole = Qt::UserRole + 4, FullPathRole = Qt::UserRole + 5 }; enum Fields { FileName = 0, FileSize = 1, FileType = 2, FilePart = 3, FullPath = 4 }; + enum { NumFields = 5 }; enum Types { Movie = 1, FrontCover = 2, BackCover = 3, GeneralCover = 4 }; explicit WizardTreeModel(QStringList &headers, QObject *parent = 0); virtual ~WizardTreeModel() {} //data + flags virtual QVariant data(const QModelIndex &index, int role) const; + virtual bool setData(const QModelIndex &index, const QVariant &value, int role); virtual Qt::ItemFlags flags(const QModelIndex &index) const; - QHash<QString, int> files(); - int filesPart(const QString &fullPath) const; - - //file types - QStringList types() const; - int typeId(const QString &value) const; - QString typeName(int typeId) const; + QList<QVariant> fileData(int column) const; + void clear(); private: - QHash<int, QString> mFileTypeMap; + QHash<int, QString> mFiletypeMap; QHash<QString, int> mFilePartMap; }; @@ -97,7 +97,9 @@ SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, fla splash.showMessage(tr("Creating misc. Dialogs..."), Qt::AlignHCenter, Qt::yellow); qApp->processEvents(); mNewMovieWizard = new NewMovieWizard(this); - connect(mNewMovieWizard, SIGNAL(seriesAdded(QString,int)), mATree->seriesWidget(), SLOT(seriesAdded(QString,int))); + mNewMovieWizard->setMinimumWidth(1024); + ArchiveController *c = SmGlobals::instance()->archiveController(); + connect(mNewMovieWizard, SIGNAL(accepted()), c->archiveTreeModel(), SLOT(refresh())); mDbAnalyzerDialog = new DbAnalyzerDialog(this); connect(mDbAnalyzerDialog, SIGNAL(partClicked(int, int)), mATree, SLOT(selectMoviePart(int, int))); connect(mDbAnalyzerDialog, SIGNAL(delItems(int,QList<int>&)), this, SLOT(analyzeDelete(int,QList<int>&))); diff --git a/smglobals.cpp b/smglobals.cpp index 9946e28..16c1e50 100644 --- a/smglobals.cpp +++ b/smglobals.cpp @@ -31,6 +31,7 @@ #include "picfilesmodel.h" #include "configurationdialog.h" #include "framecache.h" +#include "archivecontroller.h" SmGlobals *SmGlobals::mInstance = 0; @@ -142,7 +143,7 @@ QSize SmGlobals::cursorSize() { return mCursorSize; } -SmGlobals::SmGlobals() : mPictureViewer(0), mFrameCache(0){ +SmGlobals::SmGlobals() : mPictureViewer(0), mFrameCache(0), mArchiveController(0){ mIcons.insert("Dildo", ":/dildo.png"); mIcons.insert("Dick to left", ":/back_dick.png"); mIcons.insert("Dick pointing up", ":/up_dick.png"); @@ -175,4 +176,8 @@ SmGlobals::SmGlobals() : mPictureViewer(0), mFrameCache(0){ mIcons.insert("Used tampon", ":/used_tampon.png"); mIcons.insert("Clean tampon", ":/clean_tampon.png"); mDvdSize = Q_INT64_C(4707319808) - 20 * 1024 *1024; + mFiletypeMap.insert(ArchiveFilesModel::Movie, tr("Movie")); + mFiletypeMap.insert(ArchiveFilesModel::FrontCover, tr("Front Cover")); + mFiletypeMap.insert(ArchiveFilesModel::BackCover, tr("Back Cover")); + mFiletypeMap.insert(ArchiveFilesModel::GeneralCover, tr("General Cover")); } diff --git a/smglobals.h b/smglobals.h index 64cc418..825640d 100644 --- a/smglobals.h +++ b/smglobals.h @@ -39,6 +39,7 @@ class SmGlobals : public QObject { const QHash<QString, QString> & icons() const { return mIcons; } qint64 dvdSize() const { return mDvdSize; } QList<QWidget*> &treeWidgets() { return mTreeWidgets; } + QHash<int, QString> filetypeMap() const { return mFiletypeMap; } private: SmGlobals(); @@ -54,6 +55,7 @@ class SmGlobals : public QObject { qint64 mDvdSize; QList<QWidget*> mTreeWidgets; ArchiveController *mArchiveController; + QHash<int, QString> mFiletypeMap; }; #endif diff --git a/smtreemodel.cpp b/smtreemodel.cpp index 4f8ffdc..6abc999 100644 --- a/smtreemodel.cpp +++ b/smtreemodel.cpp @@ -272,6 +272,15 @@ bool SmTreeModel::addRow(const QList<QVariant> &data, const QModelIndex &parent, return false; } +bool SmTreeModel::appendRow(const QList<QVariant> &data, const QModelIndex &parent){ + SmTreeItem *pItem = itemAt(parent); + SmTreeItem *newItem = new SmTreeItem(data, pItem); + beginResetModel(); + pItem->appendChild(newItem); + endResetModel(); + return true; +} + SmTreeItem *SmTreeModel::itemAt(const QModelIndex &index) const{ if(index.isValid()){ SmTreeItem *item = static_cast<SmTreeItem*>(index.internalPointer()); diff --git a/smtreemodel.h b/smtreemodel.h index 7037e4c..8d46606 100644 --- a/smtreemodel.h +++ b/smtreemodel.h @@ -50,6 +50,7 @@ class SmTreeModel : public QAbstractItemModel { virtual bool insertRows(int row, int count, const QModelIndex &parent); virtual bool removeRows(int row, int count, const QModelIndex &parent); bool addRow(const QList<QVariant> &data, const QModelIndex &parent, bool sorted = false); + bool appendRow(const QList<QVariant> &data, const QModelIndex &parent); //misc void setDecorationIcon(const QIcon &icon) { mDecorationIcon = icon; } |