summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--archivecontroller.h2
-rw-r--r--archivemodel.cpp162
-rw-r--r--archivemodel.h10
-rw-r--r--archiveview.cpp235
-rw-r--r--archiveview.h54
-rw-r--r--shemov.cpp13
-rw-r--r--shemov.h3
7 files changed, 477 insertions, 2 deletions
diff --git a/archivecontroller.h b/archivecontroller.h
index 79a624c..e71abaf 100644
--- a/archivecontroller.h
+++ b/archivecontroller.h
@@ -42,6 +42,7 @@ class ArchiveController : public QObject {
void init();
public slots:
+ void treeSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
void playSelectedFiles();
void editQuality();
void editDvdNo();
@@ -49,7 +50,6 @@ class ArchiveController : public QObject {
void editFileNo();
private slots:
- void treeSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
void fileDoubleClicked(const QModelIndex &idx);
private:
diff --git a/archivemodel.cpp b/archivemodel.cpp
index 4c0439c..95e4081 100644
--- a/archivemodel.cpp
+++ b/archivemodel.cpp
@@ -92,6 +92,9 @@ QVariant ArchiveModel::data(const QModelIndex &index, int role) const{
if(role == TypeRole){
return item->data(Type);
}
+ if(role == SeriesPartIdRole){
+ return item->data(SeriesPartId);
+ }
return SmTreeModel::data(index, role);
}
@@ -270,6 +273,53 @@ QStringList ArchiveModel::actors(const QSet<int> &partIds) const{
return retval;
}
+QStringList ArchiveModel::allActors() const{
+ QStringList retval;
+ QSqlQuery q("SELECT tactorname FROM actors ORDER BY tactorname ASC", mDb);
+ while(q.next()){
+ retval << q.value(0).toString();
+ }
+ return retval;
+}
+
+void ArchiveModel::setActors(int partId, const QStringList &actors){
+ QStringList actorsForQ;
+ foreach(QString actor, actors){
+ actorsForQ << QString("\'%1\'").arg(actor);
+ }
+
+ QString actorIdQString = QString("SELECT iactors_id FROM actors WHERE tactorname IN (%1)").arg(actorsForQ.join(","));
+ QSqlQuery actorIdQ(actorIdQString, mDb);
+ QList<int> actorIds;
+ while(actorIdQ.next()){
+ actorIds << actorIdQ.value(0).toInt();
+ }
+ if(actorIds.isEmpty()){
+ return;
+ }
+ mDb.transaction();
+ QSqlQuery deleteActorsQ(mDb);
+ deleteActorsQ.prepare("DELETE FROM seriesparts_actormap WHERE iseriesparts_id = :pid");
+ deleteActorsQ.bindValue(":pid", partId);
+ if(!deleteActorsQ.exec()){
+ mDb.rollback();
+ return;
+ }
+ QSqlQuery insertActorsQ(mDb);
+ insertActorsQ.prepare("INSERT INTO seriesparts_actormap (iseriesparts_id, iactors_id) VALUES(:pid, :aid)");
+ bool success = false;
+ foreach(int aid, actorIds){
+ insertActorsQ.bindValue(":pid", partId);
+ insertActorsQ.bindValue(":aid", aid);
+ success = insertActorsQ.exec();
+ }
+ if(!success){
+ mDb.rollback();
+ return;
+ }
+ mDb.commit();
+}
+
QStringList ArchiveModel::genres(const QSet<int> &genreIds) const{
QStringList ids;
foreach(int i, genreIds){
@@ -284,6 +334,54 @@ QStringList ArchiveModel::genres(const QSet<int> &genreIds) const{
return retval;
}
+QStringList ArchiveModel::allGenres() const{
+ QStringList retval;
+ QSqlQuery q("SELECT tgenrename FROM genres ORDER BY tgenrename ASC", mDb);
+ while(q.next()){
+ retval << q.value(0).toString();
+ }
+ return retval;
+}
+
+void ArchiveModel::setGenres(int partId, const QStringList &genres){
+ QStringList genresForQ;
+ foreach(QString genre, genres){
+ genresForQ << QString("\'%1\'").arg(genre);
+ }
+
+ QString genreIdQString = QString("SELECT igenres_id FROM genres WHERE tgenrename IN (%1)").arg(genresForQ.join(","));
+ QSqlQuery genreIdQ(genreIdQString, mDb);
+ QList<int> genreIds;
+ while(genreIdQ.next()){
+ genreIds << genreIdQ.value(0).toInt();
+ }
+ if(genreIds.isEmpty()){
+ return;
+ }
+ mDb.transaction();
+ QSqlQuery deleteGenresQ(mDb);
+ deleteGenresQ.prepare("DELETE FROM seriesparts_genremap WHERE iseriesparts_id = :pid");
+ deleteGenresQ.bindValue(":pid", partId);
+ if(!deleteGenresQ.exec()){
+ mDb.rollback();
+ return;
+ }
+ QSqlQuery insertGenresQ(mDb);
+ insertGenresQ.prepare("INSERT INTO seriesparts_genremap (iseriesparts_id, igenres_id) VALUES(:pid, :aid)");
+ bool success = false;
+ foreach(int gid, genreIds){
+ insertGenresQ.bindValue(":pid", partId);
+ insertGenresQ.bindValue(":aid", gid);
+ success = insertGenresQ.exec();
+ }
+ if(!success){
+ mDb.rollback();
+ return;
+ }
+ mDb.commit();
+}
+
+
QString ArchiveModel::metadata(int partId) const{
QString retval;
retval.append("<html><table>");
@@ -297,7 +395,7 @@ QString ArchiveModel::metadata(int partId) const{
retval.append(QString("<tr><td><i>Subject</i></td><td>%1</td></tr>").arg(metadataQuery.value(2).toString()));
retval.append(QString("<tr><td><i>Rel. Group</i></td><td>%1</td></tr>").arg(metadataQuery.value(3).toString()));
retval.append(QString("<tr><td><i>Enc. Opts</i></td><td>%1</td></tr>").arg(metadataQuery.value(4).toString()));
- retval.append(QString("<tr><td><i>Passes</i></td><td>%1</td></tr>").arg(metadataQuery.value(1).toString()));
+ retval.append(QString("<tr><td><i>Passes</i></td><td>%1</td></tr>").arg(QString::number(metadataQuery.value(6).toInt())));
QDate added = metadataQuery.value(7).toDate();
retval.append(QString("<tr><td><i>Added</i></td><td>%1</td></tr>").arg(added.toString("yyyy-MM-dd")));
retval.append(QString("<tr><td><i>Comment</i></td><td>%1</td></tr>").arg(metadataQuery.value(5).toString()));
@@ -306,6 +404,68 @@ QString ArchiveModel::metadata(int partId) const{
return retval;
}
+QList<QVariant> ArchiveModel::metadataList(int partId) const{
+ QSqlQuery metadataQuery(mDb);
+ metadataQuery.prepare("SELECT sireleaseyear, tsourcemedium, tsubject, treleasegroup, tencoderopts, tcomment, sipasses, dadded FROM metadata WHERE iseriespart_id = :id");
+ metadataQuery.bindValue(":id", partId);
+ metadataQuery.exec();
+ QList<QVariant> retval;
+ for(int i = 0; i < MetadataNumFields; ++i){
+ retval << QVariant();
+ }
+ while(metadataQuery.next()){
+ for(int i = 0; i < MetadataNumFields; ++i){
+ retval[i] = metadataQuery.value(i);
+ }
+ }
+ return retval;
+}
+
+void ArchiveModel::setMetadata(int partId, const QList<QVariant> &data){
+ mDb.transaction();
+ QSqlQuery delMetadataQ(mDb);
+ delMetadataQ.prepare("DELETE FROM metadata WHERE iseriespart_id = :pid");
+ delMetadataQ.bindValue(":pid", partId);
+ if(!delMetadataQ.exec()){
+ mDb.rollback();
+ return;
+ }
+ QSqlQuery insertMetadataQ(mDb);
+ 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", partId);
+ insertMetadataQ.bindValue(":rely", data.at(ReleaseYear));
+ insertMetadataQ.bindValue(":source", data.at(Source));
+ insertMetadataQ.bindValue(":sub", data.at(Subject));
+ insertMetadataQ.bindValue(":group", data.at(ReleaseGroup));
+ insertMetadataQ.bindValue(":encopts", data.at(EncoderOpts));
+ insertMetadataQ.bindValue(":comment", data.at(Comment));
+ insertMetadataQ.bindValue(":passes", data.at(Passes));
+ insertMetadataQ.bindValue(":added", data.at(Added));
+ if(!insertMetadataQ.exec()){
+ mDb.rollback();
+ return;
+ }
+ mDb.commit();
+}
+
+QStringList ArchiveModel::allSources() const{
+ QSqlQuery sQ("SELECT DISTINCT(tsourcemedium) FROM metadata ORDER BY tsourcemedium ASC", mDb);
+ QStringList retval;
+ while(sQ.next()){
+ retval << sQ.value(0).toString();
+ }
+ return retval;
+}
+
+QStringList ArchiveModel::allReleaseGroups() const{
+ QSqlQuery rQ("SELECT DISTINCT(treleasegroup) FROM metadata ORDER BY treleasegroup ASC", mDb);
+ QStringList retval;
+ while(rQ.next()){
+ retval << rQ.value(0).toString();
+ }
+ return retval;
+}
+
void ArchiveModel::setOrder(int order) {
mOrder = order;
SmTreeItem *rootItem = readCache(mOrder);
diff --git a/archivemodel.h b/archivemodel.h
index 991d4da..5b84492 100644
--- a/archivemodel.h
+++ b/archivemodel.h
@@ -24,6 +24,8 @@ class ArchiveModel : public SmTreeModel {
public:
enum CustomRoles { NameRole = Qt::UserRole + 1, GenericIdRole = Qt::UserRole + 2, SeriesPartIdRole = Qt::UserRole + 3, SeriesPartRole = Qt::UserRole + 4, TypeRole = Qt::UserRole + 5, FavoriteRole = Qt::UserRole + 6, SubtitleRole = Qt::UserRole + 7, CountRole = Qt::UserRole + 8 };
enum Fields { Name = 0, GenericId = 1, SeriesPartId = 2, SeriesPart = 3, Type = 4, Favorite = 5, Subtitle = 6, Count = 7 };
+ enum MetadataFields { ReleaseYear = 0, Source = 1, Subject = 2, ReleaseGroup = 3, EncoderOpts = 4, Comment = 5, Passes = 6, Added = 7 };
+ enum { MetadataNumFields = 8 };
enum Order { SeriesName, Actor, Genre, NoOrder };
enum { NumFields = 8 };
enum NodeType { SeriesNode, SeriesPartNode, GenreNode, ActorNode };
@@ -39,8 +41,16 @@ class ArchiveModel : public SmTreeModel {
QModelIndexList pathToIndex(const QStringList &path) const;
QSet<int> seriesPartIds(const QModelIndex &idx) const;
QStringList actors(const QSet<int> &partIds) const;
+ QStringList allActors() const;
+ void setActors(int partId, const QStringList &actors);
QStringList genres(const QSet<int> &genreIds) const;
+ QStringList allGenres() const;
+ void setGenres(int partId, const QStringList &genres);
QString metadata(int partId) const;
+ QList<QVariant> metadataList(int partId) const;
+ void setMetadata(int partId, const QList<QVariant> &data);
+ QStringList allSources() const;
+ QStringList allReleaseGroups() const;
signals:
void needRefresh();
diff --git a/archiveview.cpp b/archiveview.cpp
index 94e6a20..92fd83a 100644
--- a/archiveview.cpp
+++ b/archiveview.cpp
@@ -20,6 +20,9 @@
#include <QSpinBox>
#include <QGroupBox>
#include <QTextEdit>
+#include <QCompleter>
+#include <QStandardItemModel>
+#include <QFormLayout>
#include "archiveview.h"
#include "archivecontroller.h"
@@ -285,6 +288,60 @@ void ArchiveTree::remove(){
}
}
+void ArchiveTree::editActors(){
+ MappingEditor e(tr("Actors"), this);
+ QStringList actors = mModel->allActors();
+ e.fillCompleter(actors);
+ QModelIndex idx = currentIndex();
+ int pId = idx.data(ArchiveModel::SeriesPartIdRole).toInt();
+ QStringList curActors = mModel->actors(QSet<int>() << pId);
+ e.setCurrentItems(curActors);
+ int res = e.exec();
+ if(res == QDialog::Accepted){
+ QStringList selActors = e.items();
+ mModel->setActors(pId, selActors);
+ ArchiveController *c = SmGlobals::instance()->archiveController();
+ c->treeSelectionChanged(QItemSelection(), QItemSelection());
+ }
+}
+
+void ArchiveTree::editGenres(){
+ MappingEditor e(tr("Genres"), this);
+ QStringList genres = mModel->allGenres();
+ e.fillCompleter(genres);
+ QModelIndex idx = currentIndex();
+ int pId = idx.data(ArchiveModel::SeriesPartIdRole).toInt();
+ QStringList curGenres = mModel->genres(QSet<int>() << pId);
+ e.setCurrentItems(curGenres);
+ int res = e.exec();
+ if(res == QDialog::Accepted){
+ QStringList selGenres = e.items();
+ mModel->setGenres(pId, selGenres);
+ ArchiveController *c = SmGlobals::instance()->archiveController();
+ c->treeSelectionChanged(QItemSelection(), QItemSelection());
+ }
+}
+
+void ArchiveTree::editMetadata(){
+ MetadataEditor e(this);
+ ArchiveController *c = SmGlobals::instance()->archiveController();
+ QStringList sources = c->archiveTreeModel()->allSources();
+ e.setSources(sources);
+ QStringList relGroups = c->archiveTreeModel()->allReleaseGroups();
+ e.setReleaseGroups(relGroups);
+ QModelIndex idx = currentIndex();
+ int pId = idx.data(ArchiveModel::SeriesPartIdRole).toInt();
+ QList<QVariant> curMetadata = c->archiveTreeModel()->metadataList(pId);
+ e.setMetadata(curMetadata);
+ int res = e.exec();
+ if(res == QDialog::Accepted){
+ QList<QVariant> data = e.metadata();
+ mModel->setMetadata(pId, data);
+ c->treeSelectionChanged(QItemSelection(), QItemSelection());
+ }
+}
+
+
void ArchiveTree::impossible(const QString msg){
QMessageBox::critical(this, tr("Error"), msg);
}
@@ -336,6 +393,184 @@ QWidget *FileTypeDelegate::createEditor(QWidget *parent, const QStyleOptionViewI
return retval;
}
+/* Mapping Editor */
+
+MappingEditor::MappingEditor(const QString &caption, QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f) {
+ mModel = new QStandardItemModel(this);
+ mModel->setHorizontalHeaderLabels(QStringList() << caption);
+ mProxy = new QSortFilterProxyModel(this);
+ mProxy->setSourceModel(mModel);
+ QVBoxLayout *viewLayout = new QVBoxLayout;
+ mView = new SmTreeView;
+ viewLayout->addWidget(mView);
+ mView->setModel(mProxy);
+ mView->setSortingEnabled(true);
+
+ QHBoxLayout *editLayout = new QHBoxLayout;
+ QLabel *l2 = new QLabel(tr("Add:"));
+ mEditor = new QLineEdit;
+ mCompleter = new QCompleter(this);
+ mCompleterModel = new QStringListModel(this);
+ mCompleter->setModel(mCompleterModel);
+ mEditor->setCompleter(mCompleter);
+ editLayout->addWidget(l2);
+ editLayout->addWidget(mEditor);
+
+ QHBoxLayout *editButtonLayout = new QHBoxLayout;
+ mRemove = new QPushButton(tr("Remove"));
+ connect(mRemove, SIGNAL(clicked()), this, SLOT(removeItem()));
+ editButtonLayout->addWidget(mRemove);
+ mAdd = new QPushButton(tr("Add"));
+ connect(mAdd, SIGNAL(clicked()), this, SLOT(addItem()));
+ editButtonLayout->addWidget(mAdd);
+
+ QHBoxLayout *buttonLayout = new QHBoxLayout;
+ buttonLayout->addStretch();
+ mCancel = new QPushButton(tr("Cancel"));
+ connect(mCancel, SIGNAL(clicked()), this, SLOT(reject()));
+ buttonLayout->addWidget(mCancel);
+ mAccept = new QPushButton(tr("Accept"));
+ connect(mAccept, SIGNAL(clicked()), this, SLOT(accept()));
+ buttonLayout->addWidget(mAccept);
+
+ QVBoxLayout *mainLayout = new QVBoxLayout;
+ mainLayout->addLayout(viewLayout);
+ mainLayout->addLayout(editLayout);
+ mainLayout->addLayout(editButtonLayout);
+ mainLayout->addLayout(buttonLayout);
+ setLayout(mainLayout);
+ setMinimumWidth(400);
+}
+
+void MappingEditor::fillCompleter(const QStringList &completions){
+ mCompleterModel->setStringList(completions);
+}
+
+void MappingEditor::setCurrentItems(const QStringList &items){
+ foreach(QString i, items){
+ QStandardItem *item = new QStandardItem(i);
+ item->setIcon(QIcon(":/huge_bra.png"));
+ mModel->appendRow(item);
+ }
+}
+
+QStringList MappingEditor::items() const{
+ QStringList retval;
+ for(int i = 0; i < mModel->rowCount(); ++i){
+ QStandardItem *item = mModel->item(i);
+ retval << item->text();
+ }
+ return retval;
+}
+
+void MappingEditor::addItem(){
+ QString itemName = mEditor->text();
+ if(itemName.isEmpty()){
+ return;
+ }
+ QList<QStandardItem*> found = mModel->findItems(itemName, Qt::MatchFixedString);
+ if(found.size()){
+ return;
+ }
+ QStandardItem *newItem = new QStandardItem(itemName);
+ newItem->setIcon(QIcon(":/huge_bra.png"));
+ mModel->appendRow(newItem);
+ mEditor->clear();
+}
+
+void MappingEditor::removeItem(){
+ QModelIndexList sel = mView->selectionModel()->selectedRows();
+ if(sel.isEmpty()){
+ return;
+ }
+ QModelIndex real = mProxy->mapToSource(sel.first());
+ mModel->removeRow(real.row());
+}
+
+/* Metadata Editor */
+
+MetadataEditor::MetadataEditor(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f){
+ QLabel *captionL = new QLabel(tr("<b>Edit Metadata</b>"));
+
+ QFormLayout *dataLayout = new QFormLayout;
+ mReleaseYear = new QSpinBox;
+ mReleaseYear->setMinimum(1900);
+ mReleaseYear->setMaximum(3000);
+ dataLayout->addRow(tr("&Release Year"), mReleaseYear);
+ mSource = new QComboBox;
+ mSource->setEditable(true);
+ dataLayout->addRow(tr("&Source"), mSource);
+ mRelGroup = new QComboBox;
+ mRelGroup->setEditable(true);
+ dataLayout->addRow(tr("Release &Group"), mRelGroup);
+ mSubject = new QLineEdit;
+ dataLayout->addRow(tr("Sub&ject"), mSubject);
+ mEncoderOpts = new QLineEdit;
+ dataLayout->addRow(tr("&Encoder Opts."), mEncoderOpts);
+ mPasses = new QSpinBox;
+ mPasses->setMinimum(0);
+ mPasses->setMaximum(10);
+ dataLayout->addRow(tr("&Passes"), mPasses);
+
+ QVBoxLayout *commentLayout = new QVBoxLayout;
+ QLabel *commentL = new QLabel(tr("<b>Comment</b>"));
+ commentLayout->addWidget(commentL);
+ mComment = new QTextEdit;
+ commentLayout->addWidget(mComment);
+
+ QHBoxLayout *buttonLayout = new QHBoxLayout;
+ buttonLayout->addStretch();
+ mCancel = new QPushButton(tr("Cancel"));
+ connect(mCancel, SIGNAL(clicked()), this, SLOT(reject()));
+ buttonLayout->addWidget(mCancel);
+ mAccept = new QPushButton(tr("Accept"));
+ connect(mAccept, SIGNAL(clicked()), this, SLOT(accept()));
+ buttonLayout->addWidget(mAccept);
+
+ QVBoxLayout *mainLayout = new QVBoxLayout;
+ mainLayout->addWidget(captionL);
+ mainLayout->addLayout(dataLayout);
+ mainLayout->addLayout(commentLayout);
+ mainLayout->addLayout(buttonLayout);
+ setLayout(mainLayout);
+ setMinimumWidth(400);
+}
+
+void MetadataEditor::setSources(const QStringList &sources){
+ mSource->addItems(sources);
+}
+
+void MetadataEditor::setReleaseGroups(const QStringList &relGroups){
+ mRelGroup->addItems(relGroups);
+}
+
+void MetadataEditor::setMetadata(const QList<QVariant> &data){
+ mReleaseYear->setValue(data.at(ArchiveModel::ReleaseYear).toInt());
+ mSource->setCurrentText(data.at(ArchiveModel::Source).toString());
+ mSubject->setText(data.at(ArchiveModel::Subject).toString());
+ mRelGroup->setCurrentText(data.at(ArchiveModel::ReleaseGroup).toString());
+ mEncoderOpts->setText(data.at(ArchiveModel::EncoderOpts).toString());
+ mPasses->setValue(data.at(ArchiveModel::Passes).toInt());
+ mComment->setText(data.at(ArchiveModel::Comment).toString());
+ mAdded = data.at(ArchiveModel::Added).toDate();
+}
+
+QList<QVariant> MetadataEditor::metadata() const{
+ QList<QVariant> retval;
+ for(int i = 0; i < ArchiveModel::MetadataNumFields; ++i){
+ retval << QVariant();
+ }
+ retval[ArchiveModel::ReleaseYear] = mReleaseYear->value();
+ retval[ArchiveModel::Source] = mSource->currentText();
+ retval[ArchiveModel::Subject] = mSubject->text();
+ retval[ArchiveModel::ReleaseGroup] = mRelGroup->currentText();
+ retval[ArchiveModel::EncoderOpts] = mEncoderOpts->text();
+ retval[ArchiveModel::Passes] = mPasses->value();
+ retval[ArchiveModel::Comment] = mComment->toPlainText();
+ retval[ArchiveModel::Added] = mAdded;
+ return retval;
+}
+
/* Delegate for File no. */
QString FileNoDelegate::displayText(const QVariant &value, const QLocale &locale) const{
diff --git a/archiveview.h b/archiveview.h
index b164141..72dd078 100644
--- a/archiveview.h
+++ b/archiveview.h
@@ -13,6 +13,7 @@
#include <QSortFilterProxyModel>
#include <QWidget>
#include <QStyledItemDelegate>
+#include <QDate>
#include "archivemodel.h"
#include "smtreeview.h"
@@ -29,6 +30,9 @@ class ArchiveController;
class QSplitter;
class SimpleModel;
class QTextEdit;
+class QCompleter;
+class QStandardItemModel;
+class QSpinBox;
class ArchiveView : public QWidget {
Q_OBJECT
@@ -82,6 +86,9 @@ class ArchiveTree : public SmTreeView {
public slots:
void rename();
void remove();
+ void editActors();
+ void editGenres();
+ void editMetadata();
private:
void impossible(const QString msg = tr("Unable to perform function!"));
@@ -127,6 +134,53 @@ class FileTypeDelegate : public QStyledItemDelegate {
QHash<int, QString> mFiletypeMap;
};
+class MappingEditor : public QDialog {
+ Q_OBJECT
+ public:
+ explicit MappingEditor(const QString &caption, QWidget *parent = 0, Qt::WindowFlags f = 0);
+ void fillCompleter(const QStringList &completions);
+ void setCurrentItems(const QStringList &items);
+ QStringList items() const;
+
+ private slots:
+ void addItem();
+ void removeItem();
+
+ private:
+ QStandardItemModel *mModel;
+ QSortFilterProxyModel *mProxy;
+ SmTreeView *mView;
+ QPushButton *mAdd;
+ QPushButton *mRemove;
+ QPushButton *mAccept;
+ QPushButton *mCancel;
+ QLineEdit *mEditor;
+ QCompleter *mCompleter;
+ QStringListModel *mCompleterModel;
+};
+
+class MetadataEditor : public QDialog {
+ Q_OBJECT
+ public:
+ explicit MetadataEditor(QWidget *parent = 0, Qt::WindowFlags f = 0);
+ void setSources(const QStringList &sources);
+ void setReleaseGroups(const QStringList &relGroups);
+ void setMetadata(const QList<QVariant> &data);
+ QList<QVariant> metadata() const;
+
+ private:
+ QSpinBox *mReleaseYear;
+ QComboBox *mSource;
+ QComboBox *mRelGroup;
+ QLineEdit *mSubject;
+ QLineEdit *mEncoderOpts;
+ QSpinBox *mPasses;
+ QTextEdit *mComment;
+ QPushButton *mCancel;
+ QPushButton *mAccept;
+ QDate mAdded;
+};
+
class FileNoDelegate : public QStyledItemDelegate {
Q_OBJECT
public:
diff --git a/shemov.cpp b/shemov.cpp
index f49a293..e7dd835 100644
--- a/shemov.cpp
+++ b/shemov.cpp
@@ -753,6 +753,15 @@ void SheMov::createActions(){
// remove
mArchiveViewRemoveA = new QAction(tr("Remove..."), this);
connect(mArchiveViewRemoveA, SIGNAL(triggered()), c->archiveTree(), SLOT(remove()));
+ // edit actors
+ mArchiveViewActorsA = new QAction(tr("Edit actors..."), this);
+ connect(mArchiveViewActorsA, SIGNAL(triggered()), c->archiveTree(), SLOT(editActors()));
+ // edit genres
+ mArchiveViewGenresA = new QAction(tr("Edit genres..."), this);
+ connect(mArchiveViewGenresA, SIGNAL(triggered()), c->archiveTree(), SLOT(editGenres()));
+ // edit metadata
+ mArchiveViewMetadataA = new QAction(tr("Edit metadata..."), this);
+ connect(mArchiveViewMetadataA, SIGNAL(triggered()), c->archiveTree(), SLOT(editMetadata()));
// ArchiveFiles actions
mArchiveFilesPlayA = new QAction(tr("Play selected..."), this);
@@ -995,6 +1004,10 @@ void SheMov::createMenus(){
ArchiveController *c = SmGlobals::instance()->archiveController();
c->archiveTree()->addAction(mArchiveViewRenameA);
c->archiveTree()->addAction(mArchiveViewRemoveA);
+ c->archiveTree()->addAction(createSeparator());
+ c->archiveTree()->addAction(mArchiveViewActorsA);
+ c->archiveTree()->addAction(mArchiveViewGenresA);
+ c->archiveTree()->addAction(mArchiveViewMetadataA);
// Archive files (exp.)
c->archiveFiles()->addAction(mArchiveFilesPlayA);
diff --git a/shemov.h b/shemov.h
index 8abc17b..7d61106 100644
--- a/shemov.h
+++ b/shemov.h
@@ -189,6 +189,9 @@ class SheMov : public QMainWindow {
//ArchiveView actions
QAction *mArchiveViewRenameA;
QAction *mArchiveViewRemoveA;
+ QAction *mArchiveViewActorsA;
+ QAction *mArchiveViewGenresA;
+ QAction *mArchiveViewMetadataA;
QActionGroup *mArchiveFilesAG;
//ArchiveFiles actions