diff options
-rw-r--r-- | archivemodel.cpp | 43 | ||||
-rw-r--r-- | archivemodel.h | 2 | ||||
-rw-r--r-- | archiveview.cpp | 23 |
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 ®ex, 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 ®ex, 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 ®ex, 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 ®ex, 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); } |