summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArno <am@disconnect.de>2014-04-07 16:16:55 +0200
committerArno <am@disconnect.de>2014-04-07 16:16:55 +0200
commit9f314ad26720a925e8e7a7f1a9f61330f3fd29c1 (patch)
tree9ca0661d1be109ac3df65d3e55b8629b295c1c3c
parent05c0ddf167054d1c7befe7440ff60718c98a8207 (diff)
downloadSheMov-9f314ad26720a925e8e7a7f1a9f61330f3fd29c1.tar.gz
SheMov-9f314ad26720a925e8e7a7f1a9f61330f3fd29c1.tar.bz2
SheMov-9f314ad26720a925e8e7a7f1a9f61330f3fd29c1.zip
Create new, empty Seriespart by contect menu
Preparation for drag and drop. Also make it possible to delete Seriesparts without files.
-rw-r--r--archivemodel.cpp55
-rw-r--r--archivemodel.h1
-rw-r--r--archiveview.cpp23
-rw-r--r--archiveview.h1
-rw-r--r--shemov.cpp5
-rw-r--r--shemov.h1
-rw-r--r--smdialog.cpp45
-rw-r--r--smdialog.h23
8 files changed, 135 insertions, 19 deletions
diff --git a/archivemodel.cpp b/archivemodel.cpp
index b845812..5369ff7 100644
--- a/archivemodel.cpp
+++ b/archivemodel.cpp
@@ -99,8 +99,8 @@ QVariant ArchiveModel::data(const QModelIndex &index, int role) const{
if(role == NameRole){
return item->data(Name);
}
- if(role == TypeRole){
- return item->data(Type);
+ if(role == GenericIdRole){
+ return item->data(GenericId);
}
if(role == SeriesPartIdRole){
return item->data(SeriesPartId);
@@ -108,12 +108,18 @@ QVariant ArchiveModel::data(const QModelIndex &index, int role) const{
if(role == SeriesPartRole){
return item->data(SeriesPart);
}
- if(role == SubtitleRole){
- return item->data(Subtitle);
+ if(role == TypeRole){
+ return item->data(Type);
}
if(role == FavoriteRole){
return item->data(Favorite);
}
+ if(role == SubtitleRole){
+ return item->data(Subtitle);
+ }
+ if(role == CountRole){
+ return item->data(Count);
+ }
if(role == Qt::DecorationRole){
if(index.column() == 0){
return mNodeIcons.value(item->data(Type).toInt());
@@ -512,6 +518,9 @@ bool ArchiveModel::deleteSeriesPart(int partId){
QSqlQuery filesQ(mDb);
filesQ.prepare("SELECT cmd5sum,tfilename FROM files WHERE iseriespart_id = :id");
filesQ.bindValue(":id", partId);
+ QSqlQuery deleteQ(mDb);
+ deleteQ.prepare("DELETE FROM seriesparts WHERE iseriesparts_id = :id");
+ deleteQ.bindValue(":id", partId);
QStringList fileNames;
if(filesQ.exec()){
while(filesQ.next()){
@@ -519,19 +528,37 @@ bool ArchiveModel::deleteSeriesPart(int partId){
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;
- }
+ QFile::remove(f);
}
- if(success){
- QSqlQuery deleteQ(mDb);
- deleteQ.prepare("DELETE FROM seriesparts WHERE iseriesparts_id = :id");
- deleteQ.bindValue(":id", partId);
- return deleteQ.exec();
+ }
+ return deleteQ.exec();
+}
+
+bool ArchiveModel::addSeriesPart(int partno, QString subtitle, const QModelIndex &parent){
+ int seriesId = parent.data(ArchiveModel::GenericIdRole).toInt();
+ mDb.transaction();
+ QSqlQuery insertQ(mDb);
+ if(!subtitle.isEmpty()){
+ insertQ.prepare("INSERT INTO seriesparts(iseriespart, iseries_id, tsubtitle) VALUES(:pno, :sid, :subtitle)");
+ insertQ.bindValue(":pno", partno);
+ insertQ.bindValue(":sid", seriesId);
+ insertQ.bindValue(":subtitle", subtitle);
+ }else{
+ insertQ.prepare("INSERT INTO seriesparts(iseriespart, iseries_id) VALUES(:pno, :sid)");
+ insertQ.bindValue(":pno", partno);
+ insertQ.bindValue(":sid", seriesId);
+ }
+ if(insertQ.exec()){
+ int nextPartId = -1;
+ QSqlQuery pidQ("SELECT currval('seriesparts_seriesparts_id__seq')", mDb);
+ while(pidQ.next()){
+ nextPartId = pidQ.value(0).toInt();
}
+ QList<QVariant> data;
+ data << parent.data(ArchiveModel::NameRole).toString() << seriesId << nextPartId << partno << ArchiveModel::SeriesPartNode << false << subtitle << QVariant();
+ mDb.commit();
+ return addRow(data, parent, true);
}
return false;
}
diff --git a/archivemodel.h b/archivemodel.h
index 8abf60c..a9a11eb 100644
--- a/archivemodel.h
+++ b/archivemodel.h
@@ -54,6 +54,7 @@ class ArchiveModel : public SmTreeModel {
bool setFavorite(int partId, bool favorite);
void addCovers(int partId, const QStringList covers);
bool deleteSeriesPart(int partId);
+ bool addSeriesPart(int partno, QString subtitle, const QModelIndex &parent);
signals:
void needRefresh();
diff --git a/archiveview.cpp b/archiveview.cpp
index 6a83685..f3656f7 100644
--- a/archiveview.cpp
+++ b/archiveview.cpp
@@ -32,6 +32,7 @@
#include "smglobals.h"
#include "helper.h"
#include "delegates.h"
+#include "smdialog.h"
ArchiveView::ArchiveView(QWidget *parent) : QWidget(parent) {
QSettings s;
@@ -404,6 +405,7 @@ void ArchiveTree::deleteFromTree(){
if(type == ArchiveModel::SeriesPartNode){
ArchiveController *c = SmGlobals::instance()->archiveController();
ArchiveFilesModel *fm = c->archiveFilesModel();
+ ArchiveModel *am = c->archiveTreeModel();
int seriesPartId = idx.data(ArchiveModel::SeriesPartIdRole).toInt();
QStringList files = fm->filesForSeriespart(seriesPartId);
if(!files.isEmpty()){
@@ -416,12 +418,25 @@ void ArchiveTree::deleteFromTree(){
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();
- }
+ am->deleteSeriesPart(seriesPartId);
}
+ }else{
+ am->deleteSeriesPart(seriesPartId);
}
+ am->refresh();
+ }
+}
+
+void ArchiveTree::newPart(){
+ SeriesPartsDialog pDlg(this);
+ int retval = pDlg.exec();
+ if(retval == QDialog::Accepted){
+ QString subtitle = pDlg.subtitle();
+ int partno = pDlg.partNo();
+ QModelIndex sel = firstSelected();
+ QModelIndex rSel = mProxy->mapToSource(sel);
+ mModel->addSeriesPart(partno, subtitle, rSel);
+ mModel->refresh();
}
}
diff --git a/archiveview.h b/archiveview.h
index 2366fb5..f1b9029 100644
--- a/archiveview.h
+++ b/archiveview.h
@@ -94,6 +94,7 @@ class ArchiveTree : public SmTreeView {
void editSeriesPart();
void markAsFavorite();
void deleteFromTree();
+ void newPart();
private:
void impossible(const QString msg = tr("Unable to perform function!"));
diff --git a/shemov.cpp b/shemov.cpp
index 651f209..8a6055c 100644
--- a/shemov.cpp
+++ b/shemov.cpp
@@ -632,6 +632,10 @@ void SheMov::createActions(){
mArchiveViewDeleteA = new QAction(QIcon(":/delete.png"), tr("Delete..."), this);
mArchiveViewDeleteA->setData(ArchiveModel::SeriesPartNode);
connect(mArchiveViewDeleteA, SIGNAL(triggered()), c->archiveTree(), SLOT(deleteFromTree()));
+ //add new series part
+ mArchiveViewNewPartA = new QAction(QIcon(":/french_maid_dress.png"), tr("New..."), this);
+ mArchiveViewNewPartA->setData(ArchiveModel::SeriesNode);
+ connect(mArchiveViewNewPartA, SIGNAL(triggered()), c->archiveTree(), SLOT(newPart()));
// ArchiveFiles actions <- ArchiveView!
// play selected
@@ -845,6 +849,7 @@ void SheMov::createMenus(){
// Movie archive
ArchiveController *c = SmGlobals::instance()->archiveController();
c->addActionForTree(mArchiveViewRenameA);
+ c->addActionForTree(mArchiveViewNewPartA);
c->addActionForTree(createSeparator());
c->addActionForTree(mArchiveViewActorsA);
c->addActionForTree(mArchiveViewGenresA);
diff --git a/shemov.h b/shemov.h
index b242d5b..a2bd27d 100644
--- a/shemov.h
+++ b/shemov.h
@@ -148,6 +148,7 @@ class SheMov : public QMainWindow {
QAction *mArchiveViewExpandAllA;
QAction *mArchiveViewCollapseAllA;
QAction *mArchiveViewDeleteA;
+ QAction *mArchiveViewNewPartA;
QActionGroup *mArchiveFilesAG;
//ArchiveBrowser
diff --git a/smdialog.cpp b/smdialog.cpp
index 064474c..645d6d6 100644
--- a/smdialog.cpp
+++ b/smdialog.cpp
@@ -5,6 +5,13 @@
2 of the License, or (at your option) any later version.
*/
+#include <QLineEdit>
+#include <QSpinBox>
+#include <QLabel>
+#include <QPushButton>
+#include <QFormLayout>
+#include <QHBoxLayout>
+
#include "smdialog.h"
#include "helper.h"
@@ -13,3 +20,41 @@ SmDialog::SmDialog(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f) {}
void SmDialog::showEvent(QShowEvent *){
Helper::centerWidget(this);
}
+
+SeriesPartsDialog::SeriesPartsDialog(QWidget *parent, Qt::WindowFlags f) : SmDialog(parent, f){
+ QFormLayout *mainLayout = new QFormLayout;
+ mSubtitle = new QLineEdit;
+ mSubtitle->setMinimumWidth(300);
+ mainLayout->addRow(tr("&Subtitle:"), mSubtitle);
+ mPartno = new QSpinBox;
+ mPartno->setValue(0);
+ mPartno->setMinimum(0);
+ mainLayout->addRow(tr("&Part no."), mPartno);
+ mOk = new QPushButton(tr("Ok"));
+ connect(mOk, SIGNAL(clicked()), this, SLOT(accept()));
+ mCancel = new QPushButton(tr("Cancel"));
+ connect(mCancel, SIGNAL(clicked()), this, SLOT(reject()));
+ mCancel->setDefault(true);
+ QHBoxLayout *buttonLayout = new QHBoxLayout;
+ buttonLayout->addStretch();
+ buttonLayout->addWidget(mOk);
+ buttonLayout->addWidget(mCancel);
+ mainLayout->addRow(buttonLayout);
+ setLayout(mainLayout);
+}
+
+QString SeriesPartsDialog::subtitle() const {
+ return mSubtitle->text();
+}
+
+void SeriesPartsDialog::setSubtitle(const QString &subtitle){
+ mSubtitle->setText(subtitle);
+}
+
+int SeriesPartsDialog::partNo() const {
+ return mPartno->value();
+}
+
+void SeriesPartsDialog::setPartno(int partNo){
+ mPartno->setValue(partNo);
+}
diff --git a/smdialog.h b/smdialog.h
index cef5b27..4b2e935 100644
--- a/smdialog.h
+++ b/smdialog.h
@@ -8,7 +8,11 @@
#ifndef SMDIALOG_H
#define SMDIALOG_H
-#include <QtWidgets/QDialog>
+#include <QDialog>
+
+class QLineEdit;
+class QSpinBox;
+class QPushButton;
class SmDialog : public QDialog {
Q_OBJECT
@@ -19,4 +23,21 @@ class SmDialog : public QDialog {
virtual void showEvent(QShowEvent *);
};
+class SeriesPartsDialog : public SmDialog {
+ Q_OBJECT
+ public:
+ explicit SeriesPartsDialog(QWidget *parent, Qt::WindowFlags f = 0);
+ QString subtitle() const;
+ int partNo() const;
+ void setSubtitle(const QString &subtitle);
+ void setPartno(int partNo);
+
+ private:
+ QLineEdit *mSubtitle;
+ QSpinBox *mPartno;
+ QPushButton *mOk;
+ QPushButton *mCancel;
+
+};
+
#endif // SMDIALOG_H