diff options
-rw-r--r-- | moviewidget.cpp | 181 | ||||
-rw-r--r-- | moviewidget.h | 35 | ||||
-rw-r--r-- | shemov.cpp | 7 | ||||
-rw-r--r-- | shemov.h | 2 | ||||
-rw-r--r-- | shemov.pro | 6 |
5 files changed, 229 insertions, 2 deletions
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 <QToolBar> +#include <QLabel> +#include <QLineEdit> +#include <QComboBox> +#include <QTreeView> +#include <QSortFilterProxyModel> +#include <QStandardItemModel> +#include <QHBoxLayout> +#include <QVBoxLayout> +#include <QSplitter> +#include <QSqlDatabase> +#include <QSqlQuery> +#include <QApplication> + +#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<QStandardItem*> 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<QStandardItem*> 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 <QWidget> + +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 @@ -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(); @@ -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 @@ -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 |