summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArno <am@disconnect.de>2013-07-08 22:09:36 +0200
committerArno <am@disconnect.de>2013-07-08 22:09:36 +0200
commit9dc2528dfdb04f18641602cfd24c09cb9b119107 (patch)
tree3849b34fea7be7db681af81ab732c4cbe72371ac
parent1013140a8b66968de1cfa0d07a353b47b8234899 (diff)
downloadSheMov-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.cpp7
-rw-r--r--archivecontroller.h7
-rw-r--r--archiveview.cpp66
-rw-r--r--archiveview.h26
-rw-r--r--helper.cpp6
-rw-r--r--helper.h1
-rw-r--r--newmoviewizard.cpp694
-rw-r--r--newmoviewizard.h43
-rw-r--r--shemov.cpp4
-rw-r--r--smglobals.cpp7
-rw-r--r--smglobals.h2
-rw-r--r--smtreemodel.cpp9
-rw-r--r--smtreemodel.h1
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;
};
diff --git a/helper.cpp b/helper.cpp
index ae5eb36..b73ea2a 100644
--- a/helper.cpp
+++ b/helper.cpp
@@ -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;
+ }
+
}
diff --git a/helper.h b/helper.h
index 983659d..f4b00f0 100644
--- a/helper.h
+++ b/helper.h
@@ -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 &current, 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 &current, 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;
};
diff --git a/shemov.cpp b/shemov.cpp
index be3c0d3..f49a293 100644
--- a/shemov.cpp
+++ b/shemov.cpp
@@ -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; }