diff options
author | Arno <arno@disconnect.de> | 2016-09-16 08:16:43 +0200 |
---|---|---|
committer | Arno <arno@disconnect.de> | 2016-09-16 08:16:43 +0200 |
commit | df6126e9444a6ab88c2c20f8da980795e3418781 (patch) | |
tree | a8edd95ca0953f6c955555518afc29b5fc13fc9c | |
parent | 15e4220aada49707be8333402c0cd8acba1a94ce (diff) | |
download | ShemovCleaner-df6126e9444a6ab88c2c20f8da980795e3418781.tar.gz ShemovCleaner-df6126e9444a6ab88c2c20f8da980795e3418781.tar.bz2 ShemovCleaner-df6126e9444a6ab88c2c20f8da980795e3418781.zip |
Basic ActorWidget done
Next: Menubar and Toolbar...
-rw-r--r-- | ShemovCleaner.pro | 6 | ||||
-rw-r--r-- | actorwidget.cpp | 212 | ||||
-rw-r--r-- | actorwidget.h | 53 | ||||
-rw-r--r-- | higheels.png | bin | 0 -> 722 bytes | |||
-rw-r--r-- | hourglass_figure.png | bin | 0 -> 925 bytes | |||
-rw-r--r-- | shemovcleaner.cpp | 9 | ||||
-rw-r--r-- | shemovcleaner.h | 2 | ||||
-rw-r--r-- | shemovcleaner.qrc | 2 |
8 files changed, 281 insertions, 3 deletions
diff --git a/ShemovCleaner.pro b/ShemovCleaner.pro index ffdd7e3..1b3ea3b 100644 --- a/ShemovCleaner.pro +++ b/ShemovCleaner.pro @@ -24,7 +24,8 @@ SOURCES += main.cpp\ filewidget.cpp \ helper.cpp \ filedisplay.cpp \ - globals.cpp + globals.cpp \ + actorwidget.cpp HEADERS += \ filesorter.h \ @@ -36,7 +37,8 @@ HEADERS += \ filewidget.h \ helper.h \ filedisplay.h \ - globals.h + globals.h \ + actorwidget.h DISTFILES += diff --git a/actorwidget.cpp b/actorwidget.cpp new file mode 100644 index 0000000..1b57c40 --- /dev/null +++ b/actorwidget.cpp @@ -0,0 +1,212 @@ +#include <QLineEdit> +#include <QLabel> +#include <QPushButton> +#include <QTreeView> +#include <QHBoxLayout> +#include <QVBoxLayout> +#include <QGridLayout> +#include <QStandardItemModel> +#include <QStandardItem> +#include <QTreeView> +#include <QSortFilterProxyModel> +#include <QProgressBar> +#include <QSqlDatabase> +#include <QSqlQuery> +#include <QApplication> +#include <QSettings> + +#include "actorwidget.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->setHorizontalHeaderLabels(QStringList() << QChar(0x26A7) << tr("Name")); + int count = 0; + QStandardItem *root = mActorModel->invisibleRootItem(); + qApp->processEvents(); + + mAllQ.exec(); + while(mAllQ.next()){ + QList<QStandardItem*> 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); + qApp->processEvents(); + } + 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<QStandardItem*> 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<QStandardItem*> 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<QStandardItem*> 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); + } +} + +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()); + } +} + +void ActorWidget::setupGui(){ + mActor = new QLineEdit; + connect(mActor, SIGNAL(returnPressed()), this, SLOT(filter())); + QLabel *filterL = new QLabel(tr("&Filter")); + filterL->setBuddy(mActor); + QPushButton *doFilter = new QPushButton(tr("Filter")); + connect(doFilter, SIGNAL(clicked()), this, SLOT(filter())); + QPushButton *doClearFilter = new QPushButton(tr("&Clear")); + connect(doClearFilter, SIGNAL(clicked()), this, SLOT(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(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(gatherSeries())); + connect(mActorView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(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); + + QVBoxLayout *mainLayout = new QVBoxLayout; + mainLayout->addLayout(buttonLayout); + mainLayout->addWidget(new QLabel(tr("Found"))); + mainLayout->addWidget(mActorView); + mainLayout->addLayout(viewGridL); + setLayout(mainLayout); +} + +QList<QStandardItem*> ActorWidget::emptyList(){ + QList<QStandardItem*> retval; + for(int i = 0; i < ColumnCount; ++i){ + QStandardItem *item = new QStandardItem; + item->setEditable(false); + retval << item; + } + return retval; +} diff --git a/actorwidget.h b/actorwidget.h new file mode 100644 index 0000000..06e544f --- /dev/null +++ b/actorwidget.h @@ -0,0 +1,53 @@ +#ifndef ACTORWIDGET_H +#define ACTORWIDGET_H + +#include <QWidget> +#include <QSqlDatabase> +#include <QSqlQuery> + +class QLineEdit; +class QStandardItemModel; +class QStandardItem; +class QSortFilterProxyModel; +class QTreeView; +class QProgressBar; + +class ActorWidget : public QWidget { + Q_OBJECT + public: + enum { ColumnCount = 2 }; + enum Columns { IconColumn = 0, NameColumn = 1 }; + enum CustomRoles { IdRole = Qt::UserRole + 1 }; + explicit ActorWidget(QWidget *parent = 0); + ~ActorWidget(); + void setProgressBar(QProgressBar *p) { mProgress = p; } + + public slots: + void gatherData(); + void gatherSeries(); + void gatherGenres(); + void filter(); + void clearFilter(); + void readSettings(); + void writeSettings(); + + private: + void setupGui(); + QList<QStandardItem*> emptyList(); + QLineEdit *mActor; + QStandardItemModel *mActorModel; + QStandardItemModel *mSeriesModel; + QStandardItemModel *mGenresModel; + QSortFilterProxyModel *mProxy; + QTreeView *mActorView; + QTreeView *mSeriesView; + QTreeView *mGenresView; + QProgressBar *mProgress; + QSqlDatabase mDb; + QSqlQuery mAllQ; + QSqlQuery mSeriesQ; + QSqlQuery mGenresQ; + QSqlQuery mCountQ; +}; + +#endif // ACTORWIDGET_H diff --git a/higheels.png b/higheels.png Binary files differnew file mode 100644 index 0000000..f9e1800 --- /dev/null +++ b/higheels.png diff --git a/hourglass_figure.png b/hourglass_figure.png Binary files differnew file mode 100644 index 0000000..f9847fc --- /dev/null +++ b/hourglass_figure.png diff --git a/shemovcleaner.cpp b/shemovcleaner.cpp index 4bdc524..bc7b0b5 100644 --- a/shemovcleaner.cpp +++ b/shemovcleaner.cpp @@ -17,6 +17,7 @@ #include "shemovcleaner.h" #include "torrentwidget.h" #include "filewidget.h" +#include "actorwidget.h" #include "torrentdisplay.h" #include "configurationwidget.h" #include "globals.h" @@ -30,13 +31,19 @@ ShemovCleaner::ShemovCleaner(QWidget *parent, Qt::WindowFlags f) : QMainWindow(p createStatusBar(); createGlobalActions(); - mTorrentTab = new TorrentWidget; mTab = new QTabWidget; + mTorrentTab = new TorrentWidget; mFileTab = new FileWidget; mFileTab->setProgressBar(mProgressBar); mFileTab->gatherData(); + mActorTab = new ActorWidget; + mActorTab->setProgressBar(mProgressBar); + mActorTab->gatherData(); + mActorTab->readSettings(); + mTab->addTab(mTorrentTab, tr("&Torrents")); mTab->addTab(mFileTab, tr("Fi&les")); + mTab->addTab(mActorTab, tr("&Actors")); setCentralWidget(mTab); connect(mTorrentTab, SIGNAL(statusMessage(QString)), this, SLOT(statusBarMessage(QString))); diff --git a/shemovcleaner.h b/shemovcleaner.h index 875b05d..17c9da5 100644 --- a/shemovcleaner.h +++ b/shemovcleaner.h @@ -8,6 +8,7 @@ class TorrentWidget; class FileWidget; class QLabel; class QProgressBar; +class ActorWidget; class ShemovCleaner : public QMainWindow { Q_OBJECT @@ -37,6 +38,7 @@ class ShemovCleaner : public QMainWindow { QTabWidget *mTab; TorrentWidget *mTorrentTab; FileWidget *mFileTab; + ActorWidget *mActorTab; }; #endif // SHEMOVCLEANER_H diff --git a/shemovcleaner.qrc b/shemovcleaner.qrc index ba0f137..286aab7 100644 --- a/shemovcleaner.qrc +++ b/shemovcleaner.qrc @@ -14,5 +14,7 @@ <file>back_dick.png</file> <file>edit-cut.png</file> <file>edit-paste.png</file> + <file>higheels.png</file> + <file>hourglass_figure.png</file> </qresource> </RCC> |