From 9f314ad26720a925e8e7a7f1a9f61330f3fd29c1 Mon Sep 17 00:00:00 2001 From: Arno Date: Mon, 7 Apr 2014 16:16:55 +0200 Subject: Create new, empty Seriespart by contect menu Preparation for drag and drop. Also make it possible to delete Seriesparts without files. --- archivemodel.cpp | 55 +++++++++++++++++++++++++++++++++++++++++-------------- archivemodel.h | 1 + archiveview.cpp | 23 +++++++++++++++++++---- archiveview.h | 1 + shemov.cpp | 5 +++++ shemov.h | 1 + smdialog.cpp | 45 +++++++++++++++++++++++++++++++++++++++++++++ smdialog.h | 23 ++++++++++++++++++++++- 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 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("

Continue?

")); 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 +#include +#include +#include +#include +#include + #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 +#include + +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 -- cgit v1.2.3-70-g09d2