diff options
-rw-r--r-- | big_ass.png | bin | 0 -> 976 bytes | |||
-rw-r--r-- | big_tit.png | bin | 0 -> 1064 bytes | |||
-rw-r--r-- | bizarre_amputee.png | bin | 0 -> 688 bytes | |||
-rw-r--r-- | butt_plug.png | bin | 0 -> 993 bytes | |||
-rw-r--r-- | hourglass_figure.png | bin | 0 -> 925 bytes | |||
-rw-r--r-- | seriestreewidget.cpp | 118 | ||||
-rw-r--r-- | seriestreewidget.h | 44 | ||||
-rw-r--r-- | shackles.png | bin | 0 -> 917 bytes | |||
-rw-r--r-- | shemov.cpp | 70 | ||||
-rw-r--r-- | shemov.h | 10 | ||||
-rw-r--r-- | shemov.qrc | 8 | ||||
-rw-r--r-- | smglobals.cpp | 8 | ||||
-rw-r--r-- | spreadingpants.png | bin | 0 -> 1029 bytes | |||
-rw-r--r-- | steel_collar.png | bin | 0 -> 738 bytes |
14 files changed, 228 insertions, 30 deletions
diff --git a/big_ass.png b/big_ass.png Binary files differnew file mode 100644 index 0000000..59574cc --- /dev/null +++ b/big_ass.png diff --git a/big_tit.png b/big_tit.png Binary files differnew file mode 100644 index 0000000..d51c8fe --- /dev/null +++ b/big_tit.png diff --git a/bizarre_amputee.png b/bizarre_amputee.png Binary files differnew file mode 100644 index 0000000..0b1d62a --- /dev/null +++ b/bizarre_amputee.png diff --git a/butt_plug.png b/butt_plug.png Binary files differnew file mode 100644 index 0000000..e00d958 --- /dev/null +++ b/butt_plug.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/seriestreewidget.cpp b/seriestreewidget.cpp index f068d29..19617a7 100644 --- a/seriestreewidget.cpp +++ b/seriestreewidget.cpp @@ -25,6 +25,11 @@ #include <QEvent> #include <QHoverEvent> #include <QPalette> +#include <QCompleter> +#include <QStringListModel> +#include <QSqlQuery> +#include <QSqlDatabase> +#include <QThread> #include "seriestreewidget.h" #include "smtreemodel.h" @@ -49,6 +54,8 @@ SeriesTreeWidget::SeriesTreeWidget(QWidget *parent) : QWidget(parent){ filterLayout->addWidget(mFilterEdit); filterLayout->addWidget(mFilter); filterLayout->addWidget(mClear); + mFilterCompleter = new QCompleter(this); + mFilterEdit->setCompleter(mFilterCompleter); //the view mView = new SeriesTreeView; @@ -77,6 +84,12 @@ SeriesTreeWidget::SeriesTreeWidget(QWidget *parent) : QWidget(parent){ mainLayout->addWidget(mView); setLayout(mainLayout); + //misc + mCompleterProducerThread = new QThread(this); + mCompleterProducer = new CompleterProducer; + mCompleterProducer->moveToThread(mCompleterProducerThread); + connect(mCompleterProducerThread, SIGNAL(started()), mCompleterProducer, SLOT(produce())); + connect(mCompleterProducer, SIGNAL(done(QStringListModel*)), this, SLOT(producerFinished(QStringListModel*))); } void SeriesTreeWidget::newSeries(){ @@ -194,6 +207,7 @@ void SeriesTreeWidget::readSettings(){ mView->selectionModel()->select(real, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Current | QItemSelectionModel::Rows); mView->setCurrentIndex(real); } + mFilterEdit->setText(s.value("archive/filtertext").toString()); } void SeriesTreeWidget::writeSettings(){ @@ -204,6 +218,8 @@ void SeriesTreeWidget::writeSettings(){ if(!selected.isEmpty()){ s.setValue("archive/selectedseries", selected.at(0).data(SeriesTreeModel::NameRole).toString()); } + s.setValue("archive/filtermode", mFilterMode); + s.setValue("archive/filtertext", mFilterEdit->text()); } void SeriesTreeWidget::expandCurrent(){ @@ -221,26 +237,27 @@ void SeriesTreeWidget::filter(){ clearFilter(); return; } - QRegExp pattern("^([a-z]):\\s+"); - QString op; - if(pattern.indexIn(filterText) != -1){ - op = pattern.cap(1); - filterText.remove(pattern); - } - if(op == "a"){ - mModel->setMappingFilter(filterText, "actor"); - }else if(op == "g"){ - mModel->setMappingFilter(filterText, "genre"); - }else if(op == "q"){ - mModel->setFileFilter(filterText, "siquality", SeriesTreeModel::NumericQuery); - }else if(op == "n"){ - mModel->setFileFilter(filterText, "tfilename", SeriesTreeModel::TextQuery); - }else if(op == "d"){ - mModel->setFileFilter(filterText, "idvd", SeriesTreeModel::NumericQuery); - }else if(op == "s"){ - mModel->setFileFilter(filterText, "bisize", SeriesTreeModel::NumericQuery); - }else{ - mProxy->setFilterRegExp(mFilterEdit->text()); + switch(mFilterMode){ + case FilterActor: + mModel->setMappingFilter(filterText, "actor"); + break; + case FilterGenre: + mModel->setMappingFilter(filterText, "genre"); + break; + case FilterQuality: + mModel->setFileFilter(filterText, "siquality", SeriesTreeModel::NumericQuery); + break; + case FilterFileName: + mModel->setFileFilter(filterText, "tfilename", SeriesTreeModel::TextQuery); + break; + case FilterDvdNo: + mModel->setFileFilter(filterText, "idvd", SeriesTreeModel::NumericQuery); + break; + case FilterSize: + mModel->setFileFilter(filterText, "bisize", SeriesTreeModel::NumericQuery); + break; + default: + mProxy->setFilterRegExp(mFilterEdit->text()); } } @@ -281,6 +298,11 @@ void SeriesTreeWidget::editItem(){ } } +void SeriesTreeWidget::producerFinished(QStringListModel *model){ + mFilterCompleter->setModel(model); + mCompleterProducerThread->quit(); +} + void SeriesTreeWidget::addCover(){ QModelIndexList selected = mView->selectionModel()->selectedRows(); if(selected.isEmpty()){ @@ -313,6 +335,12 @@ void SeriesTreeWidget::addCover(){ } } +void SeriesTreeWidget::setFilterMode(int mode){ + mFilterMode = mode; + mCompleterProducer->setMode(mode); + mCompleterProducerThread->start(); +} + SeriesTreeView::SeriesTreeView(QWidget *parent) : QTreeView(parent), mHoverWin(new HoverWindow), mHover(false) { setAttribute(Qt::WA_Hover); readSettings(); @@ -322,7 +350,6 @@ void SeriesTreeView::readSettings(){ QSettings s; mHover = s.value("ui/hoverarchive", true).toBool(); mHoverWin->setWindowOpacity(s.value("ui/hoveropacity", 10).toFloat() / 10.0); - } void SeriesTreeView::contextMenuEvent(QContextMenuEvent *e){ @@ -471,3 +498,52 @@ void AddCoverDialog::typeChanged(const QString &type){ ++it; } } + +CompleterProducer::CompleterProducer(int Mode, QObject *parent) : QObject(parent), mMode(Mode){ + mDb = QSqlDatabase::cloneDatabase(QSqlDatabase::database("treedb"), "complprod"); + mDb.open(); + mSeriesQuery = new QSqlQuery(mDb); + mSeriesQuery->prepare("SELECT DISTINCT(tseries_name) FROM series"); + mQueryHash.insert(SeriesTreeWidget::FilterSeries, mSeriesQuery); + mActorsQuery = new QSqlQuery(mDb); + mActorsQuery->prepare("SELECT DISTINCT(tactorname) FROM actors"); + mQueryHash.insert(SeriesTreeWidget::FilterActor, mActorsQuery); + mGenresQuery = new QSqlQuery(mDb); + mGenresQuery->prepare("SELECT DISTINCT(tgenrename) FROM genres"); + mQueryHash.insert(SeriesTreeWidget::FilterGenre, mGenresQuery); + mFileNameQuery = new QSqlQuery(mDb); + mFileNameQuery->prepare("SELECT DISTINCT(tfilename) FROM files"); + mQueryHash.insert(SeriesTreeWidget::FilterFileName, mFileNameQuery); + mSizeQuery = new QSqlQuery(mDb); + mSizeQuery->prepare("SELECT DISTINCT(bisize) FROM files"); + mQueryHash.insert(SeriesTreeWidget::FilterSize, mSizeQuery); + mQualityQuery = new QSqlQuery(mDb); + mQualityQuery->prepare("SELECT DISTINCT(siquality) FROM files"); + mQueryHash.insert(SeriesTreeWidget::FilterQuality, mQualityQuery); + mDvdNoQuery = new QSqlQuery(mDb); + mDvdNoQuery->prepare("SELECT DISTINCT(siquality) FROM files"); + mQueryHash.insert(SeriesTreeWidget::FilterDvdNo, mDvdNoQuery); + mModel = new QStringListModel; +} + +CompleterProducer::~CompleterProducer(){ + delete mSeriesQuery; + delete mActorsQuery; + delete mGenresQuery; + delete mFileNameQuery; + delete mSizeQuery; + delete mQualityQuery; + delete mDvdNoQuery; + mDb.close(); +} + +void CompleterProducer::produce(){ + QSqlQuery *query = mQueryHash.value(mMode); + QStringList values; + query->exec(); + while(query->next()){ + values << query->value(0).toString(); + } + mModel->setStringList(values); + emit done(mModel); +} diff --git a/seriestreewidget.h b/seriestreewidget.h index fc55415..02a6693 100644 --- a/seriestreewidget.h +++ b/seriestreewidget.h @@ -12,6 +12,8 @@ #include <QTreeView> #include <QSortFilterProxyModel> #include <QDialog> +#include <QSqlDatabase> +#include <QHash> class QLineEdit; class QPushButton; @@ -19,6 +21,10 @@ class QSortFilterProxyModel; class QComboBox; class QEvent; class QLabel; +class QCompleter; +class QStringListModel; +class QSqlQuery; +class QThread; class SeriesTreeModel; class SeriesTreeView; class SeriesTreeSortModel; @@ -26,13 +32,16 @@ class HoverWindow; class FilesTreeModel; class AddCoverDialog; class HoverWindow; +class CompleterProducer; class SeriesTreeWidget : public QWidget { Q_OBJECT public: + enum FilterMode { FilterSeries = 1, FilterActor = 2, FilterGenre = 3, FilterSize = 4, FilterQuality = 5, FilterFileName = 6, FilterDvdNo = 7 }; explicit SeriesTreeWidget(QWidget *parent = 0); SeriesTreeView *seriesTree() { return mView; } SeriesTreeSortModel *seriesProxy() { return mProxy; } + int filterMode() const { return mFilterMode; } public slots: void newSeries(); @@ -42,15 +51,17 @@ class SeriesTreeWidget : public QWidget { void writeSettings(); void expandCurrent(); void addCover(); + void setFilterMode(int mode); + void filter(); private slots: - void filter(); void clearFilter(); void resort(); void itemExpanded(const QModelIndex &); void itemCollaped(const QModelIndex &); void expandItems(const QStringList &items); void editItem(); + void producerFinished(QStringListModel *model); signals: void filesReload(); @@ -64,6 +75,10 @@ class SeriesTreeWidget : public QWidget { SeriesTreeModel *mModel; AddCoverDialog *mCoverDialog; QStringList mExpandedItems; + int mFilterMode; + QCompleter *mFilterCompleter; + QThread *mCompleterProducerThread; + CompleterProducer *mCompleterProducer; }; class SeriesTreeView : public QTreeView { @@ -119,4 +134,31 @@ class AddCoverDialog : public QDialog { FilesTreeModel *mFilesModel; }; +class CompleterProducer : public QObject { + Q_OBJECT + public: + CompleterProducer(int Mode = SeriesTreeWidget::FilterSeries, QObject *parent = 0); + ~CompleterProducer(); + + public slots: + void produce(); + void setMode(int mode) { mMode = mode; } + + signals: + void done(QStringListModel *model); + + private: + QStringListModel *mModel; + int mMode; + QSqlDatabase mDb; + QSqlQuery *mSeriesQuery; + QSqlQuery *mActorsQuery; + QSqlQuery *mGenresQuery; + QSqlQuery *mSizeQuery; + QSqlQuery *mQualityQuery; + QSqlQuery *mFileNameQuery; + QSqlQuery *mDvdNoQuery; + QHash<int, QSqlQuery*> mQueryHash; +}; + #endif diff --git a/shackles.png b/shackles.png Binary files differnew file mode 100644 index 0000000..dfdae6a --- /dev/null +++ b/shackles.png @@ -171,6 +171,7 @@ void SheMov::tabChanged(int newTab){ mBackDirA->setEnabled(true); mShowNoCoverDialogA->setEnabled(false); mFilesTreeHeadersGroup->setEnabled(false); + mFilterGroup->setEnabled(false); } if(newTab == 1){ setWindowTitle(mATree->windowTitle()); @@ -178,6 +179,7 @@ void SheMov::tabChanged(int newTab){ mBackDirA->setEnabled(false); mShowNoCoverDialogA->setEnabled(true); mFilesTreeHeadersGroup->setEnabled(true); + mFilterGroup->setEnabled(true); } updateSelectionCount(QItemSelection(), QItemSelection()); } @@ -479,6 +481,46 @@ void SheMov::createActions(){ connect(mHoverMoviesA, SIGNAL(triggered()), hoverMapper, SLOT(map())); mHoverTreeGroup->addAction(mHoverMoviesA); + //Tree view filter + mFilterGroup = new QActionGroup(this); + mFilterMapper = new QSignalMapper(this); + mFilterBySeriesA = new QAction(QIcon(":/butt_plug.png"), tr("Series name"), this); + mFilterBySeriesA->setCheckable(true); + mFilterMapper->setMapping(mFilterBySeriesA, SeriesTreeWidget::FilterSeries); + connect(mFilterBySeriesA, SIGNAL(triggered()), mFilterMapper, SLOT(map())); + mFilterGroup->addAction(mFilterBySeriesA); + mFilterByActorA = new QAction(QIcon(":/bizarre_amputee.png"), tr("Actor"), this); + mFilterByActorA->setCheckable(true); + mFilterMapper->setMapping(mFilterByActorA, SeriesTreeWidget::FilterActor); + connect(mFilterByActorA, SIGNAL(triggered()), mFilterMapper, SLOT(map())); + mFilterGroup->addAction(mFilterByActorA); + mFilterByGenreA = new QAction(QIcon(":/spreadingpants.png"), tr("Genre"), this); + mFilterByGenreA->setCheckable(true); + mFilterMapper->setMapping(mFilterByGenreA, SeriesTreeWidget::FilterGenre); + connect(mFilterByGenreA, SIGNAL(triggered()), mFilterMapper, SLOT(map())); + mFilterGroup->addAction(mFilterByGenreA); + mFilterByQualityA = new QAction(QIcon(":/shackles.png"), tr("Quality"), this); + mFilterByQualityA->setCheckable(true); + mFilterMapper->setMapping(mFilterByQualityA, SeriesTreeWidget::FilterQuality); + connect(mFilterByQualityA, SIGNAL(triggered()), mFilterMapper, SLOT(map())); + mFilterGroup->addAction(mFilterByQualityA); + mFilterByFilenameA = new QAction(QIcon(":/steel_collar.png"), tr("Filename"), this); + mFilterByFilenameA->setCheckable(true); + mFilterMapper->setMapping(mFilterByFilenameA, SeriesTreeWidget::FilterFileName); + connect(mFilterByFilenameA, SIGNAL(triggered()), mFilterMapper, SLOT(map())); + mFilterGroup->addAction(mFilterByFilenameA); + mFilterByDvdNoA = new QAction(QIcon(":/big_ass.png"), tr("Dvd No."), this); + mFilterByDvdNoA->setCheckable(true); + mFilterMapper->setMapping(mFilterByDvdNoA, SeriesTreeWidget::FilterDvdNo); + connect(mFilterByDvdNoA, SIGNAL(triggered()), mFilterMapper, SLOT(map())); + mFilterGroup->addAction(mFilterByDvdNoA); + mFilterBySizeA = new QAction(QIcon(":/hourglass_figure.png"), tr("Size"), this); + mFilterBySizeA->setCheckable(true); + mFilterMapper->setMapping(mFilterBySizeA, SeriesTreeWidget::FilterSize); + connect(mFilterBySizeA, SIGNAL(triggered()), mFilterMapper, SLOT(map())); + mFilterGroup->addAction(mFilterBySizeA); + connect(mFilterMapper, SIGNAL(mapped(int)), mATree->seriesWidget(), SLOT(setFilterMode(int))); + //file view hover mFSHoverGroup = new QActionGroup(this); mFSHoverGroup->setExclusive(false); @@ -594,26 +636,29 @@ void SheMov::createMenus(){ sep14->setSeparator(true); mTreeViewMenu->addAction(sep14); mTreeHeaderMenu = new QMenu(tr("Show headers"), this); - foreach(QAction *a, mFilesTreeHeadersGroup->actions()){ - mTreeHeaderMenu->addAction(a); - } + mTreeHeaderMenu->addActions(mFilesTreeHeadersGroup->actions()); mTreeViewMenu->addMenu(mTreeHeaderMenu); QAction *sep15 = new QAction(this); sep15->setSeparator(true); mTreeViewMenu->addAction(sep15); mTreeHoverMenu = new QMenu(tr("Hover over"), this); - foreach(QAction *a, mHoverTreeGroup->actions()){ - mTreeHoverMenu->addAction(a); - } + mTreeHoverMenu->addActions(mHoverTreeGroup->actions()); mTreeViewMenu->addMenu(mTreeHoverMenu); mViewAVMenuA = menuBar()->addMenu(mTreeViewMenu); + mTreeFilterMenu = new QMenu(tr("Filter by"), this); + mTreeFilterMenu->addActions(mFilterGroup->actions()); + QAction *sep17 = new QAction(this); + sep17->setSeparator(true); + mTreeViewMenu->addAction(sep17); + mTreeViewMenu->addMenu(mTreeFilterMenu); //FileSystem view menu mFSViewMenu = new QMenu(tr("&View"), this); mFSHoverMenu = new QMenu(tr("Hover over"), this); - foreach(QAction *a, mFSHoverGroup->actions()){ + mFSHoverMenu->addActions(mFSHoverGroup->actions()); + /*foreach(QAction *a, mFSHoverGroup->actions()){ mFSHoverMenu->addAction(a); - } + }*/ mFSViewMenu->addMenu(mFSHoverMenu); mViewFSMenuA = menuBar()->addMenu(mFSViewMenu); @@ -779,6 +824,8 @@ void SheMov::createToolBar(){ toolBar->addAction(mShowArchivedA); toolBar->addAction(mShowLocalA); toolBar->addSeparator(); + toolBar->addActions(mFilterGroup->actions()); + toolBar->addSeparator(); toolBar->addAction(mHoverPicsA); toolBar->addAction(mHoverArchiveA); toolBar->addAction(mHoverDirectoriesA); @@ -871,6 +918,13 @@ void SheMov::readSettings(){ pal.setColor(QPalette::AlternateBase, Qt::white); } qApp->setPalette(pal); + int seriesFilterMode = s.value("archive/filtermode").toInt(); + QAction *filterAction = qobject_cast<QAction*>(mFilterMapper->mapping(seriesFilterMode)); + if(filterAction){ + filterAction->trigger(); + mATree->seriesWidget()->filter(); + } + } void SheMov::checkConsistency(){ @@ -123,6 +123,14 @@ class SheMov : public QMainWindow { QAction *mHoverArchiveA; QAction *mHoverMoviesA; QActionGroup *mHoverTreeGroup; + QAction *mFilterBySeriesA; + QAction *mFilterByActorA; + QAction *mFilterByGenreA; + QAction *mFilterByQualityA; + QAction *mFilterByFilenameA; + QAction *mFilterByDvdNoA; + QAction *mFilterBySizeA; + QActionGroup *mFilterGroup; //TreeView FileWidget Actions QAction *mMoveToBurnA; @@ -148,6 +156,7 @@ class SheMov : public QMainWindow { QSignalMapper *mOpenWithMapperFS; QSignalMapper *mOpenWithMapperAV; QSignalMapper *mCleanupMapper; + QSignalMapper *mFilterMapper; QMenu *mEditFSMenu; QMenu *mEditAVMenu; @@ -158,6 +167,7 @@ class SheMov : public QMainWindow { QMenu *mFSViewMenu; QMenu *mTreeHeaderMenu; QMenu *mTreeHoverMenu; + QMenu *mTreeFilterMenu; QMenu *mFSHoverMenu; QAction *mEditFSMenuA; QAction *mEditAVMenuA; @@ -19,5 +19,13 @@ <file>higheels.png</file> <file>ball_gag.png</file> <file>french_maid_dress.png</file> + <file>shackles.png</file> + <file>steel_collar.png</file> + <file>butt_plug.png</file> + <file>hourglass_figure.png</file> + <file>big_ass.png</file> + <file>big_tit.png</file> + <file>bizarre_amputee.png</file> + <file>spreadingpants.png</file> </qresource> </RCC> diff --git a/smglobals.cpp b/smglobals.cpp index f0906f1..e5b4df8 100644 --- a/smglobals.cpp +++ b/smglobals.cpp @@ -121,6 +121,14 @@ SmGlobals::SmGlobals() : mPictureViewer(0), mFrameCache(0){ mIcons.insert("High heels", ":/higheels.png"); mIcons.insert("Ball gag", ":/ball_gag.png"); mIcons.insert("French Maid Dress", ":/french_maid_dress.png"); + mIcons.insert("Shackles", ":/shackles.png"); + mIcons.insert("Steel collar", ":/steel_collar.png"); + mIcons.insert("Butt plug", ":/butt_plug.png"); + mIcons.insert("Hourglass figure", ":/hourglass_figure.png"); + mIcons.insert("Big ass", ":/big_ass.png"); + mIcons.insert("Big tit", ":/big_tit.png"); + mIcons.insert("Bizarre amputee", ":/bizarre_amputee.png"); + mIcons.insert("Spreading pants", ":/spreadingpants.png"); } //FrameCache diff --git a/spreadingpants.png b/spreadingpants.png Binary files differnew file mode 100644 index 0000000..5bfd0fb --- /dev/null +++ b/spreadingpants.png diff --git a/steel_collar.png b/steel_collar.png Binary files differnew file mode 100644 index 0000000..92a125f --- /dev/null +++ b/steel_collar.png |