summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArno <arno@disconnect.de>2018-11-09 20:23:10 +0100
committerArno <arno@disconnect.de>2018-11-09 20:23:10 +0100
commit8c932c2d21e35fe5b446f80643f3b0ecf19b177d (patch)
tree9e6fb23ee1a1a6bfd6cbca37e8c62de67b00a540
parent55b60427611f342f5890c0e6ef5e23d24e618632 (diff)
downloadSheMov-8c932c2d21e35fe5b446f80643f3b0ecf19b177d.tar.gz
SheMov-8c932c2d21e35fe5b446f80643f3b0ecf19b177d.tar.bz2
SheMov-8c932c2d21e35fe5b446f80643f3b0ecf19b177d.zip
Implement delete series
The delete button will always delete the whole series based on the series ID, no matter the view. We'll rollback the database transaction if any file can't be deleted. Start the consistency check when that happens.
-rw-r--r--moviewidget.cpp44
-rw-r--r--moviewidget.h1
2 files changed, 44 insertions, 1 deletions
diff --git a/moviewidget.cpp b/moviewidget.cpp
index d9a9d63..bf6777d 100644
--- a/moviewidget.cpp
+++ b/moviewidget.cpp
@@ -14,6 +14,7 @@
#include <QFileInfo>
#include <QProcess>
#include <QClipboard>
+#include <QMessageBox>
#include <QApplication>
#include "moviewidget.h"
@@ -50,7 +51,11 @@ void MovieWidget::setupWidget(){
QAction *forwardA = new QAction(buttplugRight, tr("Next archive selection"), this);
connect(forwardA, &QAction::triggered, [=] { forwardSelection(1); });
toolbar->addAction(forwardA);
- QAction *refreshA = new QAction(QIcon(":refresh.png"), tr("Refresh"), this);
+ toolbar->addSeparator();
+ QAction *deleteA = new QAction(QIcon(":/delete.png"), tr("Delete"), this);
+ connect(deleteA, &QAction::triggered, this, &MovieWidget::deleteSeries);
+ toolbar->addAction(deleteA);
+ QAction *refreshA = new QAction(QIcon(":/refresh.png"), tr("Refresh"), this);
connect(refreshA, &QAction::triggered, this, &MovieWidget::refresh);
toolbar->addSeparator();
toolbar->addAction(refreshA);
@@ -161,6 +166,43 @@ void MovieWidget::refresh(){
selectBy(mSelectionCB->currentText());
}
+
+void MovieWidget::deleteSeries(){
+ QModelIndexList cur = mTopView->selectionModel()->selectedRows();
+ if(cur.isEmpty()){
+ return;
+ }
+ int partId = cur.first().data(SeriesPartIdRole).toInt();
+ QStringList fullPaths;
+ QSqlDatabase db = QSqlDatabase::database("treedb");
+ QSqlQuery filesQ(db);
+ filesQ.prepare("SELECT tfilename, cmd5sum FROM files WHERE iseriespart_id = :id");
+ filesQ.bindValue(":id", partId);
+ filesQ.exec();
+ while(filesQ.next()){
+ QString fp = Helper::createArchivePath(filesQ.value(0).toString(), filesQ.value(1).toString());
+ fullPaths << fp;
+ }
+ QString msg = QString(tr("Really delete %1 file(s) (SeriesId %2)?")).arg(fullPaths.count()).arg(partId);
+ int retval = QMessageBox::question(this, tr("Delete files..."), msg);
+ if(retval == QMessageBox::Yes){
+ db.transaction();
+ QSqlQuery deleteId(db);
+ deleteId.prepare("DELETE FROM seriesparts WHERE iseriesparts_id = :id");
+ deleteId.bindValue(":id", partId);
+ if(deleteId.exec()){
+ for(QString f : fullPaths){
+ if(!QFile::remove(f)){
+ db.rollback();
+ return;
+ }
+ }
+ }
+ mTopModel->removeRow(mTopProxy->mapToSource(cur.first()).row());
+ db.commit();
+ }
+}
+
void MovieWidget::selectBy(const QString &selection){
if(selection == "Series"){
populateBySeries();
diff --git a/moviewidget.h b/moviewidget.h
index 381e96c..330c647 100644
--- a/moviewidget.h
+++ b/moviewidget.h
@@ -27,6 +27,7 @@ class MovieWidget : public QWidget {
void readSettings();
void writeSettings();
void refresh();
+ void deleteSeries();
private slots:
void selectBy(const QString &selection);