From 0207d7361db6d35c1179f01f437dfe12c44706c9 Mon Sep 17 00:00:00 2001 From: Arno Date: Fri, 2 Feb 2018 07:19:29 +0100 Subject: Implement actor search in SearchDialog --- searchdialog.cpp | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 101 insertions(+), 2 deletions(-) (limited to 'searchdialog.cpp') diff --git a/searchdialog.cpp b/searchdialog.cpp index 64da754..ff469ee 100644 --- a/searchdialog.cpp +++ b/searchdialog.cpp @@ -21,6 +21,7 @@ SearchDialog::SearchDialog(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, mTypeSel = new QComboBox; mTypeSel->addItem(tr("Title"), Title); mTypeSel->addItem(tr("Filename"), Filename); + mTypeSel->addItem(tr("Actor"), Actors); connect(mTypeSel, QOverload::of(&QComboBox::activated), this, &SearchDialog::doSearch); mSearch = new QLineEdit; QPushButton *goB = new QPushButton(tr("Go!")); @@ -84,6 +85,8 @@ void SearchDialog::doSearch(){ doSearchTitle(); }else if(type == Filename){ doSearchFilename(); + }else if(type == Actors){ + doSearchActor(); } } @@ -92,6 +95,8 @@ void SearchDialog::doResult(const QModelIndex &cur, const QModelIndex &prev){ int type = mTypeSel->currentData().toInt(); if(type == Title || type == Filename){ doResultName(cur, type); + }else if(type == Actors){ + doResultActor(cur); } } @@ -158,6 +163,33 @@ void SearchDialog::doSearchFilename(){ mResV->sortByColumn(0); } +void SearchDialog::doSearchActor(){ + if(mSearch->text().isEmpty()){ + return; + } + mResV->setSortingEnabled(false); + mResM->clear(); + mResM->setColumnCount(1); + mResM->setHeaderData(0, Qt::Horizontal, tr("Title")); + QIcon icon = Helper::icon(QColor(255,85,255), QChar(0x26A8), false); + QStandardItem *root = mResM->invisibleRootItem(); + QSqlDatabase db = QSqlDatabase::database("shemovdb"); + QSqlQuery aQ(db); + aQ.prepare("SELECT tactorname, iactors_id FROM actors WHERE tactorname ~ :name ORDER BY tactorname"); + aQ.bindValue(":name", mSearch->text()); + aQ.exec(); + while(aQ.next()){ + QStandardItem *cur = new QStandardItem(aQ.value(0).toString()); + cur->setIcon(icon); + cur->setData(aQ.value(1), IdRole); + cur->setEditable(false); + doActorGenres(cur); + root->appendRow(cur); + } + mResV->setSortingEnabled(true); + mResV->sortByColumn(0); +} + void SearchDialog::doResultName(const QModelIndex &sel, int resType){ int seriesId = sel.data(IdRole).toInt(); QSqlDatabase db = QSqlDatabase::database("shemovdb"); @@ -200,6 +232,50 @@ void SearchDialog::doResultName(const QModelIndex &sel, int resType){ mDataV->sortByColumn(0); } +void SearchDialog::doResultActor(const QModelIndex &sel){ + mDataM->clear(); + mDataM->setColumnCount(1); + mDataM->setHeaderData(0, Qt::Horizontal, tr("Series")); + QIcon icon = Helper::icon(QColor(255,85,255), QChar(0x26A8), false); + QVector seriesParts; + QStandardItem *root = mDataM->invisibleRootItem(); + QSqlDatabase db = QSqlDatabase::database("shemovdb"); + QSqlQuery r1Q(db); + r1Q.prepare("SELECT DISTINCT(seriesparts.iseriesparts_id) FROM seriesparts_actormap, seriesparts WHERE seriesparts_actormap.iactors_id = :id AND seriesparts_actormap.iseriesparts_id = seriesparts.iseriesparts_id"); + r1Q.bindValue(":id", sel.data(IdRole)); + r1Q.exec(); + while(r1Q.next()){ + seriesParts << r1Q.value(0).toInt(); + } + QSqlQuery r2Q(db); + r2Q.prepare("SELECT series.tseries_name, seriesparts.iseriespart, seriesparts.iseriesparts_id, seriesparts.tsubtitle FROM series, seriesparts WHERE seriesparts.iseriesparts_id = :id AND seriesparts.iseries_id = series.iseries_id"); + for(int sp : seriesParts){ + r2Q.bindValue(":id", sp); + r2Q.exec(); + while(r2Q.next()){ + int sPart = r2Q.value(1).toInt(); + QString curDisp; + if(sPart > 0){ + curDisp = QString("%1 %2").arg(r2Q.value(0).toString()).arg(sPart, 3, 10, QChar('0')); + }else{ + QString sub = r2Q.value(3).toString(); + if(sub.isEmpty()){ + curDisp = QString("%1 - ").arg(r2Q.value(0).toString()); + }else{ + curDisp = QString("%1 - %2").arg(r2Q.value(0).toString()).arg(sub); + } + } + QStandardItem *cur = new QStandardItem(curDisp); + cur->setIcon(icon); + cur->setData(r2Q.value(2), IdRole); + cur->setEditable(false); + root->appendRow(cur); + } + mDataV->setSortingEnabled(true); + mDataV->sortByColumn(0); + } +} + void SearchDialog::writeSettings(){ QSettings s; s.setValue("searchby", mTypeSel->currentText()); @@ -219,7 +295,7 @@ void SearchDialog::readSettings(){ void SearchDialog::doChild(QStandardItem *item, int childMode){ QStringList res; - QIcon aIcon; // = + QIcon aIcon; QString parentName; QSqlDatabase db = QSqlDatabase::database("shemovdb"); QSqlQuery rQ(db); @@ -244,9 +320,32 @@ void SearchDialog::doChild(QStandardItem *item, int childMode){ for(QString a : res){ QStandardItem *curItem = new QStandardItem(a); curItem->setIcon(aIcon); - aItem->appendRow(curItem); curItem->setEditable(false); + aItem->appendRow(curItem); } item->appendRow(aItem); } } + +void SearchDialog::doActorGenres(QStandardItem *item){ + QStringList res; + QIcon aIcon = Helper::icon(QColor(255,85,255), QChar(0x26A6)); + QSqlDatabase db = QSqlDatabase::database("shemovdb"); + QSqlQuery aQ(db); + aQ.prepare("SELECT DISTINCT(genres.tgenrename) FROM genres, seriesparts, seriesparts_actormap, seriesparts_genremap WHERE seriesparts_actormap.iseriesparts_id = seriesparts.iseriesparts_id AND seriesparts.iseriesparts_id = seriesparts_genremap.iseriesparts_id AND seriesparts_genremap.igenres_id = genres.igenres_id AND seriesparts_actormap.iactors_id = :id ORDER BY genres.tgenrename"); + aQ.bindValue(":id", item->data(IdRole)); + aQ.exec(); + while(aQ.next()){ + res << aQ.value(0).toString(); + } + if(!res.isEmpty()){ + std::sort(res.begin(), res.end()); + for(QString s : res){ + QStandardItem *cur = new QStandardItem(s); + cur->setIcon(aIcon); + cur->setEditable(false); + cur->setData(item->data(IdRole), IdRole); + item->appendRow(cur); + } + } +} -- cgit v1.2.3-70-g09d2