diff options
author | Arno <am@disconnect.de> | 2013-07-09 12:18:21 +0200 |
---|---|---|
committer | Arno <am@disconnect.de> | 2013-07-09 12:18:21 +0200 |
commit | de9d8a08fe5e85cdb599022261e07e27b7646f6c (patch) | |
tree | 8f47cc0602b37f32b26972c077ae15aedac79304 | |
parent | fae552580c1214ff5b3e61c6f981c720b3f49263 (diff) | |
download | SheMov-de9d8a08fe5e85cdb599022261e07e27b7646f6c.tar.gz SheMov-de9d8a08fe5e85cdb599022261e07e27b7646f6c.tar.bz2 SheMov-de9d8a08fe5e85cdb599022261e07e27b7646f6c.zip |
Show actors, genres and metadata when selecting a series
We're getting there, slowly, but steadily :)
-rw-r--r-- | archivecontroller.cpp | 16 | ||||
-rw-r--r-- | archivecontroller.h | 7 | ||||
-rw-r--r-- | archivemodel.cpp | 58 | ||||
-rw-r--r-- | archivemodel.h | 11 | ||||
-rw-r--r-- | archiveview.cpp | 57 | ||||
-rw-r--r-- | archiveview.h | 10 |
6 files changed, 152 insertions, 7 deletions
diff --git a/archivecontroller.cpp b/archivecontroller.cpp index 82d0bd8..3cdcd4a 100644 --- a/archivecontroller.cpp +++ b/archivecontroller.cpp @@ -10,6 +10,7 @@ #include <QFileInfo> #include <QMessageBox> #include <QInputDialog> +#include <QTextEdit> #include "archivecontroller.h" #include "archivemodel.h" @@ -45,6 +46,15 @@ void ArchiveController::setModels(ArchiveModel *amodel, ArchiveFilesModel *afile mArchiveFilesModel = afilesmodel; } +void ArchiveController::setMappingModels(QStringListModel *actorModel, QStringListModel *genreModel){ + mActorModel = actorModel; + mGenreModel = genreModel; +} + +void ArchiveController::setMetadata(QTextEdit *metadata){ + mMetadataView = metadata; +} + void ArchiveController::init(){ connect(mArchiveSelection, SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(treeSelectionChanged(QItemSelection,QItemSelection))); connect(mArchiveFiles, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(fileDoubleClicked(QModelIndex))); @@ -165,6 +175,12 @@ void ArchiveController::treeSelectionChanged(const QItemSelection &selected, con mArchiveFilesModel->populate(ids); mArchiveFiles->expandAll(); mArchiveView->setCurrentArchivePath(mArchiveModel->indexToPath(sel.first())); + QStringList actors = mArchiveModel->actors(ids); + mActorModel->setStringList(actors); + QStringList genres = mArchiveModel->genres(ids); + mGenreModel->setStringList(genres); + QString metaData = mArchiveModel->metadata(*ids.begin()); + mMetadataView->setHtml(metaData); } void ArchiveController::fileDoubleClicked(const QModelIndex &idx){ diff --git a/archivecontroller.h b/archivecontroller.h index 66068dc..79a624c 100644 --- a/archivecontroller.h +++ b/archivecontroller.h @@ -21,6 +21,8 @@ class ArchiveModel; class ArchiveFilesModel; class QItemSelectionModel; class QSortFilterProxyModel; +class QStringListModel; +class QTextEdit; class ArchiveController : public QObject { Q_OBJECT @@ -30,6 +32,8 @@ class ArchiveController : public QObject { void setArchiveTree(ArchiveTree *atree, ArchiveProxy *aproxy); void setArchiveFiles(ArchiveFiles *afiles, ArchiveFilesProxy *afilesproxy); void setModels(ArchiveModel *amodel, ArchiveFilesModel *afilesmodel); + void setMappingModels(QStringListModel *actorModel, QStringListModel *genreModel); + void setMetadata(QTextEdit *metadata); ArchiveFilesModel *archiveFilesModel() { return mArchiveFilesModel; } ArchiveFiles *archiveFiles() { return mArchiveFiles; } ArchiveModel *archiveTreeModel() { return mArchiveModel; } @@ -59,6 +63,9 @@ class ArchiveController : public QObject { ArchiveModel *mArchiveModel; ArchiveFilesModel *mArchiveFilesModel; QItemSelectionModel *mFileSelection; + QStringListModel *mActorModel; + QStringListModel *mGenreModel; + QTextEdit *mMetadataView; QWidget *mParentWidget; }; diff --git a/archivemodel.cpp b/archivemodel.cpp index ecd4e3d..cbc1e6e 100644 --- a/archivemodel.cpp +++ b/archivemodel.cpp @@ -14,6 +14,7 @@ #include <QFileInfo> #include <QBrush> #include <QFont> +#include <QDate> #include "smtreeitem.h" #include "archivemodel.h" @@ -255,6 +256,56 @@ QSet<int> ArchiveModel::seriesPartIds(const QModelIndex &idx) const{ return retval; } +QStringList ArchiveModel::actors(const QSet<int> &partIds) const{ + QStringList ids; + foreach(int i, partIds){ + ids << QString::number(i); + } + QString actorQString = QString("SELECT DISTINCT(tactorname) FROM actors, seriesparts_actormap WHERE seriesparts_actormap.iseriesparts_id IN (%1) AND seriesparts_actormap.iactors_id = actors.iactors_id ORDER BY tactorname ASC").arg(ids.join(",")); + QStringList retval; + QSqlQuery actorQ(actorQString, mDb); + while(actorQ.next()){ + retval << actorQ.value(0).toString(); + } + return retval; +} + +QStringList ArchiveModel::genres(const QSet<int> &genreIds) const{ + QStringList ids; + foreach(int i, genreIds){ + ids << QString::number(i); + } + QString actorQString = QString("SELECT DISTINCT(tgenrename) FROM genres, seriesparts_genremap WHERE seriesparts_genremap.iseriesparts_id IN (%1) AND seriesparts_genremap.igenres_id = genres.igenres_id ORDER BY tgenrename ASC").arg(ids.join(",")); + QStringList retval; + QSqlQuery actorQ(actorQString, mDb); + while(actorQ.next()){ + retval << actorQ.value(0).toString(); + } + return retval; +} + +QString ArchiveModel::metadata(int partId) const{ + QString retval; + retval.append("<html><table>"); + 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(); + while(metadataQuery.next()){ + retval.append(QString("<tr><td style=\"padding-right:10\"><i>Release year</i></td><td>%1</td></tr>").arg(QString::number(metadataQuery.value(0).toInt()))); + retval.append(QString("<tr><td><i>Source</i></td><td>%1</td></tr>").arg(metadataQuery.value(1).toString())); + 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())); + 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())); + } + retval.append("</table></html>"); + return retval; +} + void ArchiveModel::setOrder(int order) { mOrder = order; SmTreeItem *rootItem = readCache(mOrder); @@ -751,3 +802,10 @@ void ArchiveCollector::checkCancelled(){ quit(); } } + +QVariant SimpleModel::data(const QModelIndex &index, int role) const{ + if(role == Qt::DecorationRole){ + return QIcon(":/male_chastity_belt.png"); + } + return QStringListModel::data(index, role); +} diff --git a/archivemodel.h b/archivemodel.h index 7e77642..991d4da 100644 --- a/archivemodel.h +++ b/archivemodel.h @@ -13,6 +13,7 @@ #include <QDataStream> #include <QMutex> #include <QSet> +#include <QStringListModel> #include "smtreemodel.h" @@ -37,6 +38,9 @@ class ArchiveModel : public SmTreeModel { QStringList indexToPath(const QModelIndex &idx) const; QModelIndexList pathToIndex(const QStringList &path) const; QSet<int> seriesPartIds(const QModelIndex &idx) const; + QStringList actors(const QSet<int> &partIds) const; + QStringList genres(const QSet<int> &genreIds) const; + QString metadata(int partId) const; signals: void needRefresh(); @@ -121,4 +125,11 @@ class ArchiveCollector : public QThread { bool mCancelled; }; +class SimpleModel : public QStringListModel { + Q_OBJECT + public: + explicit SimpleModel(QObject *parent = 0) : QStringListModel(parent) {} + virtual QVariant data(const QModelIndex &index, int role) const; +}; + #endif // ARCHIVEMODEL_H diff --git a/archiveview.cpp b/archiveview.cpp index 8e1257c..94e6a20 100644 --- a/archiveview.cpp +++ b/archiveview.cpp @@ -18,9 +18,12 @@ #include <QVBoxLayout> #include <QHeaderView> #include <QSpinBox> +#include <QGroupBox> +#include <QTextEdit> #include "archiveview.h" #include "archivecontroller.h" +#include "mappingtablewidget.h" #include "smglobals.h" #include "helper.h" @@ -92,13 +95,50 @@ ArchiveView::ArchiveView(QWidget *parent) : QWidget(parent) { mFilesProxy->setSourceModel(mFilesModel); mFiles->setModel(mFilesProxy); - QSplitter *treeSplitter = new QSplitter(Qt::Horizontal); - treeSplitter->addWidget(treeWidget); - treeSplitter->addWidget(mFiles); - treeSplitter->setStretchFactor(0, 1); - treeSplitter->setStretchFactor(1, 4); + QHBoxLayout *bottomRightLayout = new QHBoxLayout; + mActorView = new SmTreeView; + mActorView->setHeaderHidden(true); + mActorModel = new SimpleModel(this); + mActorView->setModel(mActorModel); + QGroupBox *actorBox = new QGroupBox(tr("Actors")); + QHBoxLayout *actorLayout = new QHBoxLayout; + actorLayout->addWidget(mActorView); + actorBox->setLayout(actorLayout); + + mGenreView = new SmTreeView; + mGenreView->setHeaderHidden(true); + mGenreModel = new SimpleModel(this); + mGenreView->setModel(mGenreModel); + QGroupBox *genreBox = new QGroupBox(tr("Genres")); + QHBoxLayout *genreLayout = new QHBoxLayout; + genreLayout->addWidget(mGenreView); + genreBox->setLayout(genreLayout); + + mMetadataView = new QTextEdit; + mMetadataView->setReadOnly(true); + QGroupBox *metadataBox = new QGroupBox("Metadata"); + QHBoxLayout *metadataLayout = new QHBoxLayout; + metadataLayout->addWidget(mMetadataView); + metadataBox->setLayout(metadataLayout); + + bottomRightLayout->addWidget(actorBox); + bottomRightLayout->addWidget(genreBox); + bottomRightLayout->addWidget(metadataBox); + QVBoxLayout *rightLayout = new QVBoxLayout; + rightLayout->addWidget(mFiles); + rightLayout->addLayout(bottomRightLayout); + QWidget *rightWidget = new QWidget; + rightLayout->setStretchFactor(mFiles, 3); + rightWidget->setLayout(rightLayout); + + mTreeSplitter = new QSplitter(Qt::Horizontal); + mTreeSplitter->addWidget(treeWidget); + mTreeSplitter->addWidget(rightWidget); + mTreeSplitter->setStretchFactor(0, 1); + mTreeSplitter->setStretchFactor(1, 4); QHBoxLayout *mainLayout = new QHBoxLayout; - mainLayout->addWidget(treeSplitter); + mainLayout->addWidget(mTreeSplitter); + setLayout(mainLayout); initController(); } @@ -117,6 +157,8 @@ void ArchiveView::readSettings(){ list = s.value("archivemodel/expandedseries").toList(); mExpandedItems[ArchiveModel::SeriesName] = list; mCurrentArchivePath = s.value("archivemodel/selectedseries").toStringList(); + QByteArray splitterState = s.value("archivemodel/vsplitter").toByteArray(); + mTreeSplitter->restoreState(splitterState); doSelection(); mFiles->readHeaderConfig(); mFiles->setSortingEnabled(true); @@ -130,6 +172,7 @@ void ArchiveView::writeSettings() { s.setValue("archivemodel/expandedactors", mExpandedItems.value(ArchiveModel::Actor)); s.setValue("archivemodel/expandedseries", mExpandedItems.value(ArchiveModel::SeriesName)); s.setValue("archivemodel/selectedseries", mCurrentArchivePath); + s.setValue("archivemodel/vsplitter", mTreeSplitter->saveState()); mFiles->writeHeaderConfig(); } @@ -200,6 +243,8 @@ void ArchiveView::initController(){ mController->setArchiveTree(mTree, mProxy); mController->setArchiveFiles(mFiles, mFilesProxy); mController->setModels(mArchiveModel, mFilesModel); + mController->setMappingModels(mActorModel, mGenreModel); + mController->setMetadata(mMetadataView); mController->init(); SmGlobals::instance()->setArchiveController(mController); } diff --git a/archiveview.h b/archiveview.h index ac7cda4..b164141 100644 --- a/archiveview.h +++ b/archiveview.h @@ -21,12 +21,14 @@ class QComboBox; class QLabel; class QLineEdit; class QSortFilterProxyModel; - class ArchiveTree; class ArchiveFiles; class ArchiveProxy; class ArchiveFilesProxy; class ArchiveController; +class QSplitter; +class SimpleModel; +class QTextEdit; class ArchiveView : public QWidget { Q_OBJECT @@ -63,6 +65,12 @@ class ArchiveView : public QWidget { QHash<int, QVariantList> mExpandedItems; ArchiveController *mController; QStringList mCurrentArchivePath; + SmTreeView *mActorView; + SmTreeView *mGenreView; + SimpleModel *mActorModel; + SimpleModel *mGenreModel; + QSplitter *mTreeSplitter; + QTextEdit *mMetadataView; }; class ArchiveTree : public SmTreeView { |