┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPeter Penz <[email protected]>2012-01-17 21:08:39 +0100
committerPeter Penz <[email protected]>2012-01-17 21:11:49 +0100
commit7f718123b292d371b700184c35ad5a2e5b364ca3 (patch)
tree0079c061f0847c67a3a5699239c4faec3e7e0690 /src
parentab61a6174e046ef2f5ca86243582f66bfb107db7 (diff)
Do a synchronous layout for dynamic item sizes when changing the geometry
This prevents a delayed update when resizing the window e.g. in the details view. As no animated item position changes can happen for dynamic item sizes the synchronous relayout is fine from a performance point of view. BUG: 290953 FIXED-IN: 4.8.0
Diffstat (limited to 'src')
-rw-r--r--src/kitemviews/kitemlistview.cpp85
-rw-r--r--src/kitemviews/kitemlistview.h3
2 files changed, 46 insertions, 42 deletions
diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp
index 1f96b51ba..49e23f9b7 100644
--- a/src/kitemviews/kitemlistview.cpp
+++ b/src/kitemviews/kitemlistview.cpp
@@ -355,20 +355,55 @@ void KItemListView::setGeometry(const QRectF& rect)
return;
}
- if (m_model->count() > 0) {
- prepareLayoutForIncreasedItemCount(rect.size(), LayouterSize);
+ const QSizeF newSize = rect.size();
+ if (m_itemSize.isEmpty()) {
+ // The item size is dynamic:
+ // Changing the geometry does not require to do an expensive
+ // update of the visible-roles sizes, only the stretched sizes
+ // need to be adjusted to the new size.
+ updateStretchedVisibleRolesSizes();
+
+ if (m_useHeaderWidths) {
+ QSizeF dynamicItemSize = m_layouter->itemSize();
+
+ if (m_itemSize.width() < 0) {
+ const qreal requiredWidth = visibleRolesSizesWidthSum();
+ if (newSize.width() > requiredWidth) {
+ dynamicItemSize.setWidth(newSize.width());
+ }
+ const qreal headerWidth = qMax(newSize.width(), requiredWidth);
+ m_header->resize(headerWidth, m_header->size().height());
+ }
+
+ if (m_itemSize.height() < 0) {
+ const qreal requiredHeight = visibleRolesSizesHeightSum();
+ if (newSize.height() > requiredHeight) {
+ dynamicItemSize.setHeight(newSize.height());
+ }
+ // TODO: KItemListHeader is not prepared for vertical alignment
+ }
+
+ m_layouter->setItemSize(dynamicItemSize);
+ }
+
+ // Triggering a synchronous layout is fine from a performance point of view,
+ // as with dynamic item sizes no moving animation must be done.
+ m_layouter->setSize(newSize);
+ doLayout(Animation);
} else {
- m_layouter->setSize(rect.size());
- }
+ // The item size is not dynamic and most probably the geometry change results
+ // in animated position changes of the items. Trigger an asynchronous relayout
+ // with m_layoutTimer to prevent performance bottlenecks.
+ if (m_model->count() > 0) {
+ prepareLayoutForIncreasedItemCount(newSize, LayouterSize);
+ } else {
+ m_layouter->setSize(newSize);
+ }
- if (!m_layoutTimer->isActive()) {
- m_layoutTimer->start();
+ if (!m_layoutTimer->isActive()) {
+ m_layoutTimer->start();
+ }
}
-
- // Changing the geometry does not require to do an expensive
- // update of the visible-roles sizes, only the stretched sizes
- // need to be adjusted to the new size.
- updateStretchedVisibleRolesSizes();
}
int KItemListView::itemAt(const QPointF& pos) const
@@ -707,34 +742,6 @@ QList<KItemListWidget*> KItemListView::visibleItemListWidgets() const
return m_visibleItems.values();
}
-void KItemListView::resizeEvent(QGraphicsSceneResizeEvent* event)
-{
- QGraphicsWidget::resizeEvent(event);
- if (m_itemSize.isEmpty() && m_useHeaderWidths) {
- QSizeF dynamicItemSize = m_layouter->itemSize();
- const QSizeF newSize = event->newSize();
-
- if (m_itemSize.width() < 0) {
- const qreal requiredWidth = visibleRolesSizesWidthSum();
- if (newSize.width() > requiredWidth) {
- dynamicItemSize.setWidth(newSize.width());
- }
- const qreal headerWidth = qMax(newSize.width(), requiredWidth);
- m_header->resize(headerWidth, m_header->size().height());
- }
-
- if (m_itemSize.height() < 0) {
- const qreal requiredHeight = visibleRolesSizesHeightSum();
- if (newSize.height() > requiredHeight) {
- dynamicItemSize.setHeight(newSize.height());
- }
- // TODO: KItemListHeader is not prepared for vertical alignment
- }
-
- m_layouter->setItemSize(dynamicItemSize);
- }
-}
-
void KItemListView::slotItemsInserted(const KItemRangeList& itemRanges)
{
updateVisibleRolesSizes(itemRanges);
diff --git a/src/kitemviews/kitemlistview.h b/src/kitemviews/kitemlistview.h
index d44a08c02..4969d01b7 100644
--- a/src/kitemviews/kitemlistview.h
+++ b/src/kitemviews/kitemlistview.h
@@ -286,9 +286,6 @@ protected:
QList<KItemListWidget*> visibleItemListWidgets() const;
- /** @reimp */
- virtual void resizeEvent(QGraphicsSceneResizeEvent* event);
-
protected slots:
virtual void slotItemsInserted(const KItemRangeList& itemRanges);
virtual void slotItemsRemoved(const KItemRangeList& itemRanges);