From: Peter Penz Date: Tue, 17 Jan 2012 20:08:39 +0000 (+0100) Subject: Do a synchronous layout for dynamic item sizes when changing the geometry X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/c712b9a42751ffc5006aafb08799019c5170e830 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 --- 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 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 visibleItemListWidgets() const; - /** @reimp */ - virtual void resizeEvent(QGraphicsSceneResizeEvent* event); - protected slots: virtual void slotItemsInserted(const KItemRangeList& itemRanges); virtual void slotItemsRemoved(const KItemRangeList& itemRanges);