summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArno <am@disconnect.de>2010-12-28 13:32:12 +0100
committerArno <am@disconnect.de>2010-12-28 13:32:12 +0100
commited5de88d481c31fbad120332651eb746a0c03de3 (patch)
tree39c5aec18eca4ea29d8250b4f16ecfc4e934df46
parent6a56c5d5541bd471d78b4797ffccd378c1e73550 (diff)
downloadSheMov-ed5de88d481c31fbad120332651eb746a0c03de3.tar.gz
SheMov-ed5de88d481c31fbad120332651eb746a0c03de3.tar.bz2
SheMov-ed5de88d481c31fbad120332651eb746a0c03de3.zip
Pimp my filters!
Enhanced the filter function in ArchiveTreeView. The prefixes are gone. The filter mode is now selectable by menu or toolbar. Created 7 new icons, also selectable in the configuration menu. As a bonus the filter QLineEdit now comes with a QCompleter. The QStringListModel of the completer is filled in a separate thread. The QThread is only used as a resource for control. The work is done in a QObject connected to the QThread's started() signal as described in http://labs.qt.nokia.com/2006/12/04/threading-without-the-headache/
-rw-r--r--big_ass.pngbin0 -> 976 bytes
-rw-r--r--big_tit.pngbin0 -> 1064 bytes
-rw-r--r--bizarre_amputee.pngbin0 -> 688 bytes
-rw-r--r--butt_plug.pngbin0 -> 993 bytes
-rw-r--r--hourglass_figure.pngbin0 -> 925 bytes
-rw-r--r--seriestreewidget.cpp118
-rw-r--r--seriestreewidget.h44
-rw-r--r--shackles.pngbin0 -> 917 bytes
-rw-r--r--shemov.cpp70
-rw-r--r--shemov.h10
-rw-r--r--shemov.qrc8
-rw-r--r--smglobals.cpp8
-rw-r--r--spreadingpants.pngbin0 -> 1029 bytes
-rw-r--r--steel_collar.pngbin0 -> 738 bytes
14 files changed, 228 insertions, 30 deletions
diff --git a/big_ass.png b/big_ass.png
new file mode 100644
index 0000000..59574cc
--- /dev/null
+++ b/big_ass.png
Binary files differ
diff --git a/big_tit.png b/big_tit.png
new file mode 100644
index 0000000..d51c8fe
--- /dev/null
+++ b/big_tit.png
Binary files differ
diff --git a/bizarre_amputee.png b/bizarre_amputee.png
new file mode 100644
index 0000000..0b1d62a
--- /dev/null
+++ b/bizarre_amputee.png
Binary files differ
diff --git a/butt_plug.png b/butt_plug.png
new file mode 100644
index 0000000..e00d958
--- /dev/null
+++ b/butt_plug.png
Binary files differ
diff --git a/hourglass_figure.png b/hourglass_figure.png
new file mode 100644
index 0000000..f9847fc
--- /dev/null
+++ b/hourglass_figure.png
Binary files differ
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
new file mode 100644
index 0000000..dfdae6a
--- /dev/null
+++ b/shackles.png
Binary files differ
diff --git a/shemov.cpp b/shemov.cpp
index 286d33b..ccf773e 100644
--- a/shemov.cpp
+++ b/shemov.cpp
@@ -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(){
diff --git a/shemov.h b/shemov.h
index 72bdedb..bb31035 100644
--- a/shemov.h
+++ b/shemov.h
@@ -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;
diff --git a/shemov.qrc b/shemov.qrc
index ea0c039..8c0789d 100644
--- a/shemov.qrc
+++ b/shemov.qrc
@@ -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
new file mode 100644
index 0000000..5bfd0fb
--- /dev/null
+++ b/spreadingpants.png
Binary files differ
diff --git a/steel_collar.png b/steel_collar.png
new file mode 100644
index 0000000..92a125f
--- /dev/null
+++ b/steel_collar.png
Binary files differ