summaryrefslogtreecommitdiffstats
path: root/seriestreewidget.cpp
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 /seriestreewidget.cpp
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/
Diffstat (limited to 'seriestreewidget.cpp')
-rw-r--r--seriestreewidget.cpp118
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);
+}