summaryrefslogtreecommitdiffstats
path: root/seriesmetadatamodel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'seriesmetadatamodel.cpp')
-rw-r--r--seriesmetadatamodel.cpp274
1 files changed, 274 insertions, 0 deletions
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();
+}