summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dbanalyzer.cpp100
-rw-r--r--dbanalyzer.h14
-rw-r--r--shemov.cpp23
-rw-r--r--shemov.h1
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;
};
diff --git a/shemov.cpp b/shemov.cpp
index 1837dac..5b8b789 100644
--- a/shemov.cpp
+++ b/shemov.cpp
@@ -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){
diff --git a/shemov.h b/shemov.h
index e702427..4d61b4b 100644
--- a/shemov.h
+++ b/shemov.h
@@ -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);