diff options
Diffstat (limited to 'src/widgets/itemviews')
-rw-r--r-- | src/widgets/itemviews/qcolumnview.cpp | 2 | ||||
-rw-r--r-- | src/widgets/itemviews/qdirmodel.cpp | 8 | ||||
-rw-r--r-- | src/widgets/itemviews/qheaderview.cpp | 44 | ||||
-rw-r--r-- | src/widgets/itemviews/qheaderview_p.h | 7 | ||||
-rw-r--r-- | src/widgets/itemviews/qlistwidget.cpp | 3 | ||||
-rw-r--r-- | src/widgets/itemviews/qstandarditemmodel.cpp | 3 | ||||
-rw-r--r-- | src/widgets/itemviews/qtablewidget.cpp | 3 | ||||
-rw-r--r-- | src/widgets/itemviews/qtreewidget.cpp | 3 |
8 files changed, 46 insertions, 27 deletions
diff --git a/src/widgets/itemviews/qcolumnview.cpp b/src/widgets/itemviews/qcolumnview.cpp index 5dec62acc2..6758aeb337 100644 --- a/src/widgets/itemviews/qcolumnview.cpp +++ b/src/widgets/itemviews/qcolumnview.cpp @@ -481,7 +481,7 @@ QRegion QColumnView::visualRegionForSelection(const QItemSelection &selection) c QRegion firstRegion = visualRect(firstIdx); QRegion lastRegion = visualRect(lastIdx); - return firstRegion.unite(lastRegion); + return firstRegion.united(lastRegion); } /*! diff --git a/src/widgets/itemviews/qdirmodel.cpp b/src/widgets/itemviews/qdirmodel.cpp index 67a16a836d..ee097e5c41 100644 --- a/src/widgets/itemviews/qdirmodel.cpp +++ b/src/widgets/itemviews/qdirmodel.cpp @@ -1169,11 +1169,9 @@ void QDirModelPrivate::init() root.parent = 0; root.info = QFileInfo(); clear(&root); - QHash<int, QByteArray> roles = q->roleNames(); - roles.insertMulti(QDirModel::FileIconRole, "fileIcon"); // == Qt::decoration - roles.insert(QDirModel::FilePathRole, "filePath"); - roles.insert(QDirModel::FileNameRole, "fileName"); - q->setRoleNames(roles); + roleNames.insertMulti(QDirModel::FileIconRole, QByteArrayLiteral("fileIcon")); // == Qt::decoration + roleNames.insert(QDirModel::FilePathRole, QByteArrayLiteral("filePath")); + roleNames.insert(QDirModel::FileNameRole, QByteArrayLiteral("fileName")); } QDirModelPrivate::QDirNode *QDirModelPrivate::node(int row, QDirNode *parent) const diff --git a/src/widgets/itemviews/qheaderview.cpp b/src/widgets/itemviews/qheaderview.cpp index 299dcb3dd4..5d2aceaade 100644 --- a/src/widgets/itemviews/qheaderview.cpp +++ b/src/widgets/itemviews/qheaderview.cpp @@ -1799,11 +1799,11 @@ 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); + Q_ASSERT(sectionCount == logicalIndices.count()); for (int v = 0; v < sectionCount; ++v) { - if (v >= logicalIndices.count()) - continue; // the section doesn't exist if (v > visual) { int logical = logicalIndices.at(v); --(visualIndices[logical]); @@ -1815,8 +1815,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; @@ -2414,20 +2433,15 @@ bool QHeaderView::viewportEvent(QEvent *e) } return true; } #endif // QT_NO_STATUSTIP - case QEvent::Hide: { - d->invalidateCachedSizeHint(); + case QEvent::Hide: + case QEvent::Show: + case QEvent::FontChange: + case QEvent::StyleChange:{ QAbstractScrollArea *parent = qobject_cast<QAbstractScrollArea *>(parentWidget()); if (parent && parent->isVisible()) // Only resize if we have a visible parent resizeSections(); emit geometriesChanged(); break;} - case QEvent::Show: - case QEvent::FontChange: - case QEvent::StyleChange: - d->invalidateCachedSizeHint(); - resizeSections(); - emit geometriesChanged(); - break; case QEvent::ContextMenu: { d->state = QHeaderViewPrivate::NoState; d->pressed = d->section = d->target = -1; @@ -3371,11 +3385,11 @@ int QHeaderViewPrivate::viewSectionSizeHint(int logical) const int QHeaderViewPrivate::adjustedVisualIndex(int visualIndex) const { - if (hiddenSectionSize.count() > 0) { + if (!sectionHidden.isEmpty()) { int adjustedVisualIndex = visualIndex; int currentVisualIndex = 0; for (int i = 0; i < sectionSpans.count(); ++i) { - if (sectionSpans.at(i).size == 0) + if (sectionHidden.testBit(i)) ++adjustedVisualIndex; else ++currentVisualIndex; diff --git a/src/widgets/itemviews/qheaderview_p.h b/src/widgets/itemviews/qheaderview_p.h index 9d7d97f582..2c657221dd 100644 --- a/src/widgets/itemviews/qheaderview_p.h +++ b/src/widgets/itemviews/qheaderview_p.h @@ -287,7 +287,11 @@ public: struct SectionSpan { int size; - mutable int calculated_startpos; + union { // This union is made in order to save space and ensure good vector performance (on remove) + mutable int calculated_startpos; // <- this is the primary used member. + mutable int tmpLogIdx; // When one of these 'tmp'-members has been used we call + int tmpDataStreamSectionCount; // recalcSectionStartPos() or set sectionStartposRecalc to true + }; // to ensure that calculated_startpos will be calculated afterwards. QHeaderView::ResizeMode resizeMode; inline SectionSpan() : size(0), resizeMode(QHeaderView::Interactive) {} inline SectionSpan(int length, QHeaderView::ResizeMode mode) @@ -295,7 +299,6 @@ public: inline int sectionSize() const { return size; } inline int calculatedEndPos() const { return calculated_startpos + size; } #ifndef QT_NO_DATASTREAM - int tmpDataStreamSectionCount; inline void write(QDataStream &out) const { out << size; out << 1; out << (int)resizeMode; } inline void read(QDataStream &in) diff --git a/src/widgets/itemviews/qlistwidget.cpp b/src/widgets/itemviews/qlistwidget.cpp index 97fbea6c3d..bb39546ec8 100644 --- a/src/widgets/itemviews/qlistwidget.cpp +++ b/src/widgets/itemviews/qlistwidget.cpp @@ -75,6 +75,7 @@ QListModel::~QListModel() void QListModel::clear() { + beginResetModel(); for (int i = 0; i < items.count(); ++i) { if (items.at(i)) { items.at(i)->d->theid = -1; @@ -83,7 +84,7 @@ void QListModel::clear() } } items.clear(); - reset(); + endResetModel(); } QListWidgetItem *QListModel::at(int row) const diff --git a/src/widgets/itemviews/qstandarditemmodel.cpp b/src/widgets/itemviews/qstandarditemmodel.cpp index 112b533f4f..5616d76c4a 100644 --- a/src/widgets/itemviews/qstandarditemmodel.cpp +++ b/src/widgets/itemviews/qstandarditemmodel.cpp @@ -2097,13 +2097,14 @@ void QStandardItemModel::setItemRoleNames(const QHash<int,QByteArray> &roleNames void QStandardItemModel::clear() { Q_D(QStandardItemModel); + beginResetModel(); d->root.reset(new QStandardItem); d->root->d_func()->setModel(this); qDeleteAll(d->columnHeaderItems); d->columnHeaderItems.clear(); qDeleteAll(d->rowHeaderItems); d->rowHeaderItems.clear(); - reset(); + endResetModel(); } /*! diff --git a/src/widgets/itemviews/qtablewidget.cpp b/src/widgets/itemviews/qtablewidget.cpp index 82055ad11e..5932f20327 100644 --- a/src/widgets/itemviews/qtablewidget.cpp +++ b/src/widgets/itemviews/qtablewidget.cpp @@ -755,6 +755,7 @@ void QTableModel::clear() void QTableModel::clearContents() { + beginResetModel(); for (int i = 0; i < tableItems.count(); ++i) { if (tableItems.at(i)) { tableItems.at(i)->view = 0; @@ -762,7 +763,7 @@ void QTableModel::clearContents() tableItems[i] = 0; } } - reset(); + endResetModel(); } void QTableModel::itemChanged(QTableWidgetItem *item) diff --git a/src/widgets/itemviews/qtreewidget.cpp b/src/widgets/itemviews/qtreewidget.cpp index ca8b9c4e09..cec709a816 100644 --- a/src/widgets/itemviews/qtreewidget.cpp +++ b/src/widgets/itemviews/qtreewidget.cpp @@ -160,6 +160,7 @@ QTreeModel::~QTreeModel() void QTreeModel::clear() { SkipSorting skipSorting(this); + beginResetModel(); for (int i = 0; i < rootItem->childCount(); ++i) { QTreeWidgetItem *item = rootItem->children.at(i); item->par = 0; @@ -168,7 +169,7 @@ void QTreeModel::clear() } rootItem->children.clear(); sortPendingTimer.stop(); - reset(); + endResetModel(); } /*! |