diff options
-rw-r--r-- | seriestreemodel.cpp | 103 | ||||
-rw-r--r-- | seriestreemodel.h | 8 | ||||
-rw-r--r-- | seriestreewidget.cpp | 49 | ||||
-rw-r--r-- | seriestreewidget.h | 3 |
4 files changed, 158 insertions, 5 deletions
diff --git a/seriestreemodel.cpp b/seriestreemodel.cpp index e25e759..0f20f3a 100644 --- a/seriestreemodel.cpp +++ b/seriestreemodel.cpp @@ -40,6 +40,8 @@ SeriesTreeModel::SeriesTreeModel(QStringList &headers, QObject *parent) : SmTree mSortedMovieListQuery->prepare("SELECT files.tfilename, files.cmd5sum FROM series, seriesparts, files WHERE series.iseries_id = :id AND seriesparts.iseries_id = series.iseries_id AND seriesparts.iseriesparts_id = files.iseriespart_id AND files.sifiletype = 1 ORDER BY seriesparts.iseriespart, files.sifileno"); mNextDvdNoQuery = new QSqlQuery(mDb); mNextDvdNoQuery->prepare("SELECT MAX(idvd) FROM files"); + mGenreFilterQuery = new QSqlQuery(mDb); + mGenreFilterQuery->prepare("SELECT DISTINCT(series.iseries_id), series.tseries_name FROM series, seriesparts, seriesparts_genremap, genres where tgenrename LIKE :pat AND genres.igenres_id = seriesparts_genremap.igenres_id AND seriesparts_genremap.iseriesparts_id = seriesparts.iseriesparts_id AND seriesparts.iseries_id = series.iseries_id"); populate(); } @@ -324,9 +326,110 @@ bool SeriesTreeModel::addSeriesPart(int seriesPart, const QModelIndex &parent){ return false; } +void SeriesTreeModel::clearFilter(){ + populate(); +} + +void SeriesTreeModel::setMappingFilter(const QString &filter, const QString &table){ + QString pattern = QString("%%1%").arg(filter); + QString tableIdTemplate = QString("SELECT i%1s_id FROM %1s WHERE t%1name LIKE :pat").arg(table); + QSqlQuery tableIdQuery(mDb); + tableIdQuery.prepare(tableIdTemplate); + tableIdQuery.bindValue(":pat", pattern); + if(tableIdQuery.exec()){ + mSeriesPartSeriesMap.clear(); + QStringList ids; + SmTreeItem *rootItem = new SmTreeItem(5); + while(tableIdQuery.next()){ + ids << QString::number(tableIdQuery.value(0).toInt()); + } + if(ids.isEmpty()){ + return; + } + QString seriesPartsTemplate("SELECT DISTINCT(seriesparts.iseriesparts_id), seriesparts.iseriespart FROM seriesparts, seriesparts_%1map WHERE seriesparts.iseries_id = :id AND seriesparts_%1map.iseriesparts_id = seriesparts.iseriesparts_id AND seriesparts_%1map.i%1s_id IN (%2) ORDER BY iseriespart"); + QString seriesIdTemplate = QString("SELECT DISTINCT(series.iseries_id), series.tseries_name FROM series, seriesparts, seriesparts_%1map, %1s WHERE %1s.i%1s_id IN (%2) AND %1s.i%1s_id = seriesparts_%1map.i%1s_id AND seriesparts_%1map.iseriesparts_id = seriesparts.iseriesparts_id AND seriesparts.iseries_id = series.iseries_id ORDER BY series.tseries_name").arg(table).arg(ids.join(",")); + QSqlQuery seriesIdQuery(seriesIdTemplate, mDb); + while(seriesIdQuery.next()){ + QList<QVariant> seriesData; + seriesData << seriesIdQuery.value(1) << seriesIdQuery.value(0) << QVariant() << QVariant() << Series; + SmTreeItem *seriesItem = new SmTreeItem(seriesData, rootItem); + rootItem->appendChild(seriesItem); + QString partsQueryString = seriesPartsTemplate.arg(table).arg(ids.join(",")); + QSqlQuery partsQuery(mDb); + partsQuery.prepare(partsQueryString); + partsQuery.bindValue(":id", seriesIdQuery.value(0)); + partsQuery.exec(); + while(partsQuery.next()){ + QList<QVariant> partData; + partData << seriesData.at(Name) << seriesData.at(SeriesId) << partsQuery.value(0) << partsQuery.value(1) << Part; + SmTreeItem *partItem = new SmTreeItem(partData, seriesItem); + seriesItem->appendChild(partItem); + mSeriesPartSeriesMap.insert(partsQuery.value(0).toInt(), seriesData.at(1).toInt()); + } + } + setRoot(rootItem); + } +} + +void SeriesTreeModel::setFileFilter(const QString &filter, const QString &column, int queryType){ + QSqlQuery seriesIdQuery(mDb); + QString partsQueryTemplate; + QString op("="); + QString value = filter; + if(queryType == TextQuery){ + QString idQueryTemplate = QString("SELECT DISTINCT(series.iseries_id), series.tseries_name FROM series, seriesparts, files WHERE files.%1 LIKE :value AND files.iseriespart_id = seriesparts.iseriesparts_id AND seriesparts.iseries_id = series.iseries_id ORDER BY series.tseries_name").arg(column); + seriesIdQuery.prepare(idQueryTemplate); + value = QString("%%1%").arg(filter); + seriesIdQuery.bindValue(":value", value); + partsQueryTemplate = QString("SELECT DISTINCT(seriesparts.iseriesparts_id), seriesparts.iseriespart FROM seriesparts, series, files WHERE series.iseries_id = :id AND series.iseries_id = seriesparts.iseries_id AND seriesparts.iseriesparts_id = files.iseriespart_id AND files.%1 LIKE :value"); + }else if(queryType == NumericQuery){ + if(value.startsWith("<") || value.startsWith(">") || value.startsWith("=")){ + op = value.at(0); + value = value.right(value.size() - 1); + } + QString idQueryTemplate = QString("SELECT DISTINCT(series.iseries_id), series.tseries_name FROM series, seriesparts, files WHERE files.%1 %2 :value AND files.iseriespart_id = seriesparts.iseriesparts_id AND seriesparts.iseries_id = series.iseries_id ORDER BY series.tseries_name").arg(column).arg(op); + seriesIdQuery.prepare(idQueryTemplate); + seriesIdQuery.bindValue(":value", value); + partsQueryTemplate = QString("SELECT DISTINCT(seriesparts.iseriesparts_id), seriesparts.iseriespart FROM seriesparts, series, files WHERE series.iseries_id = :id AND series.iseries_id = seriesparts.iseries_id AND seriesparts.iseriesparts_id = files.iseriespart_id AND files.%1 %2 :value"); + }else{ + return; + } + if(seriesIdQuery.exec()){ + mSeriesPartSeriesMap.clear(); + SmTreeItem *rootItem = new SmTreeItem(5); + while(seriesIdQuery.next()){ + QList<QVariant> seriesData; + seriesData << seriesIdQuery.value(1) << seriesIdQuery.value(0) << QVariant() << QVariant() << Series; + SmTreeItem *seriesItem = new SmTreeItem(seriesData, rootItem); + rootItem->appendChild(seriesItem); + QString partsQueryString; + if(queryType == TextQuery){ + partsQueryString = partsQueryTemplate.arg(column); + value = QString("%%1%").arg(value); + }else{ + partsQueryString = partsQueryTemplate.arg(column).arg(op); + } + QSqlQuery partsQuery(mDb); + partsQuery.prepare(partsQueryString); + partsQuery.bindValue(":id", seriesIdQuery.value(0)); + partsQuery.bindValue(":value", value); + if(partsQuery.exec()){ + while(partsQuery.next()){ + QList<QVariant> partData; + partData << seriesData.at(Name) << seriesData.at(SeriesId) << partsQuery.value(0) << partsQuery.value(1) << Part; + SmTreeItem *partItem = new SmTreeItem(partData, seriesItem); + seriesItem->appendChild(partItem); + mSeriesPartSeriesMap.insert(partsQuery.value(0).toInt(), seriesData.at(1).toInt()); + } + } + } + setRoot(rootItem); + } +} void SeriesTreeModel::populate(){ QSqlQuery seriesQuery = QSqlQuery("SELECT iseries_id, tseries_name FROM series ORDER BY tseries_name", mDb); + mSeriesPartSeriesMap.clear(); SmTreeItem *rootItem = new SmTreeItem(5); while(seriesQuery.next()){ QList<QVariant> seriesData; diff --git a/seriestreemodel.h b/seriestreemodel.h index 59d5b87..d7e7a12 100644 --- a/seriestreemodel.h +++ b/seriestreemodel.h @@ -23,6 +23,8 @@ class SeriesTreeModel : public SmTreeModel { enum CustomRoles { NameRole = Qt::UserRole + 1, SeriesIdRole = Qt::UserRole + 2, SeriesPartIdRole = Qt::UserRole + 3, SeriesPartRole = Qt::UserRole + 4, TypeRole = Qt::UserRole + 5 }; enum Fields { Name = 0, SeriesId = 1, SeriesPartId = 2, SeriesPart = 3, Type = 4 }; enum Types { Series, Part, NewSeries }; + //enum Filter { ClearFilter, ActorFilter, GenreFilter }; + enum QueryType { NumericQuery, TextQuery }; explicit SeriesTreeModel(QStringList &headers, QObject *parent = 0); ~SeriesTreeModel(); @@ -45,6 +47,11 @@ class SeriesTreeModel : public SmTreeModel { bool addSeries(const QVariant &seriesName, const QModelIndex &parent); bool addSeriesPart(int seriesPart, const QModelIndex &parent); + //filter + void clearFilter(); + void setMappingFilter(const QString &filter, const QString &table); + void setFileFilter(const QString &filter, const QString &column, int queryType); + signals: void needResort(); @@ -65,6 +72,7 @@ class SeriesTreeModel : public SmTreeModel { QSqlQuery *mSeriesPartInsertQuery; QSqlQuery *mSortedMovieListQuery; QSqlQuery *mNextDvdNoQuery; + QSqlQuery *mGenreFilterQuery; QHash<int, int> mSeriesPartSeriesMap; }; diff --git a/seriestreewidget.cpp b/seriestreewidget.cpp index 3452931..b09d7f7 100644 --- a/seriestreewidget.cpp +++ b/seriestreewidget.cpp @@ -36,12 +36,15 @@ SeriesTreeWidget::SeriesTreeWidget(QWidget *parent) : QWidget(parent){ mFilterEdit = new QLineEdit; l1->setBuddy(mFilterEdit); mFilter = new QPushButton(tr("Filter")); + mClear = new QPushButton(tr("Clear")); QHBoxLayout *filterLayout = new QHBoxLayout; connect(mFilter, SIGNAL(clicked()), this, SLOT(filter())); connect(mFilterEdit, SIGNAL(returnPressed()), this, SLOT(filter())); + connect(mClear, SIGNAL(clicked()), this, SLOT(clearFilter())); filterLayout->addWidget(l1); filterLayout->addWidget(mFilterEdit); filterLayout->addWidget(mFilter); + filterLayout->addWidget(mClear); //the view mView = new SeriesTreeView; @@ -174,10 +177,7 @@ void SeriesTreeWidget::deleteFromSeries(){ void SeriesTreeWidget::readSettings(){ QSettings s; QStringList expanded = s.value("archive/expanded").toStringList(); - foreach(QString s, expanded){ - QModelIndex idx = mProxy->mapFromSource(mModel->findValue(s)); - mView->expand(idx); - } + expandItems(expanded); int sortOrder = s.value("archive/sortorder", Qt::DescendingOrder).toInt(); mView->sortByColumn(0, static_cast<Qt::SortOrder>(sortOrder)); QString selectedSeries = s.value("archive/selectedseries").toString(); @@ -210,7 +210,39 @@ void SeriesTreeWidget::expandCurrent(){ } void SeriesTreeWidget::filter(){ - mProxy->setFilterRegExp(mFilterEdit->text()); + QString filterText = mFilterEdit->text(); + if(filterText.isEmpty()){ + 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()); + } +} + +void SeriesTreeWidget::clearFilter(){ + mModel->clearFilter(); + mProxy->setFilterRegExp(QString()); + mFilterEdit->clear(); + expandItems(mExpandedItems); } void SeriesTreeWidget::resort(){ @@ -229,6 +261,13 @@ void SeriesTreeWidget::itemCollaped(const QModelIndex &what){ } } +void SeriesTreeWidget::expandItems(const QStringList &items){ + foreach(QString s, items){ + QModelIndex idx = mProxy->mapFromSource(mModel->findValue(s)); + mView->expand(idx); + } +} + void SeriesTreeWidget::addCover(){ QModelIndexList selected = mView->selectionModel()->selectedRows(); if(selected.isEmpty()){ diff --git a/seriestreewidget.h b/seriestreewidget.h index 578edef..2e28c1c 100644 --- a/seriestreewidget.h +++ b/seriestreewidget.h @@ -41,9 +41,11 @@ class SeriesTreeWidget : public QWidget { private slots: void filter(); + void clearFilter(); void resort(); void itemExpanded(const QModelIndex &); void itemCollaped(const QModelIndex &); + void expandItems(const QStringList &items); signals: void filesReload(); @@ -51,6 +53,7 @@ class SeriesTreeWidget : public QWidget { private: QLineEdit *mFilterEdit; QPushButton *mFilter; + QPushButton *mClear; SeriesTreeView *mView; SeriesTreeSortModel *mProxy; SeriesTreeModel *mModel; |