summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArno <am@disconnect.de>2014-04-04 16:13:24 +0200
committerArno <am@disconnect.de>2014-04-04 16:13:24 +0200
commit78c36ad6caab4a6c22bc95ee1f983ea841416ab9 (patch)
treeecbfd36fc3852c92d87570a2b7172d22473aa44c
parentfedc8437f088a666462f21858f82733d2aa33761 (diff)
downloadSheMov-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.cpp40
-rw-r--r--archivemodel.h2
-rw-r--r--archiveview.cpp30
-rw-r--r--archiveview.h1
-rw-r--r--shemov.cpp6
-rw-r--r--shemov.h1
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!"));
diff --git a/shemov.cpp b/shemov.cpp
index 34b4670..1dc098c 100644
--- a/shemov.cpp
+++ b/shemov.cpp
@@ -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());
diff --git a/shemov.h b/shemov.h
index 4629be6..b242d5b 100644
--- a/shemov.h
+++ b/shemov.h
@@ -147,6 +147,7 @@ class SheMov : public QMainWindow {
QAction *mArchiveViewAddCoversA;
QAction *mArchiveViewExpandAllA;
QAction *mArchiveViewCollapseAllA;
+ QAction *mArchiveViewDeleteA;
QActionGroup *mArchiveFilesAG;
//ArchiveBrowser