summaryrefslogtreecommitdiffstats
path: root/src/gui/itemviews
diff options
context:
space:
mode:
authorQt Continuous Integration System <qt-info@nokia.com>2010-03-15 22:03:41 (GMT)
committerQt Continuous Integration System <qt-info@nokia.com>2010-03-15 22:03:41 (GMT)
commit1b16a610582990e3274f96bd27a05af45e20f4fe (patch)
tree7875d8849309fdde195cf2e34e911548d284b2e1 /src/gui/itemviews
parentfdcb62d5d6a3e295273042555d2551eb491a5b2d (diff)
parentaf44f857bc9b6698c6a8d2741a0c2b06608ecbad (diff)
downloadQt-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/itemviews')
-rw-r--r--src/gui/itemviews/qabstractitemview.cpp30
-rw-r--r--src/gui/itemviews/qabstractitemview_p.h10
-rw-r--r--src/gui/itemviews/qlistview.cpp2
-rw-r--r--src/gui/itemviews/qsortfilterproxymodel.cpp34
-rw-r--r--src/gui/itemviews/qtreeview.cpp10
5 files changed, 50 insertions, 36 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;
}