From aaef34e66368a2803ae876d734809b69f0c258a2 Mon Sep 17 00:00:00 2001 From: Arno Date: Thu, 27 Jan 2011 13:06:32 +0100 Subject: Finished metadata Created a modes for metadata, revamped NewMovieWizard to use the model and created a MetadataWidget to edit and display metadata. --- filepropertiesdialog.cpp | 42 ++++++-- filepropertiesdialog.h | 9 +- filestreewidget.cpp | 2 +- helper.cpp | 8 ++ helper.h | 1 + newmoviewizard.cpp | 57 +++++----- newmoviewizard.h | 8 ++ seriesmetadatamodel.cpp | 274 +++++++++++++++++++++++++++++++++++++++++++++++ seriesmetadatamodel.h | 81 ++++++++++++++ shemov.pro | 6 +- smglobals.cpp | 7 ++ 11 files changed, 454 insertions(+), 41 deletions(-) create mode 100644 seriesmetadatamodel.cpp create mode 100644 seriesmetadatamodel.h diff --git a/filepropertiesdialog.cpp b/filepropertiesdialog.cpp index bcbcde6..e7e6a34 100644 --- a/filepropertiesdialog.cpp +++ b/filepropertiesdialog.cpp @@ -14,21 +14,27 @@ #include #include #include +#include #include "filepropertiesdialog.h" +#include "seriesmetadatamodel.h" #include "smtreemodel.h" #include "smtreeitem.h" #include "helper.h" -FilePropertiesDialog::FilePropertiesDialog(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f){ - //main layout - QVBoxLayout *mainLayout = new QVBoxLayout; +FilePropertiesDialog::FilePropertiesDialog(int seriesPartId, QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f){ + //tab + mTab = new QTabWidget; + + //stream data widget + QVBoxLayout *streamDataLayout = new QVBoxLayout; + QWidget *streamData = new QWidget; //description mDescriptionLabel = new QLabel(tr("Properties for [none]")); mDescriptionLabel->setAutoFillBackground(true); mDescriptionLabel->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken); - mainLayout->addWidget(mDescriptionLabel); + streamDataLayout->addWidget(mDescriptionLabel); QSettings s; QVariant varColor = s.value("ui/alternatecolor"); QColor labelColor = varColor.value(); @@ -43,16 +49,30 @@ FilePropertiesDialog::FilePropertiesDialog(QWidget *parent, Qt::WindowFlags f) : mView->setAlternatingRowColors(true); mView->setEditTriggers(QAbstractItemView::NoEditTriggers); mView->setModel(mModel); - mainLayout->addWidget(mView); + streamDataLayout->addWidget(mView); + streamData->setLayout(streamDataLayout); + mTab->addTab(streamData, tr("Stream data")); + + //metadata widget + mMetadata = new MetadataWidget; + mMetadata->setSeriesPartId(seriesPartId); + mTab->addTab(mMetadata, tr("Metadata")); - //ok button + //buttons QHBoxLayout *buttonLayout = new QHBoxLayout; - mClose = new QPushButton(tr("Close")); - connect(mClose, SIGNAL(clicked()), this, SLOT(accept())); - buttonLayout->setAlignment(Qt::AlignCenter); - buttonLayout->addWidget(mClose); - mainLayout->addLayout(buttonLayout); + mOk = new QPushButton(tr("Ok")); + connect(mOk, SIGNAL(clicked()), this, SLOT(accept())); + connect(mOk, SIGNAL(clicked()), mMetadata, SLOT(accept())); + mCancel = new QPushButton(tr("Cancel")); + connect(mCancel, SIGNAL(clicked()), this, SLOT(reject())); + buttonLayout->setAlignment(Qt::AlignRight); + buttonLayout->addWidget(mOk); + buttonLayout->addWidget(mCancel); + //main layout + QVBoxLayout *mainLayout = new QVBoxLayout; + mainLayout->addWidget(mTab); + mainLayout->addLayout(buttonLayout); setLayout(mainLayout); setMinimumWidth(450); } diff --git a/filepropertiesdialog.h b/filepropertiesdialog.h index a4f5da0..4257f18 100644 --- a/filepropertiesdialog.h +++ b/filepropertiesdialog.h @@ -15,20 +15,25 @@ class QPushButton; class QTreeView; class QLabel; +class QTabWidget; class SmTreeModel; +class MetadataWidget; class FilePropertiesDialog : public QDialog { Q_OBJECT public: - explicit FilePropertiesDialog(QWidget *parent = 0, Qt::WindowFlags f = 0); + explicit FilePropertiesDialog(int seriesPartId, QWidget *parent = 0, Qt::WindowFlags f = 0); void setFileName(const QString &fileName); void setStreamData(const QList > &streamData); void addData(const QString &caption, const QMap &data); private: + QTabWidget *mTab; + MetadataWidget *mMetadata; QTreeView *mView; - QPushButton *mClose; + QPushButton *mOk; + QPushButton *mCancel; QLabel *mDescriptionLabel; SmTreeModel *mModel; }; diff --git a/filestreewidget.cpp b/filestreewidget.cpp index 9dd4857..c4604fb 100644 --- a/filestreewidget.cpp +++ b/filestreewidget.cpp @@ -166,7 +166,7 @@ void FilesTreeWidget::fileProperties(){ } QString fullPath = real.data(FilesTreeModel::FullPathRole).toString(); QString mimeType = Helper::mimeType(fullPath); - FilePropertiesDialog dlg(this); + FilePropertiesDialog dlg(real.data(FilesTreeModel::SeriesPartIdRole).toInt(), this); if(mimeType.startsWith("video")){ QList > fileData = mModel->streamInfo(real); dlg.setFileName(real.data(FilesTreeModel::FileNameRole).toString()); diff --git a/helper.cpp b/helper.cpp index 26044fa..8a2e99a 100644 --- a/helper.cpp +++ b/helper.cpp @@ -180,6 +180,14 @@ namespace Helper { return retval; } + const QStringList toStringList(const QList &list){ + QStringList retval; + foreach(QVariant v, list){ + retval << v.toString(); + } + return retval; + } + bool SortFileInfoList::operator ()(const QFileInfo &lhs, const QFileInfo &rhs) const { return lhs.fileName().toLower() < rhs.fileName().toLower(); } diff --git a/helper.h b/helper.h index 5955320..0ca967d 100644 --- a/helper.h +++ b/helper.h @@ -27,6 +27,7 @@ namespace Helper { QPair programData(const QString &prefix, const QString &preferred = QString()); const QString durationFromSecs(qint64 secs); QVariant bytesFromUnit(QVariant number, const QString unit); + const QStringList toStringList(const QList &list); class SortFileInfoList : public std::binary_function { public: bool operator()(const QFileInfo &lhs, const QFileInfo &rhs) const; diff --git a/newmoviewizard.cpp b/newmoviewizard.cpp index 1576c55..17fadc8 100644 --- a/newmoviewizard.cpp +++ b/newmoviewizard.cpp @@ -24,8 +24,6 @@ #include #include #include -#include -#include #include #include "newmoviewizard.h" @@ -35,6 +33,7 @@ #include "smglobals.h" #include "mappingtablewidget.h" #include "mappingtablemodel.h" +#include "seriesmetadatamodel.h" #include "filestreemodel.h" #include "helper.h" #include "pictureviewer.h" @@ -140,19 +139,23 @@ void NewMovieWizard::doMetadata(const QModelIndex &idx){ if(!isEnabled){ return; } - QSqlDatabase db = QSqlDatabase::database("treedb"); int seriesPartId = idx.data(SeriesTreeModel::SeriesPartIdRole).toInt(); - QSqlQuery metadataInsert(db); - metadataInsert.prepare("INSERT INTO metadata (iseriespart_id, sireleaseyear, tsourcemedium, tsubject, treleasegroup, tencoderopts, tcomment, sipasses) VALUES(:id, :year, :source, :subject, :group, :enc, :comment, :passes)"); - metadataInsert.bindValue(":id", seriesPartId); - metadataInsert.bindValue(":year", field("year")); - metadataInsert.bindValue(":source", field("source")); - metadataInsert.bindValue(":subject", field("subject")); - metadataInsert.bindValue(":group", field("group")); - metadataInsert.bindValue(":enc", field("encoder")); - metadataInsert.bindValue(":comment", field("comment")); - metadataInsert.bindValue(":passes", field("passes")); - metadataInsert.exec(); + SeriesMetadataModel *metadataModel = static_cast(SmGlobals::instance()->model("SeriesMetadata")); + metadataModel->populate(seriesPartId); + QModelIndex curIdx = metadataModel->find(seriesPartId, SeriesMetadataModel::SeriesPartId); + if(idx.isValid()){ + QModelIndex parent = curIdx.parent(); + int row = curIdx.row(); + metadataModel->setData(parent, field("year"), row, SeriesMetadataModel::ReleaseYear); + metadataModel->setData(parent, mMetadataPage->sourceMedium(), row, SeriesMetadataModel::SourceMedium); + metadataModel->setData(parent, field("subject"), row, SeriesMetadataModel::Subject); + metadataModel->setData(parent, mMetadataPage->releaseGroup(), row, SeriesMetadataModel::ReleaseGroup); + metadataModel->setData(parent, field("encoder"), row, SeriesMetadataModel::EncoderOpts); + metadataModel->setData(parent, mMetadataPage->comment(), row, SeriesMetadataModel::Comment); + metadataModel->setData(parent, field("passes"), row, SeriesMetadataModel::Passes); + metadataModel->setData(parent, QDate::currentDate(), row, SeriesMetadataModel::Added); + metadataModel->update(); + } } MovieInfoPage::MovieInfoPage(QWidget *parent) : QWizardPage(parent){ @@ -468,6 +471,7 @@ void MovieMappingPage::initializePage(){ MovieMetadataPage::MovieMetadataPage(QWidget *parent) : QWizardPage(parent){ setTitle(tr("Edit movie metadata")); setSubTitle(tr("Set the movie metadata here, as far as known")); + mModel = static_cast(SmGlobals::instance()->model("SeriesMetadata")); setupGui(); } @@ -521,19 +525,10 @@ void MovieMetadataPage::setupGui(){ } void MovieMetadataPage::initializePage(){ - QSqlDatabase db = QSqlDatabase::database("treedb"); - QSqlQuery relGroupQuery("SELECT DISTINCT(treleasegroup) FROM metadata ORDER BY treleasegroup DESC", db); - QStringList relGroups; - while(relGroupQuery.next()){ - relGroups << relGroupQuery.value(0).toString(); - } + QStringList relGroups = Helper::toStringList(mModel->fieldList(SeriesMetadataModel::ReleaseGroup)); mReleaseGroup->clear(); mReleaseGroup->addItems(relGroups); - QSqlQuery sourceMediumQuery("SELECT DISTINCT(tsourcemedium) FROM metadata ORDER BY tsourcemedium DESC", db); - QStringList sourceMediums; - while(sourceMediumQuery.next()){ - sourceMediums << sourceMediumQuery.value(0).toString(); - } + QStringList sourceMediums = Helper::toStringList(mModel->fieldList(SeriesMetadataModel::SourceMedium)); mSourceMedium->clear(); mSourceMedium->addItems(sourceMediums); mReleaseYear->setValue(QDate::currentDate().year()); @@ -543,6 +538,18 @@ void MovieMetadataPage::initializePage(){ mComment->clear(); } +QString MovieMetadataPage::comment() const { + return mComment->toPlainText(); +} + +QString MovieMetadataPage::releaseGroup() const { + return mReleaseGroup->currentText(); +} + +QString MovieMetadataPage::sourceMedium() const { + return mSourceMedium->currentText(); +} + void MovieMetadataPage::toggleMetadata(int state){ bool isEnabled = (state == Qt::Checked); foreach(QWidget *w, mWidgets){ diff --git a/newmoviewizard.h b/newmoviewizard.h index 639a710..54a706a 100644 --- a/newmoviewizard.h +++ b/newmoviewizard.h @@ -24,6 +24,7 @@ class QComboBox; class QCheckBox; class QStringListModel; class QPlainTextEdit; +class SeriesMetadataModel; class WizardTreeModel; class SmTreeItem; class MovieInfoPage; @@ -104,16 +105,23 @@ class MovieMappingPage : public QWizardPage { class MovieMetadataPage : public QWizardPage { Q_OBJECT + Q_PROPERTY(QString comment READ comment); + Q_PROPERTY(QString releaseGroup READ releaseGroup); + Q_PROPERTY(QString sourceMedium READ sourceMedium); public: explicit MovieMetadataPage(QWidget *parent = 0); virtual ~MovieMetadataPage() {} virtual void initializePage(); + QString comment() const; + QString releaseGroup() const; + QString sourceMedium() const; private slots: void toggleMetadata(int state); private: void setupGui(); + SeriesMetadataModel *mModel; QSpinBox *mReleaseYear; QComboBox *mSourceMedium; QComboBox *mReleaseGroup; diff --git a/seriesmetadatamodel.cpp b/seriesmetadatamodel.cpp new file mode 100644 index 0000000..169db9b --- /dev/null +++ b/seriesmetadatamodel.cpp @@ -0,0 +1,274 @@ +/* + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "seriesmetadatamodel.h" +#include "smtreeitem.h" +#include "smglobals.h" +#include "helper.h" + +SeriesMetadataModel::SeriesMetadataModel(const QStringList &headers, QObject *parent) : SmTreeModel(headers, parent), mColumns(9), mDataChanged(false), mCurrentId(-1){ + //setup database + mDb = QSqlDatabase::database("treedb"); + mPopulateQuery = new QSqlQuery(mDb); + mPopulateQuery->prepare("SELECT iseriespart_id, sireleaseyear, tsourcemedium, tsubject, treleasegroup, tencoderopts, tcomment, sipasses, dadded FROM metadata WHERE iseriespart_id = :id"); + mPresentQuery = new QSqlQuery(mDb); + mPresentQuery->prepare("SELECT COUNT(*) FROM metadata WHERE iseriespart_id = :id"); + mUpdateQuery = new QSqlQuery(mDb); + mUpdateQuery->prepare("UPDATE metadata SET sireleaseyear = :year, tsourcemedium = :source, tsubject = :subject, treleasegroup = :group, tencoderopts = :encopts, tcomment = :comment, sipasses = :passes, dadded = :added WHERE iseriespart_id = :id"); + mInsertQuery = new QSqlQuery(mDb); + mInsertQuery->prepare("INSERT INTO metadata (iseriespart_id, sireleaseyear, tsourcemedium, tsubject, treleasegroup, tencoderopts, tcomment, sipasses, dadded) VALUES(:id, :year, :source, :subject, :group, :encopts, :comment, :passes, :added)"); + + //misc + mColumnNames.insert(SeriesPartId, "iseriespart_id"); + mColumnNames.insert(ReleaseYear, "sireleaseyear"); + mColumnNames.insert(SourceMedium, "tsourcemedium"); + mColumnNames.insert(Subject, "tsubject"); + mColumnNames.insert(ReleaseGroup, "treleasegroup"); + mColumnNames.insert(EncoderOpts, "tencoderopts"); + mColumnNames.insert(Comment, "tcomment"); + mColumnNames.insert(Passes, "sipasses"); + mColumnNames.insert(Added, "dadded"); +} + +SeriesMetadataModel::~SeriesMetadataModel(){ + delete mPopulateQuery; + delete mPresentQuery; + delete mUpdateQuery; + delete mInsertQuery; + mDb = QSqlDatabase(); +} + +QVariant SeriesMetadataModel::data(const QModelIndex &index, int role) const{ + if(!index.isValid()){ + return QVariant(); + } + SmTreeItem *item = itemAt(index); + if(role == SeriesPartIdRole){ + return item->data(SeriesPartId); + } + if(role == ReleaseYearRole){ + return item->data(ReleaseYear); + } + if(role == SourceMediumRole){ + return item->data(SourceMedium); + } + if(role == SubjectRole){ + return item->data(Subject); + } + if(role == ReleaseGroupRole){ + return item->data(ReleaseGroup); + } + if(role == EncoderOptsRole){ + return item->data(EncoderOpts); + } + if(role == CommentRole){ + return item->data(Comment); + } + if(role == PassesRole){ + return item->data(Passes); + } + if(role == AddedRole){ + return item->data(Added); + } + return SmTreeModel::data(index, role); +} + +const QList SeriesMetadataModel::dataList(const QModelIndex &index) const{ + if(!index.isValid()){ + return QList(); + } + QList retval; + SmTreeItem *item = itemAt(index); + for(int i = 0; i < mColumns; ++i){ + retval << item->data(i); + } + return retval; +} + +const QList SeriesMetadataModel::fieldList(int field, bool distinct) const{ + if(field >= mColumns){ + return QList(); + } + QString queryTempl; + if(distinct){ + queryTempl = QString("SELECT DISTINCT(%1) FROM metadata ORDER BY %1").arg(mColumnNames.value(field)); + }else{ + queryTempl = QString("SELECT %1 FROM metadata ORDER BY %1").arg(mColumnNames.value(field)); + } + QList retval; + QSqlQuery query(queryTempl, mDb); + while(query.next()){ + retval << query.value(0); + } + return retval; +} + +bool SeriesMetadataModel::setData(const QModelIndex &index, const QVariant &value, int role){ + if(!index.isValid()){ + return false; + } + mDataChanged = true; + return SmTreeModel::setData(index, value, role); +} + +bool SeriesMetadataModel::setData(const QModelIndex &parent, const QVariant &value, int row, int column, int role){ + if(row >= mColumns){ + return false; + } + QModelIndex idx = index(row, column, parent); + return setData(idx, value, role); +} + +bool SeriesMetadataModel::hasRecord(int seriesPartId) const{ + int count = -1; + mPresentQuery->bindValue(":id", seriesPartId); + if(mPresentQuery->exec()){ + while(mPresentQuery->next()){ + count = mPresentQuery->value(0).toInt(); + } + } + return (count > 0); +} + +void SeriesMetadataModel::populate(int seriesPartId){ + mDataChanged = false; + mCurrentId = seriesPartId; + SmTreeItem *rootItem = new SmTreeItem(mColumns); + rootItem->setData(SeriesPartId, -1); + if(hasRecord(seriesPartId)){ + QList items; + mPopulateQuery->bindValue(":id", seriesPartId); + mPopulateQuery->exec(); + while(mPopulateQuery->next()){ + for(int i = 0; i < mColumns; ++i){ + items << mPopulateQuery->value(i); + } + } + SmTreeItem *childItem = new SmTreeItem(items, rootItem); + rootItem->appendChild(childItem); + }else{ + SmTreeItem *childItem = new SmTreeItem(mColumns, rootItem); + childItem->setData(0, seriesPartId); + rootItem->appendChild(childItem); + } + setRoot(rootItem); +} + +void SeriesMetadataModel::update(){ + QSqlQuery *query; + if(hasRecord(mCurrentId)){ + query = mUpdateQuery; + }else{ + query = mInsertQuery; + } + QModelIndex curIdx = find(mCurrentId, SeriesPartId); + if(!curIdx.isValid()){ + return; + } + SmTreeItem *item = itemAt(curIdx); + query->bindValue(":id", mCurrentId); + query->bindValue(":year", item->data(ReleaseYear)); + query->bindValue(":source", item->data(SourceMedium)); + query->bindValue(":subject", item->data(Subject)); + query->bindValue(":group", item->data(ReleaseGroup)); + query->bindValue(":encopts", item->data(EncoderOpts)); + query->bindValue(":comment", item->data(Comment)); + query->bindValue(":passes", item->data(Passes)); + query->bindValue(":added", item->data(Added)); + query->exec(); +} + +MetadataWidget::MetadataWidget(QWidget *parent, Qt::WindowFlags f) : QWidget(parent, f){ + //model + mModel = static_cast(SmGlobals::instance()->model("SeriesMetadata")); + + //layout + QFormLayout *rowLayout = new QFormLayout; + mReleaseYear = new QSpinBox; + mReleaseYear->setMaximum(3000); + mReleaseYear->setMinimum(1900); + rowLayout->addRow(tr("Release year"), mReleaseYear); + mReleaseGroup = new QComboBox; + mPasses = new QSpinBox; + rowLayout->addRow(tr("Encoding passes"), mPasses); + mReleaseGroup->setEditable(true); + rowLayout->addRow(tr("Release group"), mReleaseGroup); + mSourceMedium = new QComboBox; + mSourceMedium->setEditable(true); + rowLayout->addRow(tr("Source medium"), mSourceMedium); + mSubject = new QLineEdit; + rowLayout->addRow(tr("Usenet subject"), mSubject); + mEncoderOpts = new QLineEdit; + rowLayout->addRow(tr("Encoder options"), mEncoderOpts); + mAdded = new QDateEdit(QDate::currentDate()); + rowLayout->addRow(tr("Date added"), mAdded); + QVBoxLayout *commentLayout = new QVBoxLayout; + QLabel *commentLabel = new QLabel(tr("Comment")); + commentLayout->addWidget(commentLabel); + mComment = new QPlainTextEdit; + commentLayout->addWidget(mComment); + QVBoxLayout *mainLayout = new QVBoxLayout; + mainLayout->addLayout(rowLayout); + mainLayout->addLayout(commentLayout); + setLayout(mainLayout); + + //init widgets + QStringList relGroups = Helper::toStringList(mModel->fieldList(SeriesMetadataModel::ReleaseGroup)); + mReleaseGroup->addItems(relGroups); + QStringList sources = Helper::toStringList(mModel->fieldList(SeriesMetadataModel::SourceMedium)); + mSourceMedium->addItems(sources); +} + +void MetadataWidget::setSeriesPartId(int id){ + if(!mModel->hasRecord(id)){ + return; + } + mModel->populate(id); + QModelIndex idx = mModel->find(id, SeriesMetadataModel::SeriesPartId); + if(idx.isValid()){ + mReleaseYear->setValue(idx.data(SeriesMetadataModel::ReleaseYearRole).toInt()); + mPasses->setValue(idx.data(SeriesMetadataModel::PassesRole).toInt()); + int relGroupIdx = mReleaseGroup->findText(idx.data(SeriesMetadataModel::ReleaseGroupRole).toString()); + if(relGroupIdx != -1){ + mReleaseGroup->setCurrentIndex(relGroupIdx); + } + int sourceMedIdx = mSourceMedium->findData(idx.data(SeriesMetadataModel::PassesRole)); + if(sourceMedIdx != -1){ + mSourceMedium->setCurrentIndex(sourceMedIdx); + } + mSubject->setText(idx.data(SeriesMetadataModel::SubjectRole).toString()); + mEncoderOpts->setText(idx.data(SeriesMetadataModel::EncoderOptsRole).toString()); + mAdded->setDate(idx.data(SeriesMetadataModel::AddedRole).toDate()); + mComment->setPlainText(idx.data(SeriesMetadataModel::CommentRole).toString()); + } +} + +void MetadataWidget::accept(){ + QModelIndex curIdx = mModel->find(mModel->currentId(), SeriesMetadataModel::SeriesPartId); + QModelIndex parent = curIdx.parent(); + int row = curIdx.row(); + mModel->setData(parent, mReleaseYear->value(), row, SeriesMetadataModel::ReleaseYear); + mModel->setData(parent, mPasses->value(), row, SeriesMetadataModel::Passes); + mModel->setData(parent, mReleaseGroup->currentText(), row, SeriesMetadataModel::ReleaseGroup); + mModel->setData(parent, mSourceMedium->currentText(), row, SeriesMetadataModel::SourceMedium); + mModel->setData(parent, mSubject->text(), row, SeriesMetadataModel::Subject); + mModel->setData(parent, mEncoderOpts->text(), row, SeriesMetadataModel::EncoderOpts); + mModel->setData(parent, mAdded->date(), row, SeriesMetadataModel::Added); + mModel->setData(parent, mComment->toPlainText(), row, SeriesMetadataModel::Comment); + mModel->update(); +} diff --git a/seriesmetadatamodel.h b/seriesmetadatamodel.h new file mode 100644 index 0000000..06f8cc7 --- /dev/null +++ b/seriesmetadatamodel.h @@ -0,0 +1,81 @@ +/* + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version + 2 of the License, or (at your option) any later version. +*/ + +#ifndef SERIESMETADATAMODEL_H +#define SERIESMETADATAMODEL_H + +#include +#include +#include + +class QSqlQuery; +class QSpinBox; +class QComboBox; +class QLineEdit; +class QPlainTextEdit; +class QDateEdit; + +#include "smtreemodel.h" + +class SeriesMetadataModel : public SmTreeModel { + Q_OBJECT + public: + enum CumstomRoles { SeriesPartIdRole = Qt::UserRole + 1, ReleaseYearRole = Qt::UserRole + 2, SourceMediumRole = Qt::UserRole + 3, SubjectRole = Qt::UserRole + 4, ReleaseGroupRole = Qt::UserRole + 5, EncoderOptsRole = Qt::UserRole + 6, CommentRole = Qt::UserRole + 7, PassesRole = Qt::UserRole + 8, AddedRole = Qt::UserRole + 9 }; + enum Fields { SeriesPartId = 0, ReleaseYear = 1, SourceMedium = 2, Subject = 3, ReleaseGroup = 4, EncoderOpts = 5, Comment = 6, Passes = 7, Added = 8 }; + explicit SeriesMetadataModel(const QStringList &headers, QObject *parent = 0); + virtual ~SeriesMetadataModel(); + + //data + int currentId() const { return mCurrentId; } + virtual QVariant data(const QModelIndex &index, int role) const; + const QList dataList(const QModelIndex &index) const; + const QList fieldList(int field, bool distinct = true) const; + virtual bool setData(const QModelIndex &index, const QVariant &value, int role); + virtual bool setData(const QModelIndex &parent, const QVariant &value, int row, int column, int role = Qt::EditRole); + + //misc + bool hasRecord(int seriesPartId) const; + + public slots: + void populate(int seriesPartId); + void update(); + + private: + const int mColumns; + bool mDataChanged; + int mCurrentId; + QSqlDatabase mDb; + QSqlQuery *mPopulateQuery; + QSqlQuery *mPresentQuery; + QSqlQuery *mUpdateQuery; + QSqlQuery *mInsertQuery; + QHash mColumnNames; +}; + +class MetadataWidget : public QWidget { + Q_OBJECT + public: + explicit MetadataWidget(QWidget *parent = 0, Qt::WindowFlags f = 0); + virtual ~MetadataWidget() {} + + public slots: + void setSeriesPartId(int id); + void accept(); + + private: + QSpinBox *mReleaseYear; + QComboBox *mSourceMedium; + QComboBox *mReleaseGroup; + QLineEdit *mSubject; + QLineEdit *mEncoderOpts; + QSpinBox *mPasses; + QPlainTextEdit *mComment; + QDateEdit *mAdded; + SeriesMetadataModel *mModel; +}; + +#endif // SERIESMETADATAMODEL_H diff --git a/shemov.pro b/shemov.pro index c65a003..bf6a368 100644 --- a/shemov.pro +++ b/shemov.pro @@ -31,7 +31,8 @@ SOURCES = main.cpp \ newmoviewizard.cpp \ filepropertiesdialog.cpp \ hoverwindow.cpp \ - consistencycheck.cpp + consistencycheck.cpp \ + seriesmetadatamodel.cpp HEADERS = listitem.h \ filesystemdirproxy.h \ filesystemwidget.h \ @@ -57,6 +58,7 @@ HEADERS = listitem.h \ newmoviewizard.h \ filepropertiesdialog.h \ hoverwindow.h \ - consistencycheck.h + consistencycheck.h \ + seriesmetadatamodel.h LIBS += -lmagic -lXfixes RESOURCES = shemov.qrc diff --git a/smglobals.cpp b/smglobals.cpp index de71872..005c710 100644 --- a/smglobals.cpp +++ b/smglobals.cpp @@ -25,6 +25,7 @@ #include "seriestreemodel.h" #include "filestreemodel.h" #include "mappingtablemodel.h" +#include "seriesmetadatamodel.h" #include "pictureviewer.h" SmGlobals *SmGlobals::mInstance = 0; @@ -79,6 +80,12 @@ QAbstractItemModel *SmGlobals::model(const QString &which){ MappingTableModel *model = new MappingTableModel(headers, "genres"); mModels.insert(which, model); } + }else if(which == "SeriesMetadata"){ + if(!mModels.contains(which)){ + QStringList headers = QStringList() << tr("SeriesPartId") << tr("Release Year") << tr("Source Medium") << tr("Subject") << tr("Release Group") << tr("Encoder Options") << tr("Comment") << tr("Encoding Passes") << tr("Added"); + SeriesMetadataModel *model = new SeriesMetadataModel(headers); + mModels.insert(which, model); + } } return mModels.contains(which) ? mModels.value(which) : 0; } -- cgit v1.2.3-70-g09d2