diff options
author | Arno <am@disconnect.de> | 2010-12-28 13:32:12 +0100 |
---|---|---|
committer | Arno <am@disconnect.de> | 2010-12-28 13:32:12 +0100 |
commit | ed5de88d481c31fbad120332651eb746a0c03de3 (patch) | |
tree | 39c5aec18eca4ea29d8250b4f16ecfc4e934df46 /seriestreewidget.cpp | |
parent | 6a56c5d5541bd471d78b4797ffccd378c1e73550 (diff) | |
download | SheMov-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/
Diffstat (limited to 'seriestreewidget.cpp')
-rw-r--r-- | seriestreewidget.cpp | 118 |
1 files changed, 97 insertions, 21 deletions
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); +} |