┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Penz <[email protected]>2011-09-28 20:04:31 +0200
committerPeter Penz <[email protected]>2011-09-28 20:06:58 +0200
commite43f29576d4666a66cd4d236418baf403f176069 (patch)
tree3b53d949837b56060a4973891338cdbad5e5b348
parentec38f1cdb641f0b277100edd92b268ec856e2ece (diff)
Details view: Improve performance when expanding items
Prevent unnecessary calls to visibleRolesSizes() when expanding items. Also the performance has been improved when resizing the window.
-rw-r--r--src/kitemviews/kfileitemlistview.cpp20
-rw-r--r--src/kitemviews/kitemlistcontainer.cpp17
-rw-r--r--src/kitemviews/kitemlistview.cpp82
-rw-r--r--src/kitemviews/kitemlistview.h19
4 files changed, 85 insertions, 53 deletions
diff --git a/src/kitemviews/kfileitemlistview.cpp b/src/kitemviews/kfileitemlistview.cpp
index f1594b10b..d3de2c8c9 100644
--- a/src/kitemviews/kfileitemlistview.cpp
+++ b/src/kitemviews/kfileitemlistview.cpp
@@ -198,29 +198,11 @@ QHash<QByteArray, QSizeF> KFileItemListView::visibleRolesSizes(const KItemRangeL
maxTimeExceeded = true;
break;
}
+ ++calculatedItemCount;
}
if (maxTimeExceeded) {
break;
}
- ++calculatedItemCount;
- }
-
- // Stretch the width of the first role so that the full visible view-width
- // is used to show all roles.
- const qreal availableWidth = size().width();
-
- qreal usedWidth = 0;
- QHashIterator<QByteArray, QSizeF> it(sizes);
- while (it.hasNext()) {
- it.next();
- usedWidth += it.value().width();
- }
-
- if (usedWidth < availableWidth) {
- const QByteArray role = visibleRoles().first();
- QSizeF firstRoleSize = sizes.value(role);
- firstRoleSize.rwidth() += availableWidth - usedWidth;
- sizes.insert(role, firstRoleSize);
}
#ifdef KFILEITEMLISTVIEW_DEBUG
diff --git a/src/kitemviews/kitemlistcontainer.cpp b/src/kitemviews/kitemlistcontainer.cpp
index 3237187b4..45db700c5 100644
--- a/src/kitemviews/kitemlistcontainer.cpp
+++ b/src/kitemviews/kitemlistcontainer.cpp
@@ -205,7 +205,7 @@ void KItemListContainer::wheelEvent(QWheelEvent* event)
}
KItemListView* view = m_controller->view();
-
+
if (!view || event->orientation() != view->scrollOrientation()) {
return;
}
@@ -343,7 +343,7 @@ void KItemListContainer::updateItemOffsetScrollBar()
}
const int value = view->itemOffset();
- const int maximum = qMax(0, int(view->maximumItemOffset() - pageStep));
+ const int maximum = qMax(0, int(view->maximumItemOffset()) - pageStep);
itemOffsetScrollBar->setSingleStep(singleStep);
itemOffsetScrollBar->setPageStep(pageStep);
@@ -366,13 +366,16 @@ void KItemListContainer::updateGeometries()
rect.adjust(0, 0, -widthDec, -heightDec);
- m_controller->view()->setGeometry(QRect(0, 0, rect.width(), rect.height()));
+ const QRectF newGeometry(0, 0, rect.width(), rect.height());
+ if (m_controller->view()->geometry() != newGeometry) {
+ m_controller->view()->setGeometry(newGeometry);
- static_cast<KItemListContainerViewport*>(viewport())->scene()->setSceneRect(0, 0, rect.width(), rect.height());
- static_cast<KItemListContainerViewport*>(viewport())->viewport()->setGeometry(QRect(0, 0, rect.width(), rect.height()));
+ static_cast<KItemListContainerViewport*>(viewport())->scene()->setSceneRect(0, 0, rect.width(), rect.height());
+ static_cast<KItemListContainerViewport*>(viewport())->viewport()->setGeometry(QRect(0, 0, rect.width(), rect.height()));
- updateScrollOffsetScrollBar();
- updateItemOffsetScrollBar();
+ updateScrollOffsetScrollBar();
+ updateItemOffsetScrollBar();
+ }
}
void KItemListContainer::initialize()
diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp
index 1224ff6bd..988a45d40 100644
--- a/src/kitemviews/kitemlistview.cpp
+++ b/src/kitemviews/kitemlistview.cpp
@@ -60,6 +60,7 @@ KItemListView::KItemListView(QGraphicsWidget* parent) :
m_model(0),
m_visibleRoles(),
m_visibleRolesSizes(),
+ m_stretchedVisibleRolesSizes(),
m_widgetCreator(0),
m_groupHeaderCreator(0),
m_styleOption(),
@@ -136,7 +137,7 @@ void KItemListView::setItemSize(const QSizeF& itemSize)
m_itemSize = itemSize;
if (itemSize.isEmpty()) {
- updateVisibleRoleSizes();
+ updateVisibleRolesSizes();
}
if (itemSize.width() < previousSize.width() || itemSize.height() < previousSize.height()) {
@@ -210,14 +211,14 @@ void KItemListView::setVisibleRoles(const QList<QByteArray>& roles)
it.next();
KItemListWidget* widget = it.value();
widget->setVisibleRoles(roles);
- widget->setVisibleRolesSizes(m_visibleRolesSizes);
+ widget->setVisibleRolesSizes(m_stretchedVisibleRolesSizes);
}
m_sizeHintResolver->clearCache();
m_layouter->markAsDirty();
onVisibleRolesChanged(roles, previousRoles);
- updateVisibleRoleSizes();
+ updateVisibleRolesSizes();
updateLayout();
if (m_header) {
@@ -335,6 +336,7 @@ const KItemListStyleOption& KItemListView::styleOption() const
void KItemListView::setGeometry(const QRectF& rect)
{
QGraphicsWidget::setGeometry(rect);
+
if (!m_model) {
return;
}
@@ -349,7 +351,10 @@ void KItemListView::setGeometry(const QRectF& rect)
m_layoutTimer->start();
}
- updateVisibleRoleSizes();
+ // 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
@@ -605,7 +610,7 @@ void KItemListView::resizeEvent(QGraphicsSceneResizeEvent* event)
void KItemListView::slotItemsInserted(const KItemRangeList& itemRanges)
{
- updateVisibleRoleSizes(itemRanges);
+ updateVisibleRolesSizes(itemRanges);
const bool hasMultipleRanges = (itemRanges.count() > 1);
if (hasMultipleRanges) {
@@ -678,7 +683,7 @@ void KItemListView::slotItemsInserted(const KItemRangeList& itemRanges)
void KItemListView::slotItemsRemoved(const KItemRangeList& itemRanges)
{
- updateVisibleRoleSizes();
+ updateVisibleRolesSizes();
const bool hasMultipleRanges = (itemRanges.count() > 1);
if (hasMultipleRanges) {
@@ -762,7 +767,7 @@ void KItemListView::slotItemsChanged(const KItemRangeList& itemRanges,
{
const bool updateSizeHints = itemSizeHintUpdateRequired(roles);
if (updateSizeHints) {
- updateVisibleRoleSizes(itemRanges);
+ updateVisibleRolesSizes(itemRanges);
}
foreach (const KItemRange& itemRange, itemRanges) {
@@ -925,8 +930,9 @@ void KItemListView::slotVisibleRoleWidthChanged(const QByteArray& role,
QSizeF roleSize = m_visibleRolesSizes.value(role);
roleSize.setWidth(currentWidth);
m_visibleRolesSizes.insert(role, roleSize);
+ m_stretchedVisibleRolesSizes.insert(role, roleSize);
- updateVisibleRoleSizes();
+ updateVisibleRolesSizes();
updateLayout();
}
}
@@ -1340,7 +1346,7 @@ void KItemListView::setLayouterSize(const QSizeF& size, SizeType sizeType)
void KItemListView::updateWidgetProperties(KItemListWidget* widget, int index)
{
widget->setVisibleRoles(m_visibleRoles);
- widget->setVisibleRolesSizes(m_visibleRolesSizes);
+ widget->setVisibleRolesSizes(m_stretchedVisibleRolesSizes);
widget->setStyleOption(m_styleOption);
const KItemListSelectionManager* selectionManager = m_controller->selectionManager();
@@ -1373,7 +1379,7 @@ QHash<QByteArray, qreal> KItemListView::headerRolesWidths() const
{
QHash<QByteArray, qreal> rolesWidths;
- QHashIterator<QByteArray, QSizeF> it(m_visibleRolesSizes);
+ QHashIterator<QByteArray, QSizeF> it(m_stretchedVisibleRolesSizes);
while (it.hasNext()) {
it.next();
rolesWidths.insert(it.key(), it.value().width());
@@ -1382,7 +1388,7 @@ QHash<QByteArray, qreal> KItemListView::headerRolesWidths() const
return rolesWidths;
}
-void KItemListView::updateVisibleRoleSizes(const KItemRangeList& itemRanges)
+void KItemListView::updateVisibleRolesSizes(const KItemRangeList& itemRanges)
{
if (!m_itemSize.isEmpty() || m_useHeaderWidths) {
return;
@@ -1424,12 +1430,27 @@ void KItemListView::updateVisibleRoleSizes(const KItemRangeList& itemRanges)
}
}
- if (m_header) {
- m_header->setVisibleRolesWidths(headerRolesWidths());
+ updateStretchedVisibleRolesSizes();
+}
+
+void KItemListView::updateVisibleRolesSizes()
+{
+ const int itemCount = m_model->count();
+ if (itemCount > 0) {
+ updateVisibleRolesSizes(KItemRangeList() << KItemRange(0, itemCount));
+ }
+}
+
+void KItemListView::updateStretchedVisibleRolesSizes()
+{
+ if (!m_itemSize.isEmpty() || m_useHeaderWidths) {
+ return;
}
// Calculate the maximum size of an item by considering the
- // visible role sizes and apply them to the layouter.
+ // visible role sizes and apply them to the layouter. If the
+ // size does not use the available view-size it the size of the
+ // first role will get stretched.
qreal requiredWidth = 0;
qreal requiredHeight = 0;
@@ -1441,27 +1462,44 @@ void KItemListView::updateVisibleRoleSizes(const KItemRangeList& itemRanges)
requiredHeight += visibleRoleSize.height();
}
+ m_stretchedVisibleRolesSizes = m_visibleRolesSizes;
+ const QByteArray role = visibleRoles().first();
+ QSizeF firstRoleSize = m_stretchedVisibleRolesSizes.value(role);
+
QSizeF dynamicItemSize = m_itemSize;
+
if (dynamicItemSize.width() <= 0) {
- dynamicItemSize.setWidth(qMax(requiredWidth, size().width()));
+ const qreal availableWidth = size().width();
+ if (requiredWidth < availableWidth) {
+ // Stretch the first role to use the whole width for the item
+ firstRoleSize.rwidth() += availableWidth - requiredWidth;
+ m_stretchedVisibleRolesSizes.insert(role, firstRoleSize);
+ }
+ dynamicItemSize.setWidth(qMax(requiredWidth, availableWidth));
}
+
if (dynamicItemSize.height() <= 0) {
- dynamicItemSize.setHeight(qMax(requiredHeight, size().height()));
+ const qreal availableHeight = size().height();
+ if (requiredHeight < availableHeight) {
+ // Stretch the first role to use the whole height for the item
+ firstRoleSize.rheight() += availableHeight - requiredHeight;
+ m_stretchedVisibleRolesSizes.insert(role, firstRoleSize);
+ }
+ dynamicItemSize.setHeight(qMax(requiredHeight, availableHeight));
}
m_layouter->setItemSize(dynamicItemSize);
+ if (m_header) {
+ m_header->setVisibleRolesWidths(headerRolesWidths());
+ }
+
// Update the role sizes for all visible widgets
foreach (KItemListWidget* widget, visibleItemListWidgets()) {
- widget->setVisibleRolesSizes(m_visibleRolesSizes);
+ widget->setVisibleRolesSizes(m_stretchedVisibleRolesSizes);
}
}
-void KItemListView::updateVisibleRoleSizes()
-{
- updateVisibleRoleSizes(KItemRangeList() << KItemRange(0, m_model->count()));
-}
-
int KItemListView::calculateAutoScrollingIncrement(int pos, int range, int oldInc)
{
int inc = 0;
diff --git a/src/kitemviews/kitemlistview.h b/src/kitemviews/kitemlistview.h
index 091d2c36b..73b736bf7 100644
--- a/src/kitemviews/kitemlistview.h
+++ b/src/kitemviews/kitemlistview.h
@@ -337,16 +337,24 @@ private:
QHash<QByteArray, qreal> headerRolesWidths() const;
/**
- * Updates m_visibleRoleSizes by calling KItemListView::visibleRoleSizes()
- * if the m_itemRect is empty and no custom header-widths are used
- * (see m_useHeaderWidths).
+ * Updates m_visibleRolesSizes by calling KItemListView::visibleRolesSizes().
+ * Nothing will be done if m_itemRect is not empty or custom header-widths
+ * are used (see m_useHeaderWidths). Also m_strechedVisibleRolesSizes will be adjusted
+ * to respect the available view-size.
*/
- void updateVisibleRoleSizes(const KItemRangeList& itemRanges);
+ void updateVisibleRolesSizes(const KItemRangeList& itemRanges);
/**
* Convenience method for updateVisibleRoleSizes(KItemRangeList() << KItemRange(0, m_model->count()).
*/
- void updateVisibleRoleSizes();
+ void updateVisibleRolesSizes();
+
+ /**
+ * Updates m_stretchedVisibleRolesSizes based on m_visibleRolesSizes and the available
+ * view-size. Nothing will be done if m_itemRect is not empty or custom header-widths
+ * are used (see m_useHeaderWidths).
+ */
+ void updateStretchedVisibleRolesSizes();
/**
* Helper function for triggerAutoScrolling().
@@ -369,6 +377,7 @@ private:
KItemModelBase* m_model;
QList<QByteArray> m_visibleRoles;
QHash<QByteArray, QSizeF> m_visibleRolesSizes;
+ QHash<QByteArray, QSizeF> m_stretchedVisibleRolesSizes;
KItemListWidgetCreatorBase* m_widgetCreator;
KItemListGroupHeaderCreatorBase* m_groupHeaderCreator;
KItemListStyleOption m_styleOption;