diff options
-rw-r--r-- | archivetreeview.cpp | 29 | ||||
-rw-r--r-- | archivetreeview.h | 1 | ||||
-rw-r--r-- | mappingtablemodel.cpp | 44 | ||||
-rw-r--r-- | mappingtablemodel.h | 6 | ||||
-rw-r--r-- | seriestreemodel.cpp | 1 | ||||
-rw-r--r-- | shemov.cpp | 18 | ||||
-rw-r--r-- | shemov.h | 2 |
7 files changed, 99 insertions, 2 deletions
diff --git a/archivetreeview.cpp b/archivetreeview.cpp index 1ae3cc8..1d66fbe 100644 --- a/archivetreeview.cpp +++ b/archivetreeview.cpp @@ -16,6 +16,7 @@ #include <QSettings> #include <QHash> #include <QProcess> +#include <QMessageBox> #include "archivetreeview.h" #include "smglobals.h" @@ -99,6 +100,34 @@ void ArchiveTreeView::setFileViewMode(int mode){ constructWindowTitle(); } +void ArchiveTreeView::cleanDatabase(const QString &table){ + MappingTableModel *model = 0; + if(table == "genres"){ + model = mGenresModel; + }else if(table == "actors"){ + model = mActorsModel; + } + Q_ASSERT(model); + QHash<QString, int> zeroUsers = model->zeroUsers(); + if(zeroUsers.isEmpty()){ + QMessageBox::information(this, tr("Message"), tr("Nothing to clean up!")); + return; + } + QString message = QString(tr("<p>Really delete these items from %1?<p>")).arg(table); + message.append("<ul>"); + QStringList userNames = zeroUsers.keys(); + qSort(userNames); + foreach(QString s, userNames){ + message.append(QString("<li>%1</li>").arg(s)); + } + message.append("</ul>"); + int answer = QMessageBox::question(this, tr("Question"), message, QMessageBox::Yes | QMessageBox::No); + if(answer == QMessageBox::Yes){ + QList<int> ids = zeroUsers.values(); + model->deleteItems(ids); + } +} + void ArchiveTreeView::currentChanged(const QItemSelection &selected, const QItemSelection &deselected){ Q_UNUSED(selected); Q_UNUSED(deselected); diff --git a/archivetreeview.h b/archivetreeview.h index 24ef2f8..9ea2604 100644 --- a/archivetreeview.h +++ b/archivetreeview.h @@ -35,6 +35,7 @@ class ArchiveTreeView : public QWidget public slots: void setFileViewMode(int mode); + void cleanDatabase(const QString &table); private slots: void currentChanged(const QItemSelection &selected, const QItemSelection &deselected); diff --git a/mappingtablemodel.cpp b/mappingtablemodel.cpp index 65221e4..47e3136 100644 --- a/mappingtablemodel.cpp +++ b/mappingtablemodel.cpp @@ -39,6 +39,12 @@ MappingTableModel::MappingTableModel(QStringList &headers, const QString &table, QString mappingQuery = QString("SELECT %1 FROM %2, %3 WHERE %2.%4 = %3.%4 AND %3.iseriesparts_id = :id").arg(mNameColumnName).arg(mTable).arg(mMappingTable).arg(mIdColumnName); mMappingQuery = new QSqlQuery(mDb); mMappingQuery->prepare(mappingQuery); + QString allItemsQuery = QString("SELECT %1, %2 FROM %3").arg(mIdColumnName).arg(mNameColumnName).arg(mTable); + mAllItemsQuery = new QSqlQuery(mDb); + mAllItemsQuery->prepare(allItemsQuery); + QString itemCountQuery = QString("SELECT COUNT(*) FROM %1 WHERE %2 = :id").arg(mMappingTable).arg(mIdColumnName); + mItemCountQuery = new QSqlQuery(mDb); + mItemCountQuery->prepare(itemCountQuery); //get data populate(); @@ -51,6 +57,8 @@ MappingTableModel::~MappingTableModel(){ delete mAddMappingQuery; delete mRemoveMappingQuery; delete mMappingQuery; + delete mAllItemsQuery; + delete mItemCountQuery; mDb = QSqlDatabase(); } @@ -194,9 +202,45 @@ QList<QVariant> MappingTableModel::mappings(int seriesId){ return retval; } +QHash<QString, int> MappingTableModel::zeroUsers(){ + QHash<int, QString> items; + mAllItemsQuery->exec(); + while(mAllItemsQuery->next()){ + items.insert(mAllItemsQuery->value(0).toInt(), mAllItemsQuery->value(1).toString()); + } + QHash<QString, int> retval; + if(!items.isEmpty()){ + QList<int> ids = items.keys(); + foreach(int id, ids){ + mItemCountQuery->bindValue(":id", id); + if(mItemCountQuery->exec()){ + mItemCountQuery->first(); + int count = mItemCountQuery->value(0).toInt(); + if(count == 0){ + QString itemName = items.value(id); + retval.insert(itemName, id); + } + } + } + } + return retval; +} + +void MappingTableModel::deleteItems(const QList<int> &ids){ + if(ids.isEmpty()){ + return; + } + foreach(int id, ids){ + mDeleteItemQuery->bindValue(":id", id); + mDeleteItemQuery->exec(); + } + populate(); +} + void MappingTableModel::populate(){ QString query = QString("SELECT %1, %2 FROM %3 ORDER BY %2").arg(mIdColumnName).arg(mNameColumnName).arg(mTable); QList<QVariant> rootData; + mItemNames.clear(); rootData << QString(tr("%1 name")).arg(mTable) << tr("Id"); SmTreeItem *root = new SmTreeItem(rootData); QSqlQuery dataQuery(query, mDb); diff --git a/mappingtablemodel.h b/mappingtablemodel.h index ae64600..9d00f72 100644 --- a/mappingtablemodel.h +++ b/mappingtablemodel.h @@ -41,6 +41,10 @@ class MappingTableModel : public SmTreeModel{ bool removeMapping(int seriesId, int itemId); QList<QVariant> mappings(int seriesId); + //database maintenance + QHash<QString, int> zeroUsers(); + void deleteItems(const QList<int> &ids); + signals: void needResort(); @@ -61,6 +65,8 @@ class MappingTableModel : public SmTreeModel{ QSqlQuery *mAddMappingQuery; QSqlQuery *mRemoveMappingQuery; QSqlQuery *mMappingQuery; + QSqlQuery *mAllItemsQuery; + QSqlQuery *mItemCountQuery; }; #endif // MAPPINGTABLEMODEL_H diff --git a/seriestreemodel.cpp b/seriestreemodel.cpp index fb993bb..e25e759 100644 --- a/seriestreemodel.cpp +++ b/seriestreemodel.cpp @@ -324,6 +324,7 @@ bool SeriesTreeModel::addSeriesPart(int seriesPart, const QModelIndex &parent){ return false; } + void SeriesTreeModel::populate(){ QSqlQuery seriesQuery = QSqlQuery("SELECT iseries_id, tseries_name FROM series ORDER BY tseries_name", mDb); SmTreeItem *rootItem = new SmTreeItem(5); @@ -253,6 +253,18 @@ void SheMov::createActions(){ //File menu mPlaySelectedFSA = new QAction(tr("Play selected movies..."), this); connect(mPlaySelectedFSA, SIGNAL(triggered()), mFSWidget, SLOT(playSelected())); + mNewMovieWizardA = new QAction(tr("Archive movie..."), this); + connect(mNewMovieWizardA, SIGNAL(triggered()), this, SLOT(newMovieWizard())); + mCleanupMapper = new QSignalMapper(this); + mCleanupGroup = new QActionGroup(this); + QAction *cleanup1 = new QAction(tr("Cleanup actors..."), this); + connect(cleanup1, SIGNAL(triggered()), mCleanupMapper, SLOT(map())); + mCleanupMapper->setMapping(cleanup1, "actors"); + mCleanupGroup->addAction(cleanup1); + QAction *cleanup2 = new QAction(tr("Cleanup genres..."), this); + connect(cleanup2, SIGNAL(triggered()), mCleanupMapper, SLOT(map())); + mCleanupMapper->setMapping(cleanup2, "genres"); + mCleanupGroup->addAction(cleanup2); mQuitA = new QAction(tr("Quit"), this); mQuitA->setShortcut(tr("CTRL+q")); @@ -329,8 +341,6 @@ void SheMov::createActions(){ connect(mCollapseAllSeriesA, SIGNAL(triggered()), mATree->seriesWidget()->seriesTree(), SLOT(collapseAll())); mExpandCurrentA = new QAction(tr("Expand"), this); connect(mExpandCurrentA, SIGNAL(triggered()), mATree->seriesWidget(), SLOT(expandCurrent())); - mNewMovieWizardA = new QAction(tr("Archive movie..."), this); - connect(mNewMovieWizardA, SIGNAL(triggered()), this, SLOT(newMovieWizard())); mAddCoverA = new QAction(tr("Add cover..."), this); connect(mAddCoverA, SIGNAL(triggered()), mATree->seriesWidget(), SLOT(addCover())); @@ -369,6 +379,7 @@ void SheMov::createActions(){ mOpenWithMapperAV = new QSignalMapper(this); connect(mOpenWithMapperFS, SIGNAL(mapped(QString)), mFSWidget, SLOT(playSelected(QString))); connect(mOpenWithMapperAV, SIGNAL(mapped(QString)), mATree, SLOT(playSelected(QString))); + connect(mCleanupMapper, SIGNAL(mapped(QString)), mATree, SLOT(cleanDatabase(QString))); connect(viewMapper, SIGNAL(mapped(int)), mATree, SLOT(setFileViewMode(int))); } @@ -379,6 +390,9 @@ void SheMov::createMenus(){ fileMenu->addAction(mPlaySelectedFSA); fileMenu->addSeparator(); fileMenu->addAction(mNewMovieWizardA); + QMenu *cleanupMenu = new QMenu(tr("Clean database"), this); + cleanupMenu->addActions(mCleanupGroup->actions()); + fileMenu->addMenu(cleanupMenu); fileMenu->addSeparator(); fileMenu->addAction(mQuitA); menuBar()->addMenu(fileMenu); @@ -107,11 +107,13 @@ class SheMov : public QMainWindow { QActionGroup *mOpenWithGroupFS; QActionGroup *mOpenWithGroupAV; + QActionGroup *mCleanupGroup; //EndActions QSignalMapper *mRenameMapper; QSignalMapper *mOpenWithMapperFS; QSignalMapper *mOpenWithMapperAV; + QSignalMapper *mCleanupMapper; QMenu *mEditFSMenu; QMenu *mOpenWithMenuFS; |