diff options
author | Arno <am@disconnect.de> | 2014-04-04 16:13:24 +0200 |
---|---|---|
committer | Arno <am@disconnect.de> | 2014-04-04 16:13:24 +0200 |
commit | 78c36ad6caab4a6c22bc95ee1f983ea841416ab9 (patch) | |
tree | ecbfd36fc3852c92d87570a2b7172d22473aa44c | |
parent | fedc8437f088a666462f21858f82733d2aa33761 (diff) | |
download | SheMov-78c36ad6caab4a6c22bc95ee1f983ea841416ab9.tar.gz SheMov-78c36ad6caab4a6c22bc95ee1f983ea841416ab9.tar.bz2 SheMov-78c36ad6caab4a6c22bc95ee1f983ea841416ab9.zip |
Delete SeriesPart
Make it possible to delete a SeriesPart. This may happen if eg. you
download the same clip/movie with a better quality.
-rw-r--r-- | archivemodel.cpp | 40 | ||||
-rw-r--r-- | archivemodel.h | 2 | ||||
-rw-r--r-- | archiveview.cpp | 30 | ||||
-rw-r--r-- | archiveview.h | 1 | ||||
-rw-r--r-- | shemov.cpp | 6 | ||||
-rw-r--r-- | shemov.h | 1 |
6 files changed, 80 insertions, 0 deletions
diff --git a/archivemodel.cpp b/archivemodel.cpp index 3fcd34e..0e29c37 100644 --- a/archivemodel.cpp +++ b/archivemodel.cpp @@ -507,6 +507,34 @@ void ArchiveModel::addCovers(int partId, const QStringList covers){ } } +bool ArchiveModel::deleteSeriesPart(int partId){ + QSqlQuery filesQ(mDb); + filesQ.prepare("SELECT cmd5sum,tfilename FROM files WHERE iseriespart_id = :id"); + filesQ.bindValue(":id", partId); + QStringList fileNames; + if(filesQ.exec()){ + while(filesQ.next()){ + QString md5 = filesQ.value(0).toString(); + QString fn = filesQ.value(1).toString(); + fileNames << Helper::createArchivePath(fn, md5); + } + bool success = true; + foreach(QString f, fileNames){ + if(!QFile::remove(f)){ + success = false; + break; + } + } + if(success){ + QSqlQuery deleteQ(mDb); + deleteQ.prepare("DELETE FROM seriesparts WHERE iseriesparts_id = :id"); + deleteQ.bindValue(":id", partId); + return deleteQ.exec(); + } + } + return false; +} + QStringList ArchiveModel::allSources() const{ QSqlQuery sQ("SELECT DISTINCT(tsourcemedium) FROM metadata ORDER BY tsourcemedium ASC", mDb); QStringList retval; @@ -914,6 +942,18 @@ void ArchiveFilesModel::populate(const QSet<int> &seriesPartIds){ setRoot(root); } +QStringList ArchiveFilesModel::filesForSeriespart(int seriesPartId) const{ + QStringList retval; + QSqlQuery q(mDb); + q.prepare("SELECT tfilename FROM files where iseriespart_id = :id ORDER BY tfilename DESC"); + q.bindValue(":id", seriesPartId); + q.exec(); + while(q.next()){ + retval.append(q.value(0).toString()); + } + return retval; +} + void ArchiveFilesModel::refresh(){ populate(mSeriesPartIds); } diff --git a/archivemodel.h b/archivemodel.h index e4cd571..8abf60c 100644 --- a/archivemodel.h +++ b/archivemodel.h @@ -53,6 +53,7 @@ class ArchiveModel : public SmTreeModel { bool setPartNo(int partId, int newPartId, const QString &subtitle); bool setFavorite(int partId, bool favorite); void addCovers(int partId, const QStringList covers); + bool deleteSeriesPart(int partId); signals: void needRefresh(); @@ -100,6 +101,7 @@ class ArchiveFilesModel : public SmTreeModel { int nextDvd() const; bool isMovie(const QModelIndex &idx) const; void populate(const QSet<int> &seriesPartIds); + QStringList filesForSeriespart(int seriesPartId) const; public slots: void refresh(); diff --git a/archiveview.cpp b/archiveview.cpp index 8df9bb6..1d49db0 100644 --- a/archiveview.cpp +++ b/archiveview.cpp @@ -395,6 +395,36 @@ void ArchiveTree::markAsFavorite(){ c->archiveTreeModel()->setFavorite(pId, !fav); } +void ArchiveTree::deleteFromTree(){ + QModelIndex idx = firstSelected(); + if(!idx.isValid()){ + return; + } + int type = idx.data(ArchiveModel::TypeRole).toInt(); + if(type == ArchiveModel::SeriesPartNode){ + ArchiveController *c = SmGlobals::instance()->archiveController(); + ArchiveFilesModel *fm = c->archiveFilesModel(); + int seriesPartId = idx.data(ArchiveModel::SeriesPartIdRole).toInt(); + QStringList files = fm->filesForSeriespart(seriesPartId); + if(!files.isEmpty()){ + QString msg = tr("<b>This action will permanently delete the following files:</b><ul>"); + foreach(QString f, files){ + QString fli = QString("<li>%1</li>").arg(f); + msg.append(fli); + } + msg.append("</ul>"); + msg.append(tr("<p>Continue?</p>")); + int answer = QMessageBox::warning(0, tr("Question"), msg, QMessageBox::Yes | QMessageBox::No); + if(answer == QMessageBox::Yes){ + ArchiveModel *am = c->archiveTreeModel(); + if(am->deleteSeriesPart(seriesPartId)){ + am->refresh(); + } + } + } + } +} + void ArchiveTree::impossible(const QString msg){ QMessageBox::critical(this, tr("Error"), msg); } diff --git a/archiveview.h b/archiveview.h index ce0732a..4b1308c 100644 --- a/archiveview.h +++ b/archiveview.h @@ -93,6 +93,7 @@ class ArchiveTree : public SmTreeView { void editMetadata(); void editSeriesPart(); void markAsFavorite(); + void deleteFromTree(); private: void impossible(const QString msg = tr("Unable to perform function!")); @@ -628,6 +628,10 @@ void SheMov::createActions(){ mArchiveViewMarkFavA = new QAction(tr("Mark as favorite"), this); mArchiveViewMarkFavA->setData(ArchiveModel::SeriesPartNode); connect(mArchiveViewMarkFavA, SIGNAL(triggered()), c->archiveTree(), SLOT(markAsFavorite())); + //delete from Tree + mArchiveViewDeleteA = new QAction(QIcon(":/delete.png"), tr("Delete..."), this); + mArchiveViewDeleteA->setData(ArchiveModel::SeriesPartIdRole); + connect(mArchiveViewDeleteA, SIGNAL(triggered()), c->archiveTree(), SLOT(deleteFromTree())); // ArchiveFiles actions <- ArchiveView! // play selected @@ -853,6 +857,8 @@ void SheMov::createMenus(){ c->addActionForTree(mArchiveViewExpandAllA); c->addActionForTree(mArchiveViewCollapseAllA); c->addActionForTree(createSeparator()); + c->addActionForTree(mArchiveViewDeleteA); + c->addActionForTree(createSeparator()); c->addActionForTree(mArchiveViewRefreshA); QMenu *archiveTreeM = new QMenu(tr("Archive"), this); archiveTreeM->addActions(c->archiveTree()->actions()); @@ -147,6 +147,7 @@ class SheMov : public QMainWindow { QAction *mArchiveViewAddCoversA; QAction *mArchiveViewExpandAllA; QAction *mArchiveViewCollapseAllA; + QAction *mArchiveViewDeleteA; QActionGroup *mArchiveFilesAG; //ArchiveBrowser |