#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "actorwidget.h" #include "globals.h" ActorWidget::ActorWidget(QWidget *parent) : QWidget(parent) { mDb = QSqlDatabase::database("shemovdb"); if(!mDb.isOpen()){ mDb.open(); } mAllQ = QSqlQuery(mDb); mAllQ.prepare("SELECT tactorname, iactors_id FROM actors ORDER BY tactorname"); mSeriesQ = QSqlQuery(mDb); mSeriesQ.prepare("SELECT series.tseries_name FROM series, seriesparts_actormap, seriesparts, actors WHERE series.iseries_id = seriesparts.iseries_id AND seriesparts.iseriesparts_id = seriesparts_actormap.iseriesparts_id AND seriesparts_actormap.iactors_id = actors.iactors_id AND actors.iactors_id = :id GROUP BY series.iseries_id, series.tseries_name ORDER BY series.tseries_name"); mGenresQ = QSqlQuery(mDb); mGenresQ.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"); mCountQ = QSqlQuery(mDb); mCountQ.prepare("SELECT COUNT(*) FROM actors"); setupGui(); } ActorWidget::~ActorWidget(){ writeSettings(); } void ActorWidget::gatherData(){ mProgress->reset(); mProgress->setMaximum(0); mCountQ.exec(); while(mCountQ.next()){ mProgress->setMaximum(mCountQ.value(0).toInt()); } mActorModel->clear(); mActorModel->setHorizontalHeaderLabels(QStringList() << QChar(0x26A7) << tr("Name")); int count = 0; QStandardItem *root = mActorModel->invisibleRootItem(); qApp->processEvents(); mAllQ.exec(); while(mAllQ.next()){ QList aData = emptyList(); aData[IconColumn]->setIcon(QIcon(":/huge_bra.png")); int aId = mAllQ.value(1).toInt(); aData[IconColumn]->setData(aId, IdRole); aData[NameColumn]->setText(mAllQ.value(0).toString()); root->appendRow(aData); mProgress->setValue(++count); } mActorView->resizeColumnToContents(IconColumn); } void ActorWidget::gatherSeries(){ QModelIndexList sel = mActorView->selectionModel()->selectedRows(); if(sel.isEmpty()){ return; } mSeriesModel->clear(); mSeriesModel->setHorizontalHeaderLabels(QStringList() << QChar(0x2640) << tr("Series")); QStandardItem *root = mSeriesModel->invisibleRootItem(); QModelIndex idx = sel.at(0); QVariant id = idx.data(IdRole); mSeriesQ.bindValue(":id", id); mSeriesQ.exec(); while(mSeriesQ.next()){ QList data = emptyList(); data[IconColumn]->setIcon(QIcon(":/higheels.png")); data[NameColumn]->setText(mSeriesQ.value(0).toString()); root->appendRow(data); } mSeriesView->resizeColumnToContents(IconColumn); } void ActorWidget::gatherGenres(){ QModelIndexList sel = mActorView->selectionModel()->selectedRows(); if(sel.isEmpty()){ return; } mGenresModel->clear(); mGenresModel->setHorizontalHeaderLabels(QStringList() << QChar(0x26A4) << tr("Genres")); QStandardItem *root = mGenresModel->invisibleRootItem(); QModelIndex idx = sel.at(0); QVariant id = idx.data(IdRole); mGenresQ.bindValue(":id", id); mGenresQ.exec(); while(mGenresQ.next()){ QList data = emptyList(); data[IconColumn]->setIcon(QIcon(":/hourglass_figure.png")); data[NameColumn]->setText(mGenresQ.value(0).toString()); root->appendRow(data); } mGenresView->resizeColumnToContents(IconColumn); } void ActorWidget::filter(){ QString fs = mActor->text(); mProxy->setFilterRegExp(fs); if(fs.isEmpty()){ mProxy->invalidate(); } mActorView->setFocus(); if(mActorModel->rowCount()){ QModelIndex idx = mActorModel->index(0, 0); mActorView->selectionModel()->select(idx, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows); } } void ActorWidget::clearFilter(){ mActor->clear(); filter(); mActor->setFocus(); } void ActorWidget::readSettings(){ QSettings s; QString f = s.value("actors/filter").toString(); mActor->setText(f); filter(); QString n = s.value("actors/selectedactor").toString(); QList itemL = mActorModel->findItems(n, Qt::MatchExactly, NameColumn); if(!itemL.isEmpty()){ QModelIndex cur = mActorModel->indexFromItem(itemL.first()); QModelIndex real = mProxy->mapFromSource(cur); mActorView->selectionModel()->select(real, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows); } mActorView->header()->restoreState(s.value("actors/actorheaders").toByteArray()); } void ActorWidget::writeSettings(){ QSettings s; s.setValue("actors/filter", mActor->text()); QModelIndexList sel = mActorView->selectionModel()->selectedRows(NameColumn); if(!sel.isEmpty()){ s.setValue("actors/selectedactor", sel.first().data()); } s.setValue("actors/actorheaders", mActorView->header()->saveState()); } void ActorWidget::setupGui(){ mActor = new QLineEdit; connect(mActor, &QLineEdit::returnPressed, this, &ActorWidget::filter); QLabel *filterL = new QLabel(tr("&Filter")); filterL->setBuddy(mActor); QPushButton *doFilter = new QPushButton(tr("Filter")); connect(doFilter, &QPushButton::clicked, this, &ActorWidget::filter); QPushButton *doClearFilter = new QPushButton(tr("&Clear")); connect(doClearFilter, &QPushButton::clicked, this, &ActorWidget::clearFilter); QHBoxLayout *buttonLayout = new QHBoxLayout; buttonLayout->addWidget(filterL); buttonLayout->addWidget(mActor); buttonLayout->addWidget(doFilter); buttonLayout->addWidget(doClearFilter); mActorView = new QTreeView; mActorView->setSortingEnabled(true); mActorView->setSelectionBehavior(QAbstractItemView::SelectRows); mActorView->setSelectionMode(QAbstractItemView::SingleSelection); mActorModel = new QStandardItemModel; mProxy = new QSortFilterProxyModel; mProxy->setSourceModel(mActorModel); mProxy->setFilterKeyColumn(NameColumn); mActorView->setModel(mProxy); connect(mActorView->selectionModel(), &QItemSelectionModel::selectionChanged, this, &ActorWidget::gatherSeries); connect(mActorView->selectionModel(), &QItemSelectionModel::selectionChanged, this, &ActorWidget::gatherGenres); mSeriesView = new QTreeView; mSeriesView->setSelectionBehavior(QAbstractItemView::SelectRows); mSeriesView->setSelectionMode(QAbstractItemView::ExtendedSelection); mSeriesModel = new QStandardItemModel; mSeriesView->setModel(mSeriesModel); mGenresView = new QTreeView; mGenresView->setSelectionBehavior(QAbstractItemView::SelectRows); mGenresView->setSelectionMode(QAbstractItemView::ExtendedSelection); mGenresModel = new QStandardItemModel; mGenresView->setModel(mGenresModel); QGridLayout *viewGridL = new QGridLayout; viewGridL->addWidget(new QLabel(tr("Series")), 0, 0); viewGridL->addWidget(new QLabel(tr("Genres")), 0, 1); viewGridL->addWidget(mSeriesView, 1, 0); viewGridL->addWidget(mGenresView, 1, 1); mMenuBar = new QMenuBar; mToolBar = new QToolBar; mToolBar->setIconSize(QSize(16, 16)); createActions(); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(mMenuBar); mainLayout->addWidget(mToolBar); mainLayout->addLayout(buttonLayout); mainLayout->addWidget(new QLabel(tr("Found"))); mainLayout->addWidget(mActorView); mainLayout->addLayout(viewGridL); setLayout(mainLayout); } void ActorWidget::createActions(){ QAction *refreshA = new QAction(QIcon(":/refresh.png"), tr("Refersh"), this); connect(refreshA, &QAction::triggered, this, &ActorWidget::gatherData); refreshA->setShortcut(tr("CTRL+R")); QMenu *fileMenu = new QMenu(tr("&File"), this); fileMenu->addAction(Globals::instance()->action(Globals::QuitAction)); QMenu *editMenu = new QMenu(tr("&Edit"), this); editMenu->addAction(refreshA); editMenu->addSeparator(); editMenu->addAction(Globals::instance()->action(Globals::ConfigAction)); mMenuBar->addMenu(fileMenu); mMenuBar->addMenu(editMenu);; mToolBar->addAction(refreshA); mToolBar->addAction(createSeparator()); mToolBar->addAction(Globals::instance()->action(Globals::ConfigAction)); } QList ActorWidget::emptyList(){ QList retval; for(int i = 0; i < ColumnCount; ++i){ QStandardItem *item = new QStandardItem; item->setEditable(false); retval << item; } return retval; } QAction *ActorWidget::createSeparator(){ QAction *retval = new QAction(this); retval->setSeparator(true); return retval; }