summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--seriestreemodel.cpp103
-rw-r--r--seriestreemodel.h8
-rw-r--r--seriestreewidget.cpp49
-rw-r--r--seriestreewidget.h3
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;