summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArno <am@disconnect.de>2013-06-14 15:14:58 +0200
committerArno <am@disconnect.de>2013-06-14 15:14:58 +0200
commitdeee95ecd5d92b93956061d4e6ae63246b8bc928 (patch)
tree8a12b93a118e78b431e526aa2178651f346d3200
parent35f5a0c5e13df3a0a41ef990b886a98ce2374a5c (diff)
downloadSheMov-deee95ecd5d92b93956061d4e6ae63246b8bc928.tar.gz
SheMov-deee95ecd5d92b93956061d4e6ae63246b8bc928.tar.bz2
SheMov-deee95ecd5d92b93956061d4e6ae63246b8bc928.zip
Filter recursive
Well, well... Recursion isn't that bad at all. Filter experimental ArchiveView recursive by the following rules: * check children _and_ parents for filter * if any child _or_ parent matches, accept the current row, parents and children. The column is converted to a QString and matched by QRegExp, so don't try to match numbers or anything else.
-rw-r--r--archivemodel.cpp43
-rw-r--r--archivemodel.h2
-rw-r--r--archiveview.cpp23
3 files changed, 48 insertions, 20 deletions
diff --git a/archivemodel.cpp b/archivemodel.cpp
index 9ef2eac..a6c3c4a 100644
--- a/archivemodel.cpp
+++ b/archivemodel.cpp
@@ -99,6 +99,38 @@ bool ArchiveModel::setData(const QModelIndex &idx, const QVariant &value, int ro
return false;
}
+bool ArchiveModel::matchRecursive(const QModelIndex &parent, const QRegExp &regex, int column) const {
+ if(!parent.isValid()){
+ return false;
+ }
+ // first try the parent itself
+ QString value = parent.data().toString();
+ if(value.isEmpty()){
+ return false;
+ }
+ if(value.contains(regex)){
+ return true;
+ }
+
+ // no match, check for children
+ SmTreeItem *item = static_cast<SmTreeItem*>(parent.internalPointer());
+ if(!item->childCount()){
+ //leaf, chech parents
+ return checkParents(item, regex, column);
+ }
+
+ // we have children, traverse them
+ bool retval = false;
+ for(int i = 0; i < item->childCount(); ++i){
+ QModelIndex newIdx = createIndex(i, column, item->child(i));
+ retval = matchRecursive(newIdx, regex, column);
+ if(retval){
+ break;
+ }
+ }
+ return retval;
+}
+
bool ArchiveModel::removeNode(const QModelIndex &idx){
if(!idx.isValid()){
return false;
@@ -182,6 +214,17 @@ void ArchiveModel::collectorFinished(){
setRoot(item);
}
+bool ArchiveModel::checkParents(const SmTreeItem *item, const QRegExp &regex, int column) const {
+ while(item != root()){
+ QString value = item->data(column).toString();
+ if(value.contains(regex)){
+ return true;
+ }
+ item = item->parent();
+ }
+ return false;
+}
+
void ArchiveModel::emitDatabaseError(const QSqlError &e){
QString databaseText = e.databaseText().isEmpty() ? tr("(none)") : e.databaseText();
QString driverText = e.driverText().isEmpty() ? tr("(none)") : e.driverText();
diff --git a/archivemodel.h b/archivemodel.h
index 8055c31..29f10ab 100644
--- a/archivemodel.h
+++ b/archivemodel.h
@@ -30,6 +30,7 @@ class ArchiveModel : public SmTreeModel {
ArchiveCollector *collector() { return mCollector; }
virtual QVariant data(const QModelIndex &index, int role) const;
virtual bool setData(const QModelIndex &idx, const QVariant &value, int role);
+ virtual bool matchRecursive(const QModelIndex &parent, const QRegExp &regex, int column = 0) const;
virtual bool removeNode(const QModelIndex &idx);
QStringList indexToPath(const QModelIndex &idx) const;
QModelIndexList pathToIndex(const QStringList &path) const;
@@ -47,6 +48,7 @@ class ArchiveModel : public SmTreeModel {
void collectorFinished();
private:
+ bool checkParents(const SmTreeItem *item, const QRegExp &regex, int column) const;
void emitDatabaseError(const QSqlError &e);
QSqlDatabase mDb;
QHash<QString, int> mAvailableOrders;
diff --git a/archiveview.cpp b/archiveview.cpp
index 96bf01b..263bc41 100644
--- a/archiveview.cpp
+++ b/archiveview.cpp
@@ -228,24 +228,7 @@ bool ArchiveProxy::filterAcceptsRow(int sourceRow, const QModelIndex &sourcePare
if(mFilter.isEmpty()){
return true;
}
- QModelIndex nodeIdx = sourceModel()->index(sourceRow, ArchiveModel::Type, sourceParent);
- if(mSortOrder == ArchiveModel::SeriesName){
- if(nodeIdx.data().toInt() == ArchiveModel::SeriesNode){
- QModelIndex nameIdx = sourceModel()->index(sourceRow, ArchiveModel::Name, sourceParent);
- QString name = nameIdx.data().toString();
- return name.contains(mFilter);
- }else{
- return true;
- }
- }else if(mSortOrder == ArchiveModel::Genre || mSortOrder == ArchiveModel::Actor){
- int nodeType = nodeIdx.data().toInt();
- if(nodeType == ArchiveModel::ActorNode || nodeType == ArchiveModel::GenreNode){
- QModelIndex nameIdx = sourceModel()->index(sourceRow, ArchiveModel::Name, sourceParent);
- QString name = nameIdx.data().toString();
- return name.contains(mFilter);
- }else{
- return true;
- }
- }
- return false;
+ QModelIndex nameIdx = sourceModel()->index(sourceRow, ArchiveModel::Name, sourceParent);
+ ArchiveModel *model = qobject_cast<ArchiveModel*>(sourceModel());
+ return model->matchRecursive(nameIdx, mFilter);
}