#include #include #include #include #include #include #include #include #include #include #include #include #include #include "moviewidget.h" #include "helper.h" MovieWidget::MovieWidget(QWidget *parent) : QWidget(parent){ setPalette(qApp->palette()); setupWidget(); } void MovieWidget::setupWidget(){ QToolBar *toolbar = new QToolBar; QPixmap buttplug(":/butt_plug.png"); QMatrix rotatematrix; rotatematrix.rotate(90); QIcon buttplugRight(buttplug.transformed(rotatematrix)); rotatematrix.rotate(-180); QIcon buttplugLeft(buttplug.transformed(rotatematrix)); QAction *backA = new QAction(buttplugLeft, tr("Prev. filter"), this); toolbar->addAction(backA); QAction *forwardA = new QAction(buttplugRight, tr("Next filter"), this); toolbar->addAction(forwardA); QLabel *filterL = new QLabel(tr("Filter")); mFilterLE = new QLineEdit; connect(mFilterLE, &QLineEdit::returnPressed, [=] { mTopProxy->setFilterRegExp(QRegExp(mFilterLE->text())); }); QToolBar *filterTB = new QToolBar; QAction *clearFilter = new QAction(Helper::icon(QColor(255,85,255), Qt::white, 'X', true, true), tr("Clear"), this); connect(clearFilter, &QAction::triggered, [=] { mFilterLE->clear(); mTopProxy->setFilterRegExp(QString()); }); filterTB->addAction(clearFilter); QLabel *selectionL = new QLabel(tr("Selection")); mSelectionCB = new QComboBox; QStringList selections = QStringList() << tr("Actors") << tr("Favorites") << tr("Genres") << tr("Series"); mSelectionCB->addItems(selections); connect(mSelectionCB, &QComboBox::currentTextChanged, [=] { selectBy(mSelectionCB->currentText()); }); QHBoxLayout *topWL = new QHBoxLayout; topWL->addWidget(filterL); topWL->addWidget(mFilterLE); topWL->addWidget(filterTB); topWL->addStretch(); topWL->addWidget(toolbar); topWL->addStretch(); topWL->addWidget(selectionL); topWL->addWidget(mSelectionCB); mTopView = new QTreeView; mTopView->setAlternatingRowColors(true); mTopView->setSortingEnabled(true); mTopView->setUniformRowHeights(true); mTopView->setSelectionBehavior(QAbstractItemView::SelectRows); mTopView->setSelectionMode(QAbstractItemView::SingleSelection); mTopView->setRootIsDecorated(false); mTopModel = new QStandardItemModel; mTopProxy = new QSortFilterProxyModel; mTopProxy->setSourceModel(mTopModel); mTopView->setModel(mTopProxy); connect(mTopView->selectionModel(), &QItemSelectionModel::selectionChanged, this, &MovieWidget::topSelectionChanged); mBottomView = new QTreeView; mBottomView->setAlternatingRowColors(true); mBottomView->setSortingEnabled(true); mBottomView->setUniformRowHeights(true); mBottomView->setSelectionBehavior(QAbstractItemView::SelectRows); mBottomView->setSelectionMode(QAbstractItemView::ExtendedSelection); mBottomModel = new QStandardItemModel; mBottomProxy = new QSortFilterProxyModel; mBottomProxy->setSourceModel(mBottomModel); mBottomView->setModel(mBottomProxy); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(topWL); QSplitter *splitter = new QSplitter(Qt::Vertical); splitter->addWidget(mTopView); splitter->addWidget(mBottomView); splitter->setStretchFactor(0, 3); mainLayout->addWidget(splitter); setLayout(mainLayout); } void MovieWidget::selectBy(const QString &selection){ if(selection == "Series"){ populateBySeries(); } } void MovieWidget::populateBySeries(){ qApp->setOverrideCursor(Qt::BusyCursor); mTopView->setSortingEnabled(false); mTopView->setUpdatesEnabled(false); mTopModel->clear(); mTopModel->setHorizontalHeaderLabels(QStringList() << tr("Series")); QFont f("courier new"); QBrush blackBrush(Qt::black); QBrush greenBrush(Qt::darkGreen); QStandardItem *root = mTopModel->invisibleRootItem(); QSqlDatabase db = QSqlDatabase::database("treedb"); QSqlQuery seriesQ("SELECT series.tseries_name, seriesparts.iseriesparts_id, seriesparts.iseriespart, seriesparts.bfavorite, seriesparts.tsubtitle, count(files.*) FROM series, seriesparts, files WHERE series.iseries_id = seriesparts.iseries_id and seriesparts.iseriesparts_id = files.iseriespart_id GROUP BY series.tseries_name, seriesparts.iseriesparts_id, seriesparts.iseriespart, seriesparts.bfavorite, seriesparts.tsubtitle ORDER BY series.tseries_name, seriesparts.iseriespart, seriesparts.tsubtitle", db); while(seriesQ.next()){ QBrush currentBrush = blackBrush; QList items; QString series(seriesQ.value(0).toString()); if(seriesQ.value(2).toInt() > 0){ series.append(QString(" %1").arg(QString::number(seriesQ.value(2).toInt()))); } if(!seriesQ.value(4).toString().isEmpty()){ series.append(QString(" - %1").arg(seriesQ.value(4).toString())); } series.append(QString(tr(" (%1)")).arg(QString::number(seriesQ.value(5).toInt()))); if(seriesQ.value(3).toBool()){ currentBrush = greenBrush; } for(int i = 0; i < 1; ++i){ QStandardItem *item = new QStandardItem; item->setForeground(currentBrush); item->setData(seriesQ.value(1), SeriesPartIdRole); item->setData(seriesQ.value(5), CountRole); item->setFont(f); items << item; } items[0]->setText(series); items[0]->setIcon(QIcon(":/bizarre_amputee.png")); root->appendRow(items); } mTopView->setUpdatesEnabled(true); mTopView->setSortingEnabled(true); qApp->restoreOverrideCursor(); } void MovieWidget::topSelectionChanged(){ mBottomView->setUpdatesEnabled(false); mBottomView->setSortingEnabled(false); mBottomView->setRootIsDecorated(false); mBottomModel->clear(); QBrush blackBrush(Qt::black); QSqlDatabase db = QSqlDatabase::database("treedb"); QSqlQuery selectFilesQ(db); selectFilesQ.prepare("SELECT tfilename, cmd5sum, bisize, siquality, iduration, sifileno FROM files WHERE iseriespart_id = :arg ORDER BY sifileno"); QModelIndex selected = mTopView->selectionModel()->selectedRows().first(); if(selected.isValid()){ QFont f("courier new"); QStandardItem *root = mBottomModel->invisibleRootItem(); mBottomModel->setHorizontalHeaderLabels(QStringList() << tr("Name") << tr("No.") << tr("Q.") << tr("Size") << tr("Dur.") << tr("MD5")); selectFilesQ.bindValue(":arg", selected.data(SeriesPartIdRole)); selectFilesQ.exec(); QLocale l; while(selectFilesQ.next()){ QList items; for(int i = 0; i < 6; ++i){ QStandardItem *item = new QStandardItem; item->setFont(f); item->setForeground(blackBrush); items << item; } items[0]->setText(selectFilesQ.value(0).toString()); items[0]->setIcon(QIcon(":/hourglass_figure.png")); items[1]->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); items[1]->setText(QString::number(selectFilesQ.value(5).toInt())); items[2]->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); items[2]->setText(QString::number(selectFilesQ.value(3).toInt())); items[3]->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); items[3]->setText(l.toString(selectFilesQ.value(2).toLongLong())); items[4]->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); items[4]->setText(Helper::durationFromSecs(selectFilesQ.value(4).toLongLong())); items[5]->setText(selectFilesQ.value(1).toString()); root->appendRow(items); } } mBottomView->setUpdatesEnabled(true); mBottomView->setSortingEnabled(true); mBottomView->resizeColumnToContents(0); }