diff options
author | Qt Continuous Integration System <qt-info@nokia.com> | 2010-03-15 22:03:41 (GMT) |
---|---|---|
committer | Qt Continuous Integration System <qt-info@nokia.com> | 2010-03-15 22:03:41 (GMT) |
commit | 1b16a610582990e3274f96bd27a05af45e20f4fe (patch) | |
tree | 7875d8849309fdde195cf2e34e911548d284b2e1 /src/gui | |
parent | fdcb62d5d6a3e295273042555d2551eb491a5b2d (diff) | |
parent | af44f857bc9b6698c6a8d2741a0c2b06608ecbad (diff) | |
download | Qt-1b16a610582990e3274f96bd27a05af45e20f4fe.zip Qt-1b16a610582990e3274f96bd27a05af45e20f4fe.tar.gz Qt-1b16a610582990e3274f96bd27a05af45e20f4fe.tar.bz2 |
Merge branch '4.7' of scm.dev.nokia.troll.no:qt/oslo-staging-2 into 4.7-integration
* '4.7' of scm.dev.nokia.troll.no:qt/oslo-staging-2:
Fix a crash in QSortFilterProxyModel when deleting a row
small cleanup regarding delayed layout in itemviews
Fixed wasted space in the texture cache.
Get debug code compiling since function signature changes
--warn;
That file was forgotten when adding SSE support under mingw
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/itemviews/qabstractitemview.cpp | 30 | ||||
-rw-r--r-- | src/gui/itemviews/qabstractitemview_p.h | 10 | ||||
-rw-r--r-- | src/gui/itemviews/qlistview.cpp | 2 | ||||
-rw-r--r-- | src/gui/itemviews/qsortfilterproxymodel.cpp | 34 | ||||
-rw-r--r-- | src/gui/itemviews/qtreeview.cpp | 10 | ||||
-rw-r--r-- | src/gui/painting/qtextureglyphcache.cpp | 16 |
6 files changed, 55 insertions, 47 deletions
diff --git a/src/gui/itemviews/qabstractitemview.cpp b/src/gui/itemviews/qabstractitemview.cpp index 2faf755..443e669 100644 --- a/src/gui/itemviews/qabstractitemview.cpp +++ b/src/gui/itemviews/qabstractitemview.cpp @@ -103,8 +103,7 @@ QAbstractItemViewPrivate::QAbstractItemViewPrivate() verticalScrollMode(QAbstractItemView::ScrollPerItem), horizontalScrollMode(QAbstractItemView::ScrollPerItem), currentIndexSet(false), - wrapItemText(false), - delayedPendingLayout(false) + wrapItemText(false) { } @@ -2396,9 +2395,8 @@ void QAbstractItemView::timerEvent(QTimerEvent *event) d->delayedEditing.stop(); edit(currentIndex()); } else if (event->timerId() == d->delayedLayout.timerId()) { - d->delayedLayout.stop(); + d->interruptDelayedItemsLayout(); if (isVisible()) { - d->interruptDelayedItemsLayout(); doItemsLayout(); const QModelIndex current = currentIndex(); if (current.isValid() && d->state == QAbstractItemView::EditingState) @@ -3060,7 +3058,7 @@ void QAbstractItemView::setIndexWidget(const QModelIndex &index, QWidget *widget d->addEditor(index, widget, true); widget->show(); dataChanged(index, index); // update the geometry - if (!d->delayedPendingLayout) + if (!d->delayedPendingLayout()) widget->setGeometry(visualRect(index)); } } @@ -3100,7 +3098,7 @@ void QAbstractItemView::scrollToTop() void QAbstractItemView::scrollToBottom() { Q_D(QAbstractItemView); - if (d->delayedPendingLayout) { + if (d->delayedPendingLayout()) { d->executePostedLayout(); updateGeometries(); } @@ -3145,14 +3143,14 @@ void QAbstractItemView::dataChanged(const QModelIndex &topLeft, const QModelInde delegate->setEditorData(editorInfo.editor, topLeft); } } - if (isVisible() && !d->delayedPendingLayout) { + if (isVisible() && !d->delayedPendingLayout()) { // otherwise the items will be update later anyway update(topLeft); } return; } d->updateEditorData(topLeft, bottomRight); - if (!isVisible() || d->delayedPendingLayout) + if (!isVisible() || d->delayedPendingLayout()) return; // no need to update d->viewport->update(); } @@ -3876,22 +3874,6 @@ bool QAbstractItemViewPrivate::shouldAutoScroll(const QPoint &pos) const || (area.right() - pos.x() < autoScrollMargin); } -void QAbstractItemViewPrivate::doDelayedItemsLayout(int delay) -{ - if (!delayedPendingLayout) { - delayedPendingLayout = true; - delayedLayout.start(delay, q_func()); - } -} - -void QAbstractItemViewPrivate::interruptDelayedItemsLayout() const -{ - delayedLayout.stop(); - delayedPendingLayout = false; -} - - - QWidget *QAbstractItemViewPrivate::editor(const QModelIndex &index, const QStyleOptionViewItem &options) { diff --git a/src/gui/itemviews/qabstractitemview_p.h b/src/gui/itemviews/qabstractitemview_p.h index 82fd1a6..3511c28 100644 --- a/src/gui/itemviews/qabstractitemview_p.h +++ b/src/gui/itemviews/qabstractitemview_p.h @@ -124,8 +124,10 @@ public: bool shouldEdit(QAbstractItemView::EditTrigger trigger, const QModelIndex &index) const; bool shouldForwardEvent(QAbstractItemView::EditTrigger trigger, const QEvent *event) const; bool shouldAutoScroll(const QPoint &pos) const; - void doDelayedItemsLayout(int delay = 0); - void interruptDelayedItemsLayout() const; + void doDelayedItemsLayout(int delay = 0) { if (!delayedPendingLayout()) delayedLayout.start(delay, q_func()); } + void interruptDelayedItemsLayout() const { delayedLayout.stop(); } + bool delayedPendingLayout() const { return delayedLayout.isActive(); } + void startAutoScroll() { // ### it would be nice to make this into a style hint one day @@ -207,7 +209,7 @@ public: } inline void executePostedLayout() const { - if (delayedPendingLayout && state != QAbstractItemView::CollapsingState) { + if (delayedPendingLayout() && state != QAbstractItemView::CollapsingState) { interruptDelayedItemsLayout(); const_cast<QAbstractItemView*>(q_func())->doItemsLayout(); } @@ -416,9 +418,7 @@ public: QAbstractItemView::ScrollMode horizontalScrollMode; bool currentIndexSet; - bool wrapItemText; - mutable bool delayedPendingLayout; private: mutable QBasicTimer delayedLayout; diff --git a/src/gui/itemviews/qlistview.cpp b/src/gui/itemviews/qlistview.cpp index b2def39..b2c8c51 100644 --- a/src/gui/itemviews/qlistview.cpp +++ b/src/gui/itemviews/qlistview.cpp @@ -823,7 +823,7 @@ void QListView::timerEvent(QTimerEvent *e) void QListView::resizeEvent(QResizeEvent *e) { Q_D(QListView); - if (d->delayedPendingLayout) + if (d->delayedPendingLayout()) return; QSize delta = e->size() - e->oldSize(); diff --git a/src/gui/itemviews/qsortfilterproxymodel.cpp b/src/gui/itemviews/qsortfilterproxymodel.cpp index 5c7d24b7..c6ad345 100644 --- a/src/gui/itemviews/qsortfilterproxymodel.cpp +++ b/src/gui/itemviews/qsortfilterproxymodel.cpp @@ -111,6 +111,35 @@ private: }; +//this struct is used to store what are the rows that are removed +//between a call to rowsAboutToBeRemoved and rowsRemoved +//it avoids readding rows to the mapping that are currently being removed +struct QRowsRemoval +{ + QRowsRemoval(const QModelIndex &parent_source, int start, int end) : parent_source(parent_source), start(start), end(end) + { + } + + QRowsRemoval() : start(-1), end(-1) + { + } + + bool contains(QModelIndex parent, int row) + { + do { + if (parent == parent_source) + return row >= start && row <= end; + row = parent.row(); + parent = parent.parent(); + } while (row >= 0); + return false; + } +private: + QModelIndex parent_source; + int start; + int end; +}; + class QSortFilterProxyModelPrivate : public QAbstractProxyModelPrivate { Q_DECLARE_PUBLIC(QSortFilterProxyModel) @@ -139,6 +168,7 @@ public: int filter_role; bool dynamic_sortfilter; + QRowsRemoval itemsBeingRemoved; QModelIndexPairList saved_persistent_indexes; @@ -1096,7 +1126,7 @@ void QSortFilterProxyModelPrivate::_q_sourceDataChanged(const QModelIndex &sourc source_rows_change.append(source_row); } } else { - if (q->filterAcceptsRow(source_row, source_parent)) { + if (!itemsBeingRemoved.contains(source_parent, source_row) && q->filterAcceptsRow(source_row, source_parent)) { // This source row now satisfies the filter, so it must be added source_rows_insert.append(source_row); } @@ -1253,6 +1283,7 @@ void QSortFilterProxyModelPrivate::_q_sourceRowsInserted( void QSortFilterProxyModelPrivate::_q_sourceRowsAboutToBeRemoved( const QModelIndex &source_parent, int start, int end) { + itemsBeingRemoved = QRowsRemoval(source_parent, start, end); source_items_about_to_be_removed(source_parent, start, end, Qt::Vertical); } @@ -1260,6 +1291,7 @@ void QSortFilterProxyModelPrivate::_q_sourceRowsAboutToBeRemoved( void QSortFilterProxyModelPrivate::_q_sourceRowsRemoved( const QModelIndex &source_parent, int start, int end) { + itemsBeingRemoved = QRowsRemoval(); source_items_removed(source_parent, start, end, Qt::Vertical); } diff --git a/src/gui/itemviews/qtreeview.cpp b/src/gui/itemviews/qtreeview.cpp index 4135ba0..2acd160 100644 --- a/src/gui/itemviews/qtreeview.cpp +++ b/src/gui/itemviews/qtreeview.cpp @@ -668,7 +668,7 @@ void QTreeView::dataChanged(const QModelIndex &topLeft, const QModelIndex &botto Q_D(QTreeView); // if we are going to do a complete relayout anyway, there is no need to update - if (d->delayedPendingLayout) + if (d->delayedPendingLayout()) return; // refresh the height cache here; we don't really lose anything by getting the size hint, @@ -742,7 +742,7 @@ void QTreeView::expand(const QModelIndex &index) Q_D(QTreeView); if (!d->isIndexValid(index)) return; - if (d->delayedPendingLayout) { + if (d->delayedPendingLayout()) { //A complete relayout is going to be performed, just store the expanded index, no need to layout. if (d->storeExpanded(index)) emit expanded(index); @@ -776,7 +776,7 @@ void QTreeView::collapse(const QModelIndex &index) //if the current item is now invisible, the autoscroll will expand the tree to see it, so disable the autoscroll d->delayedAutoScroll.stop(); - if (d->delayedPendingLayout) { + if (d->delayedPendingLayout()) { //A complete relayout is going to be performed, just un-store the expanded index, no need to layout. if (d->isPersistent(index) && d->expandedIndexes.remove(index)) emit collapsed(index); @@ -2431,7 +2431,7 @@ void QTreeView::rowsInserted(const QModelIndex &parent, int start, int end) { Q_D(QTreeView); // if we are going to do a complete relayout anyway, there is no need to update - if (d->delayedPendingLayout) { + if (d->delayedPendingLayout()) { QAbstractItemView::rowsInserted(parent, start, end); return; } @@ -3755,7 +3755,7 @@ void QTreeViewPrivate::rowsRemoved(const QModelIndex &parent, int start, int end, bool after) { // if we are going to do a complete relayout anyway, there is no need to update - if (delayedPendingLayout) { + if (delayedPendingLayout()) { _q_rowsRemoved(parent, start, end); return; } diff --git a/src/gui/painting/qtextureglyphcache.cpp b/src/gui/painting/qtextureglyphcache.cpp index 4418018..4a563ed 100644 --- a/src/gui/painting/qtextureglyphcache.cpp +++ b/src/gui/painting/qtextureglyphcache.cpp @@ -73,7 +73,7 @@ void QTextureGlyphCache::populate(QFontEngine *fontEngine, int numGlyphs, const const QFixedPoint *) { #ifdef CACHE_DEBUG - printf("Populating with '%s'\n", QString::fromRawData(ti.chars, ti.num_chars).toLatin1().data()); + printf("Populating with %d glyphs\n", numGlyphs); qDebug() << " -> current transformation: " << m_transform; #endif @@ -93,17 +93,14 @@ void QTextureGlyphCache::populate(QFontEngine *fontEngine, int numGlyphs, const glyph_metrics_t metrics = fontEngine->boundingBox(glyph, m_transform); #ifdef CACHE_DEBUG - printf("'%c' (%4x): w=%.2f, h=%.2f, xoff=%.2f, yoff=%.2f, x=%.2f, y=%.2f, ti.ascent=%.2f, ti.descent=%.2f\n", - ti.chars[i].toLatin1(), + printf("(%4x): w=%.2f, h=%.2f, xoff=%.2f, yoff=%.2f, x=%.2f, y=%.2f\n", glyph, metrics.width.toReal(), metrics.height.toReal(), metrics.xoff.toReal(), metrics.yoff.toReal(), metrics.x.toReal(), - metrics.y.toReal(), - ti.ascent.toReal(), - ti.descent.toReal()); + metrics.y.toReal()); #endif int glyph_width = metrics.width.ceil().toInt(); int glyph_height = metrics.height.ceil().toInt(); @@ -139,7 +136,7 @@ void QTextureGlyphCache::populate(QFontEngine *fontEngine, int numGlyphs, const if (m_cx + c.w > m_w) { // no room on the current line, start new glyph strip m_cx = 0; - m_cy = m_h; + m_cy += rowHeight; } if (m_cy + c.h > m_h) { int new_height = m_h*2; @@ -333,10 +330,7 @@ void QImageTextureGlyphCache::fillTexture(const Coord &c, glyph_t g) QPoint base(c.x + glyphMargin(), c.y + glyphMargin() + c.baseLineY-1); if (m_image.rect().contains(base)) m_image.setPixel(base, 255); - m_image.save(QString::fromLatin1("cache-%1-%2-%3.png") - .arg(m_current_textitem->font().family()) - .arg(m_current_textitem->font().pointSize()) - .arg(m_transform.type())); + m_image.save(QString::fromLatin1("cache-%1.png").arg(int(this))); #endif } |