diff options
-rw-r--r-- | dbanalyzer.cpp | 100 | ||||
-rw-r--r-- | dbanalyzer.h | 14 | ||||
-rw-r--r-- | shemov.cpp | 23 | ||||
-rw-r--r-- | shemov.h | 1 |
4 files changed, 124 insertions, 14 deletions
diff --git a/dbanalyzer.cpp b/dbanalyzer.cpp index 10def75..22478c5 100644 --- a/dbanalyzer.cpp +++ b/dbanalyzer.cpp @@ -15,8 +15,6 @@ #include <QTableWidget> #include <QModelIndex> -#include <QDebug> - #include "dbanalyzer.h" #include "smtreemodel.h" #include "smtreeitem.h" @@ -30,7 +28,7 @@ DbAnalyzerDialog::DbAnalyzerDialog(QWidget *parent, Qt::WindowFlags f) : QDialog // no actors QWidget *noActorsT = new QWidget; - QStringList noActorsHeaders = QStringList() << tr("Series") << tr("Part/Subtitle") << tr("Seriespart Id") << tr("Series Id") << tr("Seriespart"); + QStringList noActorsHeaders = QStringList() << tr("Series") << tr("Part/Subtitle") << tr("Series Part") << tr("Seriespart Id") << tr("Series Id") << tr("Seriespart"); mNoActorsV = new QTreeView; mNoActorsM = new SmTreeModel(noActorsHeaders, this); mNoActorsV->setModel(mNoActorsM); @@ -39,6 +37,7 @@ DbAnalyzerDialog::DbAnalyzerDialog(QWidget *parent, Qt::WindowFlags f) : QDialog mNoActorsV->setColumnHidden(2, true); mNoActorsV->setColumnHidden(3, true); mNoActorsV->setColumnHidden(4, true); + mNoActorsV->setColumnHidden(5, true); mNoActorsV->setEditTriggers(QTreeView::NoEditTriggers); mNoActorsV->setSelectionBehavior(QAbstractItemView::SelectRows); mNoActorsV->setSelectionMode(QAbstractItemView::SingleSelection); @@ -46,25 +45,46 @@ DbAnalyzerDialog::DbAnalyzerDialog(QWidget *parent, Qt::WindowFlags f) : QDialog connect(mNoActorsV, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(noActorsDoubleClicked(QModelIndex))); noActorsT->setLayout(noActorsL); + //stray actors + QWidget *strayActorsT = new QWidget; + QStringList strayActorsHeaders = QStringList() << tr("Actor") << tr("Actor Id") << tr("Count"); + mStrayActorsV = new QTreeView; + mStrayActorsM = new SmTreeModel(strayActorsHeaders, this); + mStrayActorsV->setModel(mStrayActorsM); + QVBoxLayout *strayActorsL = new QVBoxLayout; + strayActorsL->addWidget(mStrayActorsV); + mStrayActorsV->setColumnHidden(1, true); + mStrayActorsV->setEditTriggers(QTreeView::NoEditTriggers); + mStrayActorsV->setSelectionBehavior(QAbstractItemView::SelectRows); + mStrayActorsV->setSelectionMode(QAbstractItemView::ExtendedSelection); + mStrayActorsV->setAlternatingRowColors(true); + strayActorsT->setLayout(strayActorsL); + //buttons mCancel = new QPushButton(tr("Cancel")); connect(mCancel, SIGNAL(clicked()), this, SLOT(cancelAnalyzer())); mClose = new QPushButton(tr("Close")); connect(mClose, SIGNAL(clicked()), this, SLOT(accept())); + mDelete = new QPushButton(tr("Delete...")); + mDelete->setEnabled(false); + connect(mDelete, SIGNAL(clicked()), this, SLOT(deleteItems())); //setup dialog mTab->addTab(noActorsT, tr("No Actors")); + mTab->addTab(strayActorsT, tr("Stray actors")); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(mTab); QHBoxLayout *buttonLayout = new QHBoxLayout; - buttonLayout->addStretch(); buttonLayout->addWidget(mCancel); + buttonLayout->addStretch(); + buttonLayout->addWidget(mDelete); buttonLayout->addWidget(mClose); mainLayout->addLayout(buttonLayout); setLayout(mainLayout); setMinimumWidth(500); //get things going + connect(mTab, SIGNAL(currentChanged(int)), this, SLOT(tabChanged(int))); connect(mAnalyzer, SIGNAL(started()), this, SLOT(analyzerStarted())); connect(mAnalyzer, SIGNAL(finished()), this, SLOT(analyzerFinished())); mAnalyzer->start(); @@ -82,7 +102,8 @@ void DbAnalyzerDialog::analyzerStarted(){ void DbAnalyzerDialog::analyzerFinished(){ mCancel->setEnabled(false); mClose->setEnabled(true); - populateNoActors(); + populate(mNoActorsV, mNoActorsM, mAnalyzer->noActors()); + populate(mStrayActorsV, mStrayActorsM, mAnalyzer->strayActors()); } void DbAnalyzerDialog::noActorsDoubleClicked(const QModelIndex &idx){ @@ -94,29 +115,63 @@ void DbAnalyzerDialog::noActorsDoubleClicked(const QModelIndex &idx){ emit partClicked(seriesPartIdx.data().toInt(), seriesIdx.data().toInt()); } -void DbAnalyzerDialog::populateNoActors(){ - const int columns = 4; - QList<QList<QVariant> > noActors = mAnalyzer->noActors(); +void DbAnalyzerDialog::deleteItems(){ + QTreeView *view = 0; + int deleteMode; + switch(mTab->currentIndex()){ + case 0: + return; + break; + case 1: + view = mStrayActorsV; + deleteMode = Actors; + break; + default: + view = 0; + break; + } + Q_ASSERT(view); + QModelIndexList selected = view->selectionModel()->selectedRows(1); + QList<int> ids; + foreach(QModelIndex i, selected){ + ids << i.data().toInt(); + } + emit delItems(deleteMode, ids); +} + +void DbAnalyzerDialog::tabChanged(int index){ + mDelete->setEnabled(index != 0); +} + +void DbAnalyzerDialog::populate(QTreeView *view, SmTreeModel *model, const QList<QList<QVariant> > &data){ + const int columns = data.first().count(); + if(columns == 0){ + return; + } SmTreeItem *root = new SmTreeItem(columns); - foreach(QList<QVariant> l, noActors){ + foreach(QList<QVariant> l, data){ SmTreeItem *child = new SmTreeItem(l, root); root->appendChild(child); } - mNoActorsM->setRoot(root); - mNoActorsV->resizeColumnToContents(0); + model->setRoot(root); + view->resizeColumnToContents(0); } DbAnalyzer::DbAnalyzer(QObject *parent) : QThread(parent), mCanceled(false), mStatus(Fail) { - mDb = QSqlDatabase::cloneDatabase(QSqlDatabase::database("treedb"), "analyzerDB"); + mDb = QSqlDatabase::cloneDatabase(QSqlDatabase::database("treedb"), "analyzerDb"); mDb.open(); mStatus = mDb.isOpen() ? Ok : Fail; mNoActorQuery = new QSqlQuery(mDb); mNoActorQuery->prepare("SELECT series.tseries_name, seriesparts.iseriespart, seriesparts.tsubtitle, series.iseries_id, seriesparts.iseriesparts_id FROM series, seriesparts LEFT JOIN seriesparts_actormap ON seriesparts.iseriesparts_id = seriesparts_actormap.iseriesparts_id WHERE iactors_id IS NULL AND seriesparts.iseries_id = series.iseries_id ORDER BY tseries_name"); + mStrayActorsQuery = new QSqlQuery(mDb); + mStrayActorsQuery->prepare("SELECT actors.tactorname, actors.iactors_id, COUNT(seriesparts_actormap.iactors_id) FROM actors LEFT JOIN seriesparts_actormap ON actors.iactors_id = seriesparts_actormap.iactors_id WHERE seriesparts_actormap.iactors_id IS NULL GROUP BY actors.iactors_id, actors.tactorname ORDER BY actors.tactorname;"); } DbAnalyzer::~DbAnalyzer(){ delete mNoActorQuery; + delete mStrayActorsQuery; mDb.close(); + mDb = QSqlDatabase(); QSqlDatabase::removeDatabase("analyzerDb"); } @@ -127,6 +182,7 @@ void DbAnalyzer::setCancel(bool canceled){ void DbAnalyzer::run(){ noActorsCheck(); + strayActorsCheck(); } void DbAnalyzer::noActorsCheck(){ @@ -149,5 +205,23 @@ void DbAnalyzer::noActorsCheck(){ res << mNoActorQuery->value(1) << mNoActorQuery->value(2) << mNoActorQuery->value(3) << mNoActorQuery->value(4); mNoActorR << res; } - emit message(tr("Done!")); + emit message(tr("Done fetching movies")); +} + +void DbAnalyzer::strayActorsCheck(){ + if(!mStrayActorsQuery->exec()){ + QMutexLocker m(&mStatusMutex); + mStatus = Fail; + return; + } + emit message(tr("Fetching stray actors")); + while(mStrayActorsQuery->next()){ + if(mCanceled){ + break; + } + QList<QVariant> res; + res << mStrayActorsQuery->value(0) << mStrayActorsQuery->value(1) << mStrayActorsQuery->value(2); + mStrayActorR << res; + } + emit message(tr("Done fetching stray actors")); } diff --git a/dbanalyzer.h b/dbanalyzer.h index 2005c85..b300c3a 100644 --- a/dbanalyzer.h +++ b/dbanalyzer.h @@ -26,24 +26,31 @@ class DbAnalyzer; class DbAnalyzerDialog : public QDialog { Q_OBJECT public: + enum DeleteMode { Actors, Genres }; explicit DbAnalyzerDialog(QWidget *parent = 0, Qt::WindowFlags f = 0); signals: void partClicked(int seriesPartId, int seriesId); + void delItems(int mode, QList<int> &ids); private slots: void cancelAnalyzer(); void analyzerStarted(); void analyzerFinished(); void noActorsDoubleClicked(const QModelIndex &); + void deleteItems(); + void tabChanged(int index); private: - void populateNoActors(); + void populate(QTreeView *view ,SmTreeModel *model, const QList<QList<QVariant> > &data); QTabWidget *mTab; QTreeView *mNoActorsV; + QTreeView *mStrayActorsV; SmTreeModel *mNoActorsM; + SmTreeModel *mStrayActorsM; QPushButton *mClose; QPushButton *mCancel; + QPushButton *mDelete; DbAnalyzer *mAnalyzer; }; @@ -55,6 +62,7 @@ class DbAnalyzer : public QThread { ~DbAnalyzer(); int status() { return mStatus; } const QList<QList<QVariant> > noActors() { return mNoActorR; } + const QList<QList<QVariant> > strayActors() { return mStrayActorR; } public slots: void setCancel(bool canceled); @@ -67,10 +75,14 @@ class DbAnalyzer : public QThread { private: void noActorsCheck(); + void strayActorsCheck(); QSqlDatabase mDb; QSqlQuery *mNoActorQuery; + QSqlQuery *mStrayActorsQuery; QList<QList<QVariant> > mNoActorR; + QList<QList<QVariant> > mStrayActorR; QMutex mCancelMutex; + QMutex mStatusMutex; bool mCanceled; int mStatus; }; @@ -51,6 +51,7 @@ #include "filestreemodel.h" #include "consistencycheck.h" #include "mappingtableeditor.h" +#include "mappingtablemodel.h" #include "dbanalyzer.h" SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, flags), mOpenWithGroupFS(0), mOpenWithGroupAV(0) { @@ -986,9 +987,31 @@ void SheMov::checkConsistency(){ void SheMov::analyzeDb(){ DbAnalyzerDialog d(this); connect(&d, SIGNAL(partClicked(int, int)), mATree, SLOT(selectMoviePart(int, int))); + connect(&d, SIGNAL(delItems(int,QList<int>&)), this, SLOT(analyzeDelete(int,QList<int>&))); d.exec(); } +void SheMov::analyzeDelete(int mode, QList<int> &ids){ + QString message = QString(tr("Really delete %1 items?")).arg(QString::number(ids.count())); + int res = QMessageBox::question(this, tr("Delete items"), message, QMessageBox::Yes | QMessageBox::No); + if(res != QMessageBox::Yes){ + return; + } + MappingTableModel *model = 0; + switch(mode){ + case DbAnalyzerDialog::Actors: + model = qobject_cast<MappingTableModel*>(SmGlobals::instance()->model("actors")); + break; + case DbAnalyzerDialog::Genres: + model = qobject_cast<MappingTableModel*>(SmGlobals::instance()->model("genres")); + break; + default: + ; + } + Q_ASSERT(model); + model->deleteItems(ids); +} + void SheMov::toggleHover(QObject *object){ QAction *action = qobject_cast<QAction*>(object); if(action){ @@ -47,6 +47,7 @@ class SheMov : public QMainWindow { void setSize(qint64 size); void checkConsistency(); void analyzeDb(); + void analyzeDelete(int mode, QList<int> &ids); void toggleHover(QObject *object); void checkMount(bool mounted); void toggleFilterGroup(bool checked); |