Commit 2a623770 authored by hjk's avatar hjk

TreeModel/Find: Save a few cycles when searching

Calls parent() only ~two out of three times and remove some
function calls in the TreeModel::parent() implementation,
reducing the overall footprint of this bit from ~5 to ~1.5%
when searching something in the project tree (test case
was Creator-in-Creator, and searching for 'dddddddddd',
resulting in 8 complete scans of the tree.

Task-number: QTCREATORBUG-17956
Change-Id: I4e46ef0467dd2aea58a7c944e1a2ee5c01e6fbba
Reviewed-by: Tobias Hunger's avatarTobias Hunger <tobias.hunger@qt.io>
parent 778d7113
......@@ -919,11 +919,9 @@ QModelIndex BaseTreeModel::parent(const QModelIndex &idx) const
if (!grandparent)
return QModelIndex();
for (int i = 0, n = grandparent->childCount(); i < n; ++i)
if (grandparent->childAt(i) == parent)
return createIndex(i, 0, static_cast<void*>(parent));
return QModelIndex();
// This is on the performance-critical path for ItemViewFind.
const int i = grandparent->m_children.indexOf(parent);
return createIndex(i, 0, static_cast<void*>(parent));
}
int BaseTreeModel::rowCount(const QModelIndex &idx) const
......
......@@ -66,7 +66,7 @@ public:
using const_iterator = QVector<TreeItem *>::const_iterator;
using value_type = TreeItem *;
int childCount() const { return end() - begin(); }
int childCount() const { return m_children.size(); }
int indexInParent() const;
TreeItem *childAt(int index) const;
int indexOf(const TreeItem *item) const;
......
......@@ -249,12 +249,13 @@ QModelIndex ItemViewFind::nextIndex(const QModelIndex &idx, bool *wrapped) const
return model->index(0, 0);
// same parent has more columns, go to next column
if (idx.column() + 1 < model->columnCount(idx.parent()))
return model->index(idx.row(), idx.column() + 1, idx.parent());
const QModelIndex parentIdx = idx.parent();
if (idx.column() + 1 < model->columnCount(parentIdx))
return model->index(idx.row(), idx.column() + 1, parentIdx);
// tree views have their children attached to first column
// make sure we are at first column
QModelIndex current = model->index(idx.row(), 0, idx.parent());
QModelIndex current = model->index(idx.row(), 0, parentIdx);
// check for children
if (d->m_option == FetchMoreWhileSearching && model->canFetchMore(current))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment