diff options
-rw-r--r-- | searchdialog.cpp | 103 | ||||
-rw-r--r-- | searchdialog.h | 5 |
2 files changed, 105 insertions, 3 deletions
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<int>::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<int> 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 - <no sub/part>").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); + } + } +} diff --git a/searchdialog.h b/searchdialog.h index 47c7106..efe081e 100644 --- a/searchdialog.h +++ b/searchdialog.h @@ -12,7 +12,7 @@ class QStandardItem; class SearchDialog : public QDialog { Q_OBJECT public: - enum SearchTypes { Filename, Title }; + enum SearchTypes { Filename, Title, Actors }; enum CustomRoles { IdRole = Qt::UserRole + 1 }; enum ChildMode { Actor, Genre }; explicit SearchDialog(QWidget *parent, Qt::WindowFlags f = 0); @@ -23,12 +23,15 @@ class SearchDialog : public QDialog { void doResult(const QModelIndex &cur, const QModelIndex &prev); void doSearchTitle(); void doSearchFilename(); + void doSearchActor(); void doResultName(const QModelIndex &sel, int resType); + void doResultActor(const QModelIndex &sel); void writeSettings(); void readSettings(); private: void doChild(QStandardItem *item, int childMode); + void doActorGenres(QStandardItem *item); QLineEdit *mSearch; QComboBox *mTypeSel; QTreeView *mResV; |