diff options
-rw-r--r-- | actorcountmodel.cpp | 76 | ||||
-rw-r--r-- | actorcountmodel.h | 31 | ||||
-rw-r--r-- | editarchiveitemdialog.cpp | 81 | ||||
-rw-r--r-- | editarchiveitemdialog.h | 12 | ||||
-rw-r--r-- | shemov.pro | 6 | ||||
-rw-r--r-- | statisticsdialog.cpp | 21 |
6 files changed, 154 insertions, 73 deletions
diff --git a/actorcountmodel.cpp b/actorcountmodel.cpp new file mode 100644 index 0000000..ac82f97 --- /dev/null +++ b/actorcountmodel.cpp @@ -0,0 +1,76 @@ +/* + 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 <QSqlQuery> +#include <QIcon> + +#include "actorcountmodel.h" + +ActorCountModel::ActorCountModel(QObject *parent) : QAbstractItemModel(parent) { + QSqlQuery query("SELECT iactorid, tactorname FROM actor ORDER BY tactorname ASC"); + QSqlQuery countQuery; + countQuery.prepare("SELECT COUNT(*) FROM movieactormap WHERE iactorid = :id"); + while(query.next()){ + QVariant *name = new QVariant(query.value(1)); + countQuery.bindValue(":id", query.value(0)); + countQuery.exec(); + QVariant *count; + while(countQuery.next()){ + count = new QVariant(countQuery.value(0)); + } + QList<QVariant*> l; + l << name << count; + mItems.append(l); + } + mHeaderData << tr("Model name") << tr("Movies"); +} + +ActorCountModel::~ActorCountModel() { + foreach(QList<QVariant*> l, mItems){ + qDeleteAll(l); + } +} + +QModelIndex ActorCountModel::index(int row, int column, const QModelIndex &parent) const { + if((column > 1) || (row >= mItems.size()) || (row < 0) || (parent != QModelIndex())){ + return QModelIndex(); + } + return createIndex(row, column, 0); +} + +int ActorCountModel::rowCount(const QModelIndex &) const { + return mItems.size(); +} + +int ActorCountModel::columnCount(const QModelIndex &) const { + return 2; +} + +QVariant ActorCountModel::data(const QModelIndex &idx, int role) const { + if(!idx.isValid() || (idx.column() > 1) || (idx.row() > mItems.size())){ + return QVariant(); + } + switch (role) { + case Qt::DisplayRole: + return *(mItems.at(idx.row()).at(idx.column())); + break; + case Qt::DecorationRole: + if(idx.column() == 0){ + return QIcon(":/dildo.png"); + } + break; + } + return QVariant(); +} + +QVariant ActorCountModel::headerData(int section, Qt::Orientation o, int role) const { + if((role != Qt::DisplayRole) || (o != Qt::Horizontal) || (section > 1)){ + return QVariant(); + } + return mHeaderData.at(section); +} + diff --git a/actorcountmodel.h b/actorcountmodel.h new file mode 100644 index 0000000..aa605aa --- /dev/null +++ b/actorcountmodel.h @@ -0,0 +1,31 @@ +/* + 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 ACTORCOUNTMODEL_H +#define ACTORCOUNTMODEL_H + +#include <QAbstractItemModel> + +class ActorCountModel : public QAbstractItemModel { + Q_OBJECT + public: + ActorCountModel(QObject *parent = 0); + virtual ~ActorCountModel(); + QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; + int rowCount(const QModelIndex &idx) const; + int columnCount(const QModelIndex &idx) const; + QVariant data(const QModelIndex &idx, int role = Qt::DisplayRole) const; + QVariant headerData(int section, Qt::Orientation o, int role = Qt::DisplayRole) const; + QModelIndex parent(const QModelIndex &) const { return QModelIndex(); }; + + private: + QList<QList<QVariant*> >mItems; + QList<QVariant> mHeaderData; +}; + +#endif + diff --git a/editarchiveitemdialog.cpp b/editarchiveitemdialog.cpp index 20641a5..b10dbb0 100644 --- a/editarchiveitemdialog.cpp +++ b/editarchiveitemdialog.cpp @@ -18,7 +18,6 @@ #include <QSplitter> #include <QApplication> #include <QModelIndex> -//#include <QLocale> #include <QTreeView> #include "editarchiveitemdialog.h" @@ -28,6 +27,8 @@ #include "covereditor.h" #include "coveritem.h" #include "fileinfomodel.h" +#include "actorwidget.h" +#include "actormodel.h" EditArchiveItemDialog::EditArchiveItemDialog(ListModel *genre, ListModel *actors, MovieModel *movies, QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f), mGenreModel(genre), mActorsModel(actors), mMovieModel(movies){ QWidget *w1 = new QWidget; @@ -36,9 +37,6 @@ EditArchiveItemDialog::EditArchiveItemDialog(ListModel *genre, ListModel *actors //movie information QLabel *l1 = new QLabel(tr("Movie information")); w1Layout->addWidget(l1); - /*mMovieInfo = new QTextEdit; - mMovieInfo->setReadOnly(true); - mMovieInfo->setFont(QFont("Courier new"));*/ mMovieInfo = new QTreeView; mFileInfoModel = new FileInfoModel; mMovieInfo->setModel(mFileInfoModel); @@ -46,26 +44,12 @@ EditArchiveItemDialog::EditArchiveItemDialog(ListModel *genre, ListModel *actors //actors QLabel *l2 = new QLabel(tr("Select actors")); - mActors = new QComboBox; - mActors->setModel(mActorsModel); QHBoxLayout *actorsLayout = new QHBoxLayout; + mActorsDisplay = new ActorWidget; + mCurrentActors = new ActorModel; actorsLayout->addWidget(l2); - actorsLayout->addWidget(mActors); - w1Layout->addLayout(actorsLayout); - mActorsDisplay = new QTextEdit; - mActorsDisplay->setReadOnly(true); - mActorsDisplay->setFont(QFont("Courier new")); w1Layout->addWidget(mActorsDisplay); - QHBoxLayout *actorButtons = new QHBoxLayout; - mAddActor = new QPushButton(tr("&Add Actor")); - connect(mAddActor, SIGNAL(clicked()), this, SLOT(addActor())); - mRemoveActor = new QPushButton(tr("&Remove Actor")); - connect(mRemoveActor, SIGNAL(clicked()), this, SLOT(removeActor())); - actorButtons->addStretch(); - actorButtons->addWidget(mAddActor); - actorButtons->addWidget(mRemoveActor); - w1Layout->addLayout(actorButtons); - + //genre QLabel *l3 = new QLabel(tr("Select genre")); mGenre = new QComboBox; @@ -155,23 +139,14 @@ void EditArchiveItemDialog::setMovie(const QModelIndex &movie){ return; } mMovieId = movie.data(MovieModel::IdRole).toInt(); - mActorMap = movie.data(MovieModel::ActorsMap).value<QHash<QString, QVariant> >(); + QHash<QString, QVariant> actorMap = movie.data(MovieModel::ActorsMap).value<QHash<QString, QVariant> >(); + for(QHash<QString, QVariant>::const_iterator it = actorMap.constBegin(); it != actorMap.constEnd(); ++it){ + mActorsDisplay->addActor(it.key()); + } mCovers = movie.data(MovieModel::CoverRole).toList(); - setActors(); setMovieInfo(movie); } -void EditArchiveItemDialog::setActors(){ - QString html("<html><body style=\"color:#CD0003\"><ul>"); - QHash<QString, QVariant>::const_iterator it = mActorMap.constBegin(); - while(it != mActorMap.constEnd()){ - html.append(QString("<li>%1</li>").arg(it.key())); - ++it; - } - html.append("</ul></body></html>"); - mActorsDisplay->setHtml(html); -} - void EditArchiveItemDialog::setMovieInfo(const QModelIndex &movie){ QModelIndex idx = mMovieModel->index(movie.row(), MovieItem::Title, QModelIndex()); mTitle->setText(idx.data(MovieModel::TitleBaseRole).toString()); @@ -193,40 +168,20 @@ void EditArchiveItemDialog::setMovieInfo(const QModelIndex &movie){ mMovieInfo->expandAll(); } -void EditArchiveItemDialog::addActor(){ - QString currentText = mActors->currentText(); - QModelIndex idx = mActorsModel->index(currentText); - if(idx.isValid()){ - int id = idx.data(ListModel::IdRole).toInt(); - mActorMap.insert(currentText, id); - setActors(); - } -} - void EditArchiveItemDialog::addActor(const QString &actor){ - int idx = mActors->findText(actor); - if(idx != -1){ - mActors->setCurrentIndex(idx); - addActor(); - } -} - -void EditArchiveItemDialog::removeActor(){ - QString currentText = mActors->currentText(); - if(mActorMap.contains(currentText)){ - mActorMap.remove(currentText); - setActors(); - } + mActorsDisplay->addActor(actor); } void EditArchiveItemDialog::updateMovie(){ - QHash<QString, QVariant>::const_iterator it = mActorMap.constBegin(); - QList<QVariant> actors; - while(it != mActorMap.constEnd()){ - actors << it.value(); - ++it; + QStringList actors = mActorsDisplay->actors(); + QList<QVariant> actorIds; + foreach(QString a, actors){ + QModelIndex idx = mActorsModel->index(a); + if(idx.isValid()){ + actorIds << idx.data(ListModel::IdRole); + } } - mMovieModel->setActors(mMovieId, actors); + mMovieModel->setActors(mMovieId, actorIds); QString genreName = mGenre->currentText(); QModelIndex genreIdx = mGenreModel->index(genreName); QModelIndex genreMovieIndex = mMovieModel->index(mMovieId, MovieItem::Genre); diff --git a/editarchiveitemdialog.h b/editarchiveitemdialog.h index c436c6c..2cf4a2a 100644 --- a/editarchiveitemdialog.h +++ b/editarchiveitemdialog.h @@ -22,6 +22,8 @@ class QPushButton; class QModelIndex; class QTreeView; class FileInfoModel; +class ActorWidget; +class ActorModel; class EditArchiveItemDialog : public QDialog { Q_OBJECT @@ -31,33 +33,27 @@ class EditArchiveItemDialog : public QDialog { void setMovie(const QModelIndex &movie); private slots: - void addActor(); void addActor(const QString &actor); - void removeActor(); void updateMovie(); private: - void setActors(); void setMovieInfo(const QModelIndex &movie); ListModel *mGenreModel; ListModel *mActorsModel; + ActorModel *mCurrentActors; FileInfoModel *mFileInfoModel; MovieModel *mMovieModel; QComboBox *mGenre; QComboBox *mActors; - //QTextEdit *mMovieInfo; QTreeView *mMovieInfo; - QTextEdit *mActorsDisplay; + ActorWidget *mActorsDisplay; QSpinBox *mQuality; QSpinBox *mSeriesNo; QSpinBox *mPartNo; QSpinBox *mDvd; QPushButton *mUpdate; QPushButton *mClose; - QPushButton *mAddActor; - QPushButton *mRemoveActor; QLineEdit *mTitle; - QHash<QString, QVariant> mActorMap; QList<QVariant> mCovers; int mMovieId; }; @@ -34,7 +34,8 @@ statisticsdialog.cpp \ actorwidget.cpp \ actormodel.cpp \ fileinfoitem.cpp \ -fileinfomodel.cpp +fileinfomodel.cpp \ +actorcountmodel.cpp HEADERS = listitem.h \ listmodel.h \ movieitem.h \ @@ -67,7 +68,8 @@ statisticsdialog.h \ actorwidget.h \ actormodel.h \ fileinfoitem.h \ -fileinfomodel.h +fileinfomodel.h \ +actorcountmodel.h LIBS += -lmagic LIBS += -lcryptopp INCLUDEPATH += /usr/include/cryptopp diff --git a/statisticsdialog.cpp b/statisticsdialog.cpp index 3bae0eb..5a48f63 100644 --- a/statisticsdialog.cpp +++ b/statisticsdialog.cpp @@ -19,15 +19,36 @@ #include <QLinearGradient> #include <QPushButton> #include <QSqlError> +#include <QTreeView> +#include <QSortFilterProxyModel> #include "statisticsdialog.h" +#include "actorcountmodel.h" StatisticsDialog::StatisticsDialog(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f){ QVBoxLayout *mainLayout = new QVBoxLayout; mTab = new QTabWidget; + + // quality distribution QualityStats * qs = new QualityStats; mTab->addTab(qs, tr("Quality Distribution")); mainLayout->addWidget(mTab); + + // actor count + QWidget *actorWidget = new QWidget; + QHBoxLayout *actorLayout = new QHBoxLayout; + QTreeView *actorView = new QTreeView; + actorView->setRootIsDecorated(false); + ActorCountModel *aModel = new ActorCountModel; + QSortFilterProxyModel *proxy = new QSortFilterProxyModel(this); + proxy->setSourceModel(aModel); + actorView->setModel(proxy); + actorView->resizeColumnToContents(0); + actorLayout->addWidget(actorView); + actorWidget->setLayout(actorLayout); + actorView->setSortingEnabled(true); + mTab->addTab(actorWidget, tr("Actor overview")); + QHBoxLayout *buttonLayout = new QHBoxLayout; buttonLayout->setAlignment(Qt::AlignHCenter); mOk = new QPushButton(tr("Ok")); |