#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "moviepropertiesdialog.h" #include "smview.h" #include "sminputdialog.h" MoviePropertiesDialog::MoviePropertiesDialog(QWidget *parent) : QDialog(parent){ mActorDlg = new SmInputDialog(tr("Actor"), this); mGenreDlg = new SmInputDialog(tr("Genre"), this); setWindowTitle(tr("Edit series...")); setupDialog(); } void MoviePropertiesDialog::setupDialog(){ QLabel *seriesNameL = new QLabel(tr("Name")); mSeriesNameLE = new QLineEdit; QGridLayout *seriesGrid = new QGridLayout; seriesGrid->addWidget(seriesNameL, 0, 0); seriesGrid->addWidget(mSeriesNameLE, 0, 1); QLabel *seriesSubtitleL = new QLabel(tr("Subtitle")); mSubtitleLE = new QLineEdit; seriesGrid->addWidget(seriesSubtitleL, 1, 0); seriesGrid->addWidget(mSubtitleLE, 1, 1); QLabel *commentL = new QLabel(tr("Comment")); mCommentLE = new QLineEdit; seriesGrid->addWidget(commentL, 2, 0); seriesGrid->addWidget(mCommentLE, 2, 1); QLabel *subjectL = new QLabel(tr("Subject")); mSubjectLE = new QLineEdit; seriesGrid->addWidget(subjectL, 3, 0); seriesGrid->addWidget(mSubjectLE, 3, 1); QGroupBox *seriesGB = new QGroupBox(tr("Series")); seriesGB->setLayout(seriesGrid); QIntValidator *validator = new QIntValidator(this); mReleaseYearLE = new QLineEdit("0000"); mReleaseYearLE->setValidator(validator); QGroupBox *releaseYearGB = new QGroupBox(tr("Rel. year")); QHBoxLayout *releaseYearGBL = new QHBoxLayout; releaseYearGBL->addWidget(mReleaseYearLE); releaseYearGB->setLayout(releaseYearGBL); mSeriesPartLE = new QLineEdit("00"); mSeriesPartLE->setValidator(validator); QGroupBox *partNoGB = new QGroupBox(tr("Part No.")); QHBoxLayout *partNoGBL = new QHBoxLayout; partNoGBL->addWidget(mSeriesPartLE); partNoGB->setLayout(partNoGBL); mTorrentRB = new QRadioButton(tr("BitTorrent")); mUsenetRB = new QRadioButton(tr("Usenet")); QGroupBox *sourceGB = new QGroupBox(tr("Source")); QHBoxLayout *sourceGBL = new QHBoxLayout; sourceGBL->addWidget(mTorrentRB); sourceGBL->addWidget(mUsenetRB); sourceGB->setLayout(sourceGBL); QHBoxLayout *variousL = new QHBoxLayout; variousL->addWidget(releaseYearGB); variousL->addWidget(partNoGB); variousL->addWidget(sourceGB); mActorV = new SmView; mActorV->setPalette(qApp->palette()); mActorV->setAlternatingRowColors(true); mActorM = new QStandardItemModel; mActorV->setModel(mActorM); QAction *addActorA = new QAction(QIcon(":/spreadingpants.png"), tr("Add actor..."), this); connect(addActorA, &QAction::triggered, [=] { addItem(mActorDlg, mActorM, QIcon(":/diaper.png")); }); QAction *removeActorA = new QAction(QIcon(":/delete.png"), tr("Remove actor"), this); connect(removeActorA, &QAction::triggered, [=] { removeItem(mActorV); }); mActorV->addActions(QList() << addActorA << removeActorA); QGroupBox *actorsGB = new QGroupBox(tr("Actors")); QHBoxLayout *actorsGBL = new QHBoxLayout; actorsGBL->addWidget(mActorV); actorsGB->setLayout(actorsGBL); mGenreV = new SmView; mGenreV->setPalette(qApp->palette()); mGenreV->setAlternatingRowColors(true); mGenreM = new QStandardItemModel; mGenreV->setModel(mGenreM); QAction *addGenreA = new QAction(QIcon(":/spreadingpants.png"), tr("Add genre..."), this); connect(addGenreA, &QAction::triggered, [=] { addItem(mGenreDlg, mGenreM, QIcon(":/dick_in_cage.png")); }); QAction *removeGenreA = new QAction(QIcon(":/delete.png"), tr("Remove genre"), this); connect(removeGenreA, &QAction::triggered, [=] { removeItem(mGenreV); }); mGenreV->addActions(QList() << addGenreA << removeGenreA); QGroupBox *genresGB = new QGroupBox(tr("Genres")); QHBoxLayout *genresGBL = new QHBoxLayout; genresGBL->addWidget(mGenreV); genresGB->setLayout(genresGBL); QHBoxLayout *viewL = new QHBoxLayout; viewL->addWidget(actorsGB); viewL->addWidget(genresGB); QPushButton *updatePB = new QPushButton(tr("Update!")); connect(updatePB, &QPushButton::clicked, this, &MoviePropertiesDialog::accept); QPushButton *cancelPB = new QPushButton(tr("Cancel")); connect(cancelPB, &QPushButton::clicked, this, &MoviePropertiesDialog::reject); QHBoxLayout *buttonLayout = new QHBoxLayout; buttonLayout->addStretch(); buttonLayout->addWidget(cancelPB); buttonLayout->addWidget(updatePB); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(seriesGB); mainLayout->addLayout(variousL); mainLayout->addLayout(viewL); mainLayout->addLayout(buttonLayout); setLayout(mainLayout); } void MoviePropertiesDialog::init(int seriesPartsId){ mSeriesPartsId = seriesPartsId; QSqlDatabase db = QSqlDatabase::database("treedb"); QSqlQuery genQ(db); genQ.prepare("SELECT series.tseries_name, seriesparts.tsubtitle, seriesparts.iseriespart, metadata.tcomment, metadata.sireleaseyear, metadata.tsourcemedium, metadata.tsubject FROM series, seriesparts, metadata WHERE seriesparts.iseriesparts_id = :id AND seriesparts.iseries_id = series.iseries_id AND metadata.iseriespart_id = seriesparts.iseriesparts_id"); genQ.bindValue(":id", seriesPartsId); genQ.exec(); while(genQ.next()){ mSeriesNameLE->setText(genQ.value(0).toString()); mSubtitleLE->setText(genQ.value(1).toString()); mSubjectLE->setText(genQ.value(6).toString()); mSeriesPartLE->setText(genQ.value(2).toString()); mCommentLE->setText(genQ.value(3).toString()); mReleaseYearLE->setText(genQ.value(4).toString()); QString src = genQ.value(5).toString().toLower(); if(src == "usenet"){ mUsenetRB->setChecked(true); } if(src == "torrent"){ mTorrentRB->setChecked(true); } } mActorM->clear(); mActorM->setHorizontalHeaderLabels(QStringList() << tr("Name")); mActorV->setRootIsDecorated(false); QStandardItem *actorsRootItem = mActorM->invisibleRootItem(); QSqlQuery actorsQ(db); actorsQ.prepare("SELECT actors.tactorname, actors.iactors_id FROM actors, seriesparts_actormap WHERE seriesparts_actormap.iseriesparts_id = :id AND seriesparts_actormap.iactors_id = actors.iactors_id ORDER BY actors.tactorname"); actorsQ.bindValue(":id", seriesPartsId); actorsQ.exec(); while(actorsQ.next()){ QStandardItem *i = new QStandardItem; i->setEditable(false); i->setIcon(QIcon(":/diaper.png")); i->setText(actorsQ.value(0).toString()); i->setData(actorsQ.value(1), ActorIdRole); actorsRootItem->appendRow(i); } mGenreM->clear(); mGenreM->setHorizontalHeaderLabels(QStringList() << tr("Genre")); mGenreV->setRootIsDecorated(false); QStandardItem *genresRootItem = mGenreM->invisibleRootItem(); QSqlQuery genresQ(db); genresQ.prepare("SELECT genres.tgenrename, genres.igenres_id FROM genres, seriesparts_genremap WHERE seriesparts_genremap.iseriesparts_id = :id AND seriesparts_genremap.igenres_id = genres.igenres_id ORDER BY genres.tgenrename"); genresQ.bindValue(":id", seriesPartsId); genresQ.exec(); while(genresQ.next()){ QStandardItem *i = new QStandardItem; i->setEditable(false); i->setIcon(QIcon(":/dick_in_cage.png")); i->setText(genresQ.value(0).toString()); i->setData(genresQ.value(1), GenreIdRole); genresRootItem->appendRow(i); } QStringList seriesNames; QSqlQuery allSeriesNamesQ("SELECT tseries_name FROM series", db); while(allSeriesNamesQ.next()){ seriesNames << allSeriesNamesQ.value(0).toString(); } QCompleter *snCompleter = new QCompleter(seriesNames); mSeriesNameLE->setCompleter(snCompleter); QStringList actorNames; QSqlQuery allActorsQ("SELECT tactorname FROM actors", db); while(allActorsQ.next()){ actorNames << allActorsQ.value(0).toString(); } QCompleter *actorCompleter = new QCompleter(actorNames, mActorDlg); mActorDlg->setCompleter(actorCompleter); QStringList genreNames; QSqlQuery allGenresQ("SELECT tgenrename FROM genres", db); while(allGenresQ.next()){ genreNames << allGenresQ.value(0).toString(); } QCompleter *genreCompleter = new QCompleter(genreNames, mGenreDlg); mGenreDlg->setCompleter(genreCompleter); } void MoviePropertiesDialog::addItem(SmInputDialog *dlg, QStandardItemModel *model, QIcon icon){ int retval = dlg->exec(); if(retval == QDialog::Accepted){ QString itemName = dlg->text().toLower(); int idx = 0; while(idx != model->rowCount()){ QStandardItem *curItem = model->item(idx, 0); if(curItem->text() == itemName){ return; } if(curItem->text() > itemName){ break; } ++idx; } QStandardItem *newItem = new QStandardItem; newItem->setEditable(false); newItem->setIcon(icon); newItem->setText(itemName); model->insertRow(idx, newItem); } } void MoviePropertiesDialog::removeItem(SmView *view){ QModelIndexList selected = view->selectionModel()->selectedRows(); if(!selected.isEmpty()){ view->model()->removeRow(selected.first().row()); } } void MoviePropertiesDialog::accept(){ QSqlDatabase db = QSqlDatabase::database("treedb"); int seriesId = -1; if(!mSeriesNameLE->text().isEmpty()){ QString newSeriesName = mSeriesNameLE->text().toLower(); QSqlQuery findSnQ(db); findSnQ.prepare("SELECT iseries_id FROM series WHERE tseries_name = :name"); findSnQ.bindValue(":name", newSeriesName); findSnQ.exec(); while(findSnQ.next()){ seriesId = findSnQ.value(0).toInt(); } if(seriesId == -1){ QSqlQuery insertSnQ(db); insertSnQ.prepare("INSERT INTO series (tseries_name) VALUES(:name)"); insertSnQ.bindValue(":name", newSeriesName); insertSnQ.exec(); findSnQ.exec(); while(findSnQ.next()){ seriesId = findSnQ.value(0).toInt(); } } } QSqlQuery updateSpQ(db); updateSpQ.prepare("UPDATE seriesparts SET iseries_id = :sid, tsubtitle = :sub, iseriespart = :sp WHERE iseriesparts_id = :spid"); updateSpQ.bindValue(":sid", seriesId); updateSpQ.bindValue(":sub", mSubtitleLE->text()); updateSpQ.bindValue(":spid", mSeriesPartsId); updateSpQ.bindValue(":sp", mSeriesPartLE->text().toInt()); updateSpQ.exec(); QString sourceMedium = "torrent"; if(mUsenetRB->isChecked()){ sourceMedium = "Usenet"; //for historical reasons it's not lowercased } QSqlQuery updateMdQ(db); updateMdQ.prepare("UPDATE metadata SET sireleaseyear = :ry, tcomment = :c, tsourcemedium = :src, tsubject = :subj WHERE iseriespart_id = :spid"); updateMdQ.bindValue(":ry", mReleaseYearLE->text().toInt()); updateMdQ.bindValue(":c", mCommentLE->text()); updateMdQ.bindValue(":src", sourceMedium); updateMdQ.bindValue(":subj", mSubjectLE->text()); updateMdQ.bindValue(":spid", mSeriesPartsId); updateMdQ.exec(); QSqlQuery clearActorMapQ(db); clearActorMapQ.prepare("DELETE FROM seriesparts_actormap WHERE iseriesparts_id = :id"); clearActorMapQ.bindValue(":id", mSeriesPartsId); clearActorMapQ.exec(); QSqlQuery insertActorMapQ(db); insertActorMapQ.prepare("INSERT INTO seriesparts_actormap (iseriesparts_id, iactors_id) VALUES(:spid, :aid)"); for(int i = 0; i < mActorM->rowCount(); ++i){ QString curActor = mActorM->item(i)->text(); int actorId = -1; QSqlQuery actorQ(db); actorQ.prepare("SELECT iactors_id FROM actors WHERE tactorname = :name"); actorQ.bindValue(":name", curActor); actorQ.exec(); while(actorQ.next()){ actorId = actorQ.value(0).toInt(); } if(actorId == -1){ QSqlQuery insertActorQ(db); insertActorQ.prepare("INSERT INTO actors (tactorname) VALUES(:name)"); insertActorQ.bindValue(":name", curActor); insertActorQ.exec(); actorQ.exec(); while(actorQ.next()){ actorId = actorQ.value(0).toInt(); } } insertActorMapQ.bindValue(":spid", mSeriesPartsId); insertActorMapQ.bindValue(":aid", actorId); insertActorMapQ.exec(); } QSqlQuery clearGenreMapQ(db); clearGenreMapQ.prepare("DELETE FROM seriesparts_genremap WHERE iseriesparts_id = :id"); clearGenreMapQ.bindValue(":id", mSeriesPartsId); clearGenreMapQ.exec(); QSqlQuery insertGenreMapQ(db); insertGenreMapQ.prepare("INSERT INTO seriesparts_genremap (iseriesparts_id, igenres_id) VALUES(:spid, :gid)"); for(int i = 0; i < mGenreM->rowCount(); ++i){ QString curGenre = mGenreM->item(i)->text(); int genreId = -1; QSqlQuery genreQ(db); genreQ.prepare("SELECT igenres_id FROM genres WHERE tgenrename = :name"); genreQ.bindValue(":name", curGenre); genreQ.exec(); while(genreQ.next()){ genreId = genreQ.value(0).toInt(); } if(genreId == -1){ QSqlQuery insertGenreQ(db); insertGenreQ.prepare("INSERT INTO genres (tgenrename) VALUES(:name)"); insertGenreQ.bindValue(":name", curGenre); insertGenreQ.exec(); genreQ.exec(); while(genreQ.next()){ genreId = genreQ.value(0).toInt(); } } insertGenreMapQ.bindValue(":spid", mSeriesPartsId); insertGenreMapQ.bindValue(":gid", genreId); insertGenreMapQ.exec(); } QDialog::accept(); }