QHeaderview - many sections removed performance boost.

When the QHeaderView model rowCount is decreased then the headerview
needs to remove some sections.

If e.g swapSections had occured then qheaderview before this patch did
a very slow removal by removing one section at a time and for each section
it restored visual and logical indexes.

By temporarily storing the logical index on the section we
can reduce the execution time of this a lot. The old code is only
faster when we remove one index (and is kept for that situation)

There is a complexity in difference (and many factors in our
qheaderview benchmark (the trunc part))

Change-Id: If45eab17fbca3364d458b004980570b5d013e4bd
Reviewed-by: Stephen Kelly <stephen.kelly@kdab.com>
bb10
Thorbjørn Lund Martsum 2012-02-16 10:12:30 +01:00 committed by Qt by Nokia
parent 84438a77cc
commit a4e4c31007
2 changed files with 23 additions and 2 deletions

View File

@ -1799,7 +1799,8 @@ void QHeaderViewPrivate::_q_sectionsRemoved(const QModelIndex &parent,
//Q_ASSERT(headerSectionCount() == sectionCount);
removeSectionsFromSpans(logicalFirst, logicalLast);
} else {
for (int l = logicalLast; l >= logicalFirst; --l) {
if (logicalFirst == logicalLast) { // Remove just one index.
int l = logicalFirst;
int visual = visualIndices.at(l);
for (int v = 0; v < sectionCount; ++v) {
if (v >= logicalIndices.count())
@ -1815,8 +1816,27 @@ void QHeaderViewPrivate::_q_sectionsRemoved(const QModelIndex &parent,
visualIndices.remove(l);
//Q_ASSERT(headerSectionCount() == sectionCount);
removeSectionsFromSpans(visual, visual);
} else {
sectionStartposRecalc = true; // We will need to recalc positions after removing items
for (int u = 0; u < sectionSpans.count(); ++u) // Store spans info
sectionSpans.at(u).tmpLogIdx = logicalIndices.at(u);
for (int v = sectionSpans.count() - 1; v >= 0; --v) { // Remove the sections
if (logicalFirst <= sectionSpans.at(v).tmpLogIdx && sectionSpans.at(v).tmpLogIdx <= logicalLast)
removeSectionsFromSpans(v, v); // Invalidates the spans variable
}
visualIndices.resize(sectionSpans.count());
logicalIndices.resize(sectionSpans.count());
int* visual_data = visualIndices.data();
int* logical_data = logicalIndices.data();
for (int w = 0; w < sectionSpans.count(); ++w) { // Restore visual and logical indexes
int logindex = sectionSpans.at(w).tmpLogIdx;
if (logindex > logicalFirst)
logindex -= changeCount;
visual_data[logindex] = w;
logical_data[w] = logindex;
}
}
// ### handle sectionSelection, sectionHidden
// ### handle sectionSelection (sectionHidden is handled by updateHiddenSections)
}
sectionCount -= changeCount;

View File

@ -288,6 +288,7 @@ public:
struct SectionSpan {
int size;
mutable int calculated_startpos;
mutable int tmpLogIdx;
QHeaderView::ResizeMode resizeMode;
inline SectionSpan() : size(0), resizeMode(QHeaderView::Interactive) {}
inline SectionSpan(int length, QHeaderView::ResizeMode mode)