diff options
-rw-r--r-- | archivecontroller.h | 2 | ||||
-rw-r--r-- | archivemodel.cpp | 162 | ||||
-rw-r--r-- | archivemodel.h | 10 | ||||
-rw-r--r-- | archiveview.cpp | 235 | ||||
-rw-r--r-- | archiveview.h | 54 | ||||
-rw-r--r-- | shemov.cpp | 13 | ||||
-rw-r--r-- | shemov.h | 3 |
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: @@ -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); @@ -189,6 +189,9 @@ class SheMov : public QMainWindow { //ArchiveView actions QAction *mArchiveViewRenameA; QAction *mArchiveViewRemoveA; + QAction *mArchiveViewActorsA; + QAction *mArchiveViewGenresA; + QAction *mArchiveViewMetadataA; QActionGroup *mArchiveFilesAG; //ArchiveFiles actions |