/* 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 #include #include #include #include #include #include #include "dbanalyzer.h" #include "smtreemodel.h" #include "smtreeitem.h" #include "smglobals.h" #include "smtreeview.h" DbEmptyDialog::DbEmptyDialog(const QString &caption, QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f){ mDb = QSqlDatabase::database("treedb"); mDb.open(); QString c = QString(tr("Unused %1")).arg(caption); QLabel *l = new QLabel(c); mView = new SmTreeView(this); mModel = new QStandardItemModel; mView->setModel(mModel); mDelete = new QPushButton(tr("Delete")); connect(mDelete, SIGNAL(clicked()), this, SLOT(deleteItem())); mClose = new QPushButton(tr("Close")); connect(mClose, SIGNAL(clicked()), this, SLOT(accept())); QHBoxLayout *buttonLayout = new QHBoxLayout; buttonLayout->addWidget(mDelete); buttonLayout->addStretch(); buttonLayout->addWidget(mClose); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(l); mainLayout->addWidget(mView); mainLayout->addLayout(buttonLayout); setLayout(mainLayout); } QItemSelectionModel *DbEmptyDialog::selectionModel(){ return mView->selectionModel(); } void DbEmptyDialog::populate(){ return; } void DbEmptyDialog::deleteItem(){ return; } EmptyActorsDialog::EmptyActorsDialog(const QString &caption, QWidget *parent, Qt::WindowFlags f) : DbEmptyDialog(caption, parent, f){} void EmptyActorsDialog::populate(){ model()->clear(); model()->setHorizontalHeaderLabels(QStringList() << tr("Name") << tr("Count") << tr("Id")); QSqlQuery q("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", db()); while(q.next()){ QStandardItem *nameItem = new QStandardItem(q.value(0).toString()); nameItem->setIcon(QIcon(":/chastity_belt.png")); QStandardItem *idItem = new QStandardItem(QString::number(q.value(1).toInt())); idItem->setData(q.value(1)); QStandardItem *countItem = new QStandardItem(QString::number(q.value(2).toInt())); countItem->setData(q.value(2)); model()->appendRow(QList() << nameItem << countItem << idItem); } } void EmptyActorsDialog::deleteItem(){ QModelIndexList sel = selectionModel()->selectedRows(2); if(sel.isEmpty()){ return; } QSqlQuery deleteQ(db()); deleteQ.prepare("DELETE FROM actors WHERE iactors_id = :id"); foreach(QModelIndex i, sel){ QStandardItem *item = model()->itemFromIndex(i); deleteQ.bindValue(":id", item->data()); deleteQ.exec(); } populate(); } EmptyGenresDialog::EmptyGenresDialog(const QString &caption, QWidget *parent, Qt::WindowFlags f) : DbEmptyDialog(caption, parent, f){} void EmptyGenresDialog::populate(){ model()->clear(); model()->setHorizontalHeaderLabels(QStringList() << tr("Name") << tr("Count") << tr("Id")); QSqlQuery q("SELECT genres.tgenrename, genres.igenres_id, COUNT(seriesparts_genremap.igenres_id) FROM genres LEFT JOIN seriesparts_genremap ON genres.igenres_id = seriesparts_genremap.igenres_id WHERE seriesparts_genremap.igenres_id IS NULL GROUP BY genres.igenres_id, genres.tgenrename ORDER BY genres.tgenrename", db()); while(q.next()){ QStandardItem *nameItem = new QStandardItem(q.value(0).toString()); nameItem->setIcon(QIcon(":/chastity_belt.png")); QStandardItem *idItem = new QStandardItem(QString::number(q.value(1).toInt())); idItem->setData(q.value(1)); QStandardItem *countItem = new QStandardItem(QString::number(q.value(2).toInt())); countItem->setData(q.value(2)); model()->appendRow(QList() << nameItem << countItem << idItem); } } void EmptyGenresDialog::deleteItem(){ QModelIndexList sel = selectionModel()->selectedRows(2); if(sel.isEmpty()){ return; } QSqlQuery deleteQ(db()); deleteQ.prepare("DELETE FROM genres WHERE igenres_id = :id"); foreach(QModelIndex i, sel){ QStandardItem *item = model()->itemFromIndex(i); deleteQ.bindValue(":id", item->data()); deleteQ.exec(); } populate(); } EmptySeriesDialog::EmptySeriesDialog(const QString &caption, QWidget *parent, Qt::WindowFlags f) : DbEmptyDialog(caption, parent, f){} void EmptySeriesDialog::populate(){ model()->clear(); model()->setHorizontalHeaderLabels(QStringList() << tr("Name") << tr("Count") << tr("Id")); QSqlQuery q("SELECT series.tseries_name, COUNT(seriesparts.iseries_id), series.iseries_id FROM series LEFT JOIN seriesparts ON series.iseries_id = seriesparts.iseries_id GROUP BY 1,3 HAVING COUNT(seriesparts.iseries_id) = 0 ORDER BY series.tseries_name ASC", db()); while(q.next()){ QStandardItem *nameItem = new QStandardItem(q.value(0).toString()); nameItem->setIcon(QIcon(":/chastity_belt.png")); QStandardItem *countItem = new QStandardItem(QString::number(q.value(1).toInt())); countItem->setData(q.value(1)); QStandardItem *idItem = new QStandardItem(QString::number(q.value(2).toInt())); idItem->setData(q.value(2)); model()->appendRow(QList() << nameItem << countItem << idItem); } } void EmptySeriesDialog::deleteItem(){ QModelIndexList sel = selectionModel()->selectedRows(2); if(sel.isEmpty()){ return; } QSqlQuery deleteQ(db()); deleteQ.prepare("DELETE FROM series WHERE iseries_id = :id"); foreach(QModelIndex i, sel){ QStandardItem *item = model()->itemFromIndex(i); deleteQ.bindValue(":id", item->data()); deleteQ.exec(); } populate(); } EmptyPartsDialog::EmptyPartsDialog(const QString &caption, QWidget *parent, Qt::WindowFlags f) : DbEmptyDialog(caption, parent, f){} void EmptyPartsDialog::populate(){ model()->clear(); model()->setHorizontalHeaderLabels(QStringList() << tr("Name") << tr("Count") << tr("Id")); QSqlQuery q("SELECT seriesparts.iseriesparts_id, series.tseries_name, seriesparts.iseriespart, seriesparts.tsubtitle, COUNT(files.ifiles_id) FROM seriesparts LEFT JOIN files ON files.iseriespart_id = seriesparts.iseriesparts_id INNER JOIN series ON series.iseries_id = seriesparts.iseries_id GROUP BY 1,2,3,4 HAVING COUNT(files.ifiles_id) = 0 ORDER BY series.tseries_name ASC", db()); while(q.next()){ QString sName = q.value(1).toString(); int part = q.value(2).toInt(); if(part > 0){ sName.append(QString(" %1").arg(QString::number(part))); } if(!q.value(3).toString().isEmpty()){ sName.append(QString(" - %1").arg(q.value(3).toString())); } QStandardItem *nameItem = new QStandardItem(sName); nameItem->setIcon(QIcon(":/chastity_belt.png")); QStandardItem *countItem = new QStandardItem(QString::number(q.value(4).toInt())); countItem->setData(q.value(4)); QStandardItem *idItem = new QStandardItem(QString::number(q.value(0).toInt())); idItem->setData(q.value(0)); model()->appendRow(QList() << nameItem << countItem << idItem); } } void EmptyPartsDialog::deleteItem(){ QModelIndexList sel = selectionModel()->selectedRows(2); if(sel.isEmpty()){ return; } QSqlQuery deleteQ(db()); deleteQ.prepare("DELETE FROM seriesparts WHERE iseriesparts_id = :id"); foreach(QModelIndex i, sel){ QStandardItem *item = model()->itemFromIndex(i); deleteQ.bindValue(":id", item->data()); deleteQ.exec(); } populate(); }