diff options
author | Arno <arno@disconnect.de> | 2018-11-09 20:23:10 +0100 |
---|---|---|
committer | Arno <arno@disconnect.de> | 2018-11-09 20:23:10 +0100 |
commit | 8c932c2d21e35fe5b446f80643f3b0ecf19b177d (patch) | |
tree | 9e6fb23ee1a1a6bfd6cbca37e8c62de67b00a540 | |
parent | 55b60427611f342f5890c0e6ef5e23d24e618632 (diff) | |
download | SheMov-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.cpp | 44 | ||||
-rw-r--r-- | moviewidget.h | 1 |
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); |