From a72d06854cfb2d41762bfde48ef1543aca47020a Mon Sep 17 00:00:00 2001 From: Arno Date: Tue, 3 Apr 2018 18:35:46 +0200 Subject: First implementation of MovieWidget It's the replacement for the archive viewer thingy. Just keep it simple and stupid. For now it shows series data. --- moviewidget.cpp | 181 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ moviewidget.h | 35 +++++++++++ shemov.cpp | 7 +++ shemov.h | 2 + shemov.pro | 6 +- 5 files changed, 229 insertions(+), 2 deletions(-) create mode 100644 moviewidget.cpp create mode 100644 moviewidget.h diff --git a/moviewidget.cpp b/moviewidget.cpp new file mode 100644 index 0000000..8e1d82a --- /dev/null +++ b/moviewidget.cpp @@ -0,0 +1,181 @@ +#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; + QToolBar *filterTB = new QToolBar; + QAction *clearFilter = new QAction(Helper::icon(QColor(255,85,255), Qt::white, 'X', true, true), tr("Clear"), this); + 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(); + 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); + 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); +} diff --git a/moviewidget.h b/moviewidget.h new file mode 100644 index 0000000..1f063d0 --- /dev/null +++ b/moviewidget.h @@ -0,0 +1,35 @@ +#ifndef MOVIEWIDGET_H +#define MOVIEWIDGET_H + +#include + +class QLineEdit; +class QComboBox; +class QTreeView; +class QSortFilterProxyModel; +class QStandardItemModel; + +class MovieWidget : public QWidget { + Q_OBJECT + public: + enum CustomRoles { SeriesPartIdRole = Qt::UserRole + 1, CountRole = Qt::UserRole + 2, MD5SumRole = Qt::UserRole + 3 }; + explicit MovieWidget(QWidget *parent = nullptr); + + private slots: + void selectBy(const QString &selection); + void populateBySeries(); + void topSelectionChanged(); + + private: + void setupWidget(); + QLineEdit *mFilterLE; + QComboBox *mSelectionCB; + QTreeView *mTopView; + QSortFilterProxyModel *mTopProxy; + QStandardItemModel *mTopModel; + QTreeView *mBottomView; + QSortFilterProxyModel *mBottomProxy; + QStandardItemModel *mBottomModel; +}; + +#endif // MOVIEWIDGET_H diff --git a/shemov.cpp b/shemov.cpp index f0ea30b..78f8216 100644 --- a/shemov.cpp +++ b/shemov.cpp @@ -35,6 +35,7 @@ #include "searchdialog.h" #include "randomtab.h" #include "fswidget.h" +#include "moviewidget.h" #include "helper.h" SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, flags) /*, mOpenWithGroupFS(0), mOpenWithGroupAV(0) */ { @@ -115,6 +116,12 @@ SheMov::SheMov(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, fla connect(mFileWidget, &FSWidget::needRefreshFs, this, &SheMov::setFsFree); connect(mFileWidget, &FSWidget::needConfig, this, &SheMov::configure); + //MovieWidget + splash.showMessage(tr("Constructing MovieWidget..."), Qt::AlignHCenter, Qt::yellow); + qApp->processEvents(); + mMovieWidget = new MovieWidget; + mTab->addTab(mMovieWidget, "MW"); + //experimental splash.showMessage(tr("Creating Movie archive..."), Qt::AlignHCenter, Qt::yellow); qApp->processEvents(); diff --git a/shemov.h b/shemov.h index 3da68e1..cb1e8ce 100644 --- a/shemov.h +++ b/shemov.h @@ -24,6 +24,7 @@ class ArchiveBrowser; class SearchDialog; class RandomTab; class FSWidget; +class MovieWidget; class SheMov : public QMainWindow { Q_OBJECT @@ -168,5 +169,6 @@ class SheMov : public QMainWindow { ArchiveBrowser *mArchiveBrowser; RandomTab *mRandomTab; FSWidget* mFileWidget; //rename me! + MovieWidget *mMovieWidget; }; #endif diff --git a/shemov.pro b/shemov.pro index bce7b12..0d464a4 100644 --- a/shemov.pro +++ b/shemov.pro @@ -45,7 +45,8 @@ SOURCES = main.cpp \ fswidget.cpp \ fsproxy.cpp \ viewer.cpp \ - fsview.cpp + fsview.cpp \ + moviewidget.cpp HEADERS = \ shemov.h \ helper.h \ @@ -85,7 +86,8 @@ HEADERS = \ fswidget.h \ fsproxy.h \ viewer.h \ - fsview.h + fsview.h \ + moviewidget.h LIBS += -lmagic -lXfixes -lX11 -lMagick++-6.Q16HDRI INCLUDEPATH += /usr/include/ImageMagick-6/ RESOURCES = shemov.qrc -- cgit v1.2.3-70-g09d2