From ab985b0ee9dc5ae79eae030c0b53fd1084bf3c74 Mon Sep 17 00:00:00 2001 From: Aurindam Jana <aurindam.jana@nokia.com> Date: Fri, 23 Mar 2012 11:42:10 +0100 Subject: [PATCH] TreeViewFind: Search in all columns Extend searching from a specified column to all columns. Change-Id: I939867611dc79376237f3599baab28b408620b62 Reviewed-by: hjk <qthjk@ovi.com> --- src/plugins/find/treeviewfind.cpp | 71 ++++++++++++++++++++----------- src/plugins/find/treeviewfind.h | 3 +- 2 files changed, 46 insertions(+), 28 deletions(-) diff --git a/src/plugins/find/treeviewfind.cpp b/src/plugins/find/treeviewfind.cpp index 134f0d6c3e7..b74c97564a0 100644 --- a/src/plugins/find/treeviewfind.cpp +++ b/src/plugins/find/treeviewfind.cpp @@ -39,11 +39,10 @@ namespace Find { struct ItemModelFindPrivate { - explicit ItemModelFindPrivate(QTreeView *view, int role, int column) + explicit ItemModelFindPrivate(QTreeView *view, int role) : m_view(view) , m_incrementalWrappedState(false), - m_role(role), - m_column(column) + m_role(role) { } @@ -51,11 +50,10 @@ struct ItemModelFindPrivate QModelIndex m_incrementalFindStart; bool m_incrementalWrappedState; int m_role; - int m_column; }; -TreeViewFind::TreeViewFind(QTreeView *view, int role, int column) - : d(new ItemModelFindPrivate(view, role, column)) +TreeViewFind::TreeViewFind(QTreeView *view, int role) + : d(new ItemModelFindPrivate(view, role)) { } @@ -166,14 +164,17 @@ IFindSupport::Result TreeViewFind::find(const QString &searchTxt, QModelIndex resultIndex; QModelIndex currentIndex = d->m_view->currentIndex(); QModelIndex index = currentIndex; + int currentRow = currentIndex.row(); + bool backward = (flags & QTextDocument::FindBackward); if (wrapped) *wrapped = false; bool anyWrapped = false; bool stepWrapped = false; - if (!startFromCurrentIndex) index = followingIndex(index, backward, &stepWrapped); + else + currentRow = -1; do { anyWrapped |= stepWrapped; // update wrapped state if we actually stepped to next/prev item if (index.isValid()) { @@ -184,11 +185,17 @@ IFindSupport::Result TreeViewFind::find(const QString &searchTxt, QRegExp searchExpr = QRegExp(searchTxt, (sensitive ? Qt::CaseSensitive : Qt::CaseInsensitive)); - if (searchExpr.indexIn(text) != -1) + if (searchExpr.indexIn(text) != -1 + && d->m_view->model()->flags(index) & Qt::ItemIsSelectable + && currentRow != index.row()) resultIndex = index; } else { QTextDocument doc(text); - if (!doc.find(searchTxt, 0, flags).isNull()) + if (!doc.find(searchTxt, 0, + flags & (Find::FindCaseSensitively | + Find::FindWholeWords)).isNull() + && d->m_view->model()->flags(index) & Qt::ItemIsSelectable + && currentRow != index.row()) resultIndex = index; } } @@ -226,17 +233,23 @@ QModelIndex TreeViewFind::nextIndex(const QModelIndex &idx, bool *wrapped) const QModelIndex current = idx; while (!nextIndex.isValid()) { int row = current.row(); + int column = current.column(); current = current.parent(); - if (row + 1 < model->rowCount(current)) { - // Same parent has another child - nextIndex = model->index(row + 1, 0, current); + + if (column + 1 < model->columnCount(current)) { + nextIndex = model->index(row, column + 1, current); } else { - // go up one parent - if (!current.isValid()) { - // we start from the beginning - if (wrapped) - *wrapped = true; - nextIndex = model->index(0, 0); + if (row + 1 < model->rowCount(current)) { + // Same parent has another child + nextIndex = model->index(row + 1, 0, current); + } else { + // go up one parent + if (!current.isValid()) { + // we start from the beginning + if (wrapped) + *wrapped = true; + nextIndex = model->index(0, 0); + } } } } @@ -252,21 +265,27 @@ QModelIndex TreeViewFind::prevIndex(const QModelIndex &idx, bool *wrapped) const QAbstractItemModel *model = d->m_view->model(); if (current.isValid()) { int row = current.row(); - if (row > 0) { - current = model->index(row - 1, 0, current.parent()); + int column = current.column(); + if (column > 0) { + current = model->index(row, column - 1, current.parent()); } else { - current = current.parent(); - checkForChildren = !current.isValid(); - if (checkForChildren && wrapped) { - // we start from the end - *wrapped = true; + if (row > 0) { + current = model->index(row - 1, model->columnCount(current.parent()) - 1, + current.parent()); + } else { + current = current.parent(); + checkForChildren = !current.isValid(); + if (checkForChildren && wrapped) { + // we start from the end + *wrapped = true; + } } } } if (checkForChildren) { // traverse down the hierarchy while (int rc = model->rowCount(current)) { - current = model->index(rc - 1, d->m_column, current); + current = model->index(rc - 1, model->columnCount(current) - 1, current); } } return current; diff --git a/src/plugins/find/treeviewfind.h b/src/plugins/find/treeviewfind.h index 15fbbb361d0..5c218512baa 100644 --- a/src/plugins/find/treeviewfind.h +++ b/src/plugins/find/treeviewfind.h @@ -48,8 +48,7 @@ class FIND_EXPORT TreeViewFind : public Find::IFindSupport { Q_OBJECT public: - explicit TreeViewFind(QTreeView *view, int role = Qt::DisplayRole, - int column = 0); + explicit TreeViewFind(QTreeView *view, int role = Qt::DisplayRole); virtual ~TreeViewFind(); bool supportsReplace() const; -- GitLab