summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--moviewidget.cpp181
-rw-r--r--moviewidget.h35
-rw-r--r--shemov.cpp7
-rw-r--r--shemov.h2
-rw-r--r--shemov.pro6
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
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