summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArno <am@disconnect.de>2011-01-27 13:06:32 +0100
committerArno <am@disconnect.de>2011-01-27 13:06:32 +0100
commitaaef34e66368a2803ae876d734809b69f0c258a2 (patch)
tree71db0c618431c361c143dba3386045c7682d4d17
parente4718ab079f4a4eba4a47fb75992b977a787f369 (diff)
downloadSheMov-aaef34e66368a2803ae876d734809b69f0c258a2.tar.gz
SheMov-aaef34e66368a2803ae876d734809b69f0c258a2.tar.bz2
SheMov-aaef34e66368a2803ae876d734809b69f0c258a2.zip
Finished metadata
Created a modes for metadata, revamped NewMovieWizard to use the model and created a MetadataWidget to edit and display metadata.
-rw-r--r--filepropertiesdialog.cpp42
-rw-r--r--filepropertiesdialog.h9
-rw-r--r--filestreewidget.cpp2
-rw-r--r--helper.cpp8
-rw-r--r--helper.h1
-rw-r--r--newmoviewizard.cpp57
-rw-r--r--newmoviewizard.h8
-rw-r--r--seriesmetadatamodel.cpp274
-rw-r--r--seriesmetadatamodel.h81
-rw-r--r--shemov.pro6
-rw-r--r--smglobals.cpp7
11 files changed, 454 insertions, 41 deletions
diff --git a/filepropertiesdialog.cpp b/filepropertiesdialog.cpp
index bcbcde6..e7e6a34 100644
--- a/filepropertiesdialog.cpp
+++ b/filepropertiesdialog.cpp
@@ -14,21 +14,27 @@
#include <QColor>
#include <QVariant>
#include <QPalette>
+#include <QTabWidget>
#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<QColor>();
@@ -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<QMap<QString, QString> > &streamData);
void addData(const QString &caption, const QMap<QString, QString> &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<QMap<QString, QString> > 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<QVariant> &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<QString, QStringList> 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<QVariant> &list);
class SortFileInfoList : public std::binary_function<QFileInfo, QFileInfo, bool> {
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 <QSettings>
#include <QFormLayout>
#include <QDate>
-#include <QSqlDatabase>
-#include <QSqlQuery>
#include <QPlainTextEdit>
#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<SeriesMetadataModel*>(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<SeriesMetadataModel*>(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 <QSqlDatabase>
+#include <QSqlQuery>
+#include <QSpinBox>
+#include <QLineEdit>
+#include <QComboBox>
+#include <QPlainTextEdit>
+#include <QDateEdit>
+#include <QFormLayout>
+#include <QVBoxLayout>
+#include <QLabel>
+
+#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<QVariant> SeriesMetadataModel::dataList(const QModelIndex &index) const{
+ if(!index.isValid()){
+ return QList<QVariant>();
+ }
+ QList<QVariant> retval;
+ SmTreeItem *item = itemAt(index);
+ for(int i = 0; i < mColumns; ++i){
+ retval << item->data(i);
+ }
+ return retval;
+}
+
+const QList<QVariant> SeriesMetadataModel::fieldList(int field, bool distinct) const{
+ if(field >= mColumns){
+ return QList<QVariant>();
+ }
+ 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<QVariant> 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<QVariant> 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<SeriesMetadataModel*>(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 <QSqlDatabase>
+#include <QHash>
+#include <QWidget>
+
+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<QVariant> dataList(const QModelIndex &index) const;
+ const QList<QVariant> 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<int, QString> 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;
}