From b7f0091733ec558ced0eacf0708c0146e3961bb3 Mon Sep 17 00:00:00 2001 From: Peter Penz Date: Sun, 25 Mar 2012 23:57:51 +0200 Subject: [PATCH] Internal interface cleanup Let derived classes from KItemListView just implement preferredColumnWidth() for one role of an item instead of returning a hashtable for a given item-range. --- src/kitemviews/kfileitemlistview.cpp | 83 ++++++---------------------- src/kitemviews/kfileitemlistview.h | 3 +- src/kitemviews/kitemlistview.cpp | 45 ++++++++++++++- src/kitemviews/kitemlistview.h | 18 ++++-- 4 files changed, 72 insertions(+), 77 deletions(-) diff --git a/src/kitemviews/kfileitemlistview.cpp b/src/kitemviews/kfileitemlistview.cpp index a0650b6656..aa368bfef0 100644 --- a/src/kitemviews/kfileitemlistview.cpp +++ b/src/kitemviews/kfileitemlistview.cpp @@ -193,52 +193,29 @@ QSizeF KFileItemListView::itemSizeHint(int index) const return QSize(); } -QHash KFileItemListView::preferredColumnWidths(const KItemRangeList& itemRanges) const +qreal KFileItemListView::preferredColumnWidth(int index, const QByteArray& role) const { - QElapsedTimer timer; - timer.start(); + const KItemListStyleOption& option = styleOption(); - QHash widths; + qreal width = m_minimumRolesWidths.value(role, 0); - int calculatedItemCount = 0; - bool maxTimeExceeded = false; - foreach (const KItemRange& itemRange, itemRanges) { - const int startIndex = itemRange.index; - const int endIndex = startIndex + itemRange.count - 1; - - for (int i = startIndex; i <= endIndex; ++i) { - foreach (const QByteArray& visibleRole, visibleRoles()) { - qreal maxWidth = widths.value(visibleRole, 0); - const QSizeF itemSize = visibleRoleSizeHint(i, visibleRole); - maxWidth = qMax(itemSize.width(), maxWidth); - widths.insert(visibleRole, maxWidth); - } - - if (calculatedItemCount > 100 && timer.elapsed() > 200) { - // When having several thousands of items calculating the sizes can get - // very expensive. We accept a possibly too small role-size in favour - // of having no blocking user interface. - #ifdef KFILEITEMLISTVIEW_DEBUG - kDebug() << "Timer exceeded, stopped after" << calculatedItemCount << "items"; - #endif - maxTimeExceeded = true; - break; - } - ++calculatedItemCount; - } - if (maxTimeExceeded) { - break; - } + const QHash values = model()->data(index); + const QString text = KFileItemListWidget::roleText(role, values); + if (!text.isEmpty()) { + const qreal columnPadding = option.padding * 3; + width = qMax(width, qreal(2 * columnPadding + option.fontMetrics.width(text))); } -#ifdef KFILEITEMLISTVIEW_DEBUG - int rangesItemCount = 0; - foreach (const KItemRange& itemRange, itemRanges) { - rangesItemCount += itemRange.count; + if (role == "name") { + // Increase the width by the expansion-toggle and the current expansion level + const int expandedParentsCount = values.value("expandedParentsCount", 0).toInt(); + width += option.padding + (expandedParentsCount + 1) * itemSize().height() + KIconLoader::SizeSmall; + + // Increase the width by the required space for the icon + width += option.padding * 2 + option.iconSize; } - kDebug() << "[TIME] Calculated dynamic item size for " << rangesItemCount << "items:" << timer.elapsed(); -#endif - return widths; + + return width; } QPixmap KFileItemListView::createDragPixmap(const QSet& indexes) const @@ -496,32 +473,6 @@ void KFileItemListView::updateIconSize() updateTimersInterval(); } -QSizeF KFileItemListView::visibleRoleSizeHint(int index, const QByteArray& role) const -{ - const KItemListStyleOption& option = styleOption(); - - qreal width = m_minimumRolesWidths.value(role, 0); - const qreal height = option.padding * 2 + option.fontMetrics.height(); - - const QHash values = model()->data(index); - const QString text = KFileItemListWidget::roleText(role, values); - if (!text.isEmpty()) { - const qreal columnPadding = option.padding * 3; - width = qMax(width, qreal(2 * columnPadding + option.fontMetrics.width(text))); - } - - if (role == "name") { - // Increase the width by the expansion-toggle and the current expansion level - const int expandedParentsCount = values.value("expandedParentsCount", 0).toInt(); - width += option.padding + (expandedParentsCount + 1) * itemSize().height() + KIconLoader::SizeSmall; - - // Increase the width by the required space for the icon - width += option.padding * 2 + option.iconSize; - } - - return QSizeF(width, height); -} - void KFileItemListView::updateLayoutOfVisibleItems() { if (!model()) { diff --git a/src/kitemviews/kfileitemlistview.h b/src/kitemviews/kfileitemlistview.h index db8566934a..1e372881a3 100644 --- a/src/kitemviews/kfileitemlistview.h +++ b/src/kitemviews/kfileitemlistview.h @@ -78,7 +78,7 @@ public: virtual QSizeF itemSizeHint(int index) const; /** @reimp */ - virtual QHash preferredColumnWidths(const KItemRangeList& itemRanges) const; + qreal preferredColumnWidth(int index, const QByteArray& role) const; /** @reimp */ virtual QPixmap createDragPixmap(const QSet& indexes) const; @@ -109,7 +109,6 @@ private slots: void updateIconSize(); private: - QSizeF visibleRoleSizeHint(int index, const QByteArray& role) const; void updateLayoutOfVisibleItems(); void updateTimersInterval(); void updateMinimumRolesWidths(); diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index e68c1143e7..fdb68a1a40 100644 --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -514,10 +514,11 @@ QSizeF KItemListView::itemSizeHint(int index) const return itemSize(); } -QHash KItemListView::preferredColumnWidths(const KItemRangeList& itemRanges) const +qreal KItemListView::preferredColumnWidth(int index, const QByteArray& role) const { - Q_UNUSED(itemRanges); - return QHash(); + Q_UNUSED(index); + Q_UNUSED(role); + return 100; } void KItemListView::setSupportsItemExpanding(bool supportsExpanding) @@ -1898,6 +1899,44 @@ bool KItemListView::useAlternateBackgrounds() const return m_itemSize.isEmpty() && m_visibleRoles.count() > 1; } +QHash KItemListView::preferredColumnWidths(const KItemRangeList& itemRanges) const +{ + QElapsedTimer timer; + timer.start(); + + QHash widths; + + int calculatedItemCount = 0; + bool maxTimeExceeded = false; + foreach (const KItemRange& itemRange, itemRanges) { + const int startIndex = itemRange.index; + const int endIndex = startIndex + itemRange.count - 1; + + for (int i = startIndex; i <= endIndex; ++i) { + foreach (const QByteArray& visibleRole, visibleRoles()) { + qreal maxWidth = widths.value(visibleRole, 0); + const qreal width = preferredColumnWidth(i, visibleRole); + maxWidth = qMax(width, maxWidth); + widths.insert(visibleRole, maxWidth); + } + + if (calculatedItemCount > 100 && timer.elapsed() > 200) { + // When having several thousands of items calculating the sizes can get + // very expensive. We accept a possibly too small role-size in favour + // of having no blocking user interface. + maxTimeExceeded = true; + break; + } + ++calculatedItemCount; + } + if (maxTimeExceeded) { + break; + } + } + + return widths; +} + void KItemListView::applyColumnWidthsFromHeader() { // Apply the new size to the layouter diff --git a/src/kitemviews/kitemlistview.h b/src/kitemviews/kitemlistview.h index a3c2059d14..4026925856 100644 --- a/src/kitemviews/kitemlistview.h +++ b/src/kitemviews/kitemlistview.h @@ -193,13 +193,10 @@ public: virtual QSizeF itemSizeHint(int index) const; /** - * @param itemRanges Items that must be checked for getting the widths of columns. - * @return The preferred width of the column of each visible role. The width will - * be respected if the width of the item size is <= 0 (see - * KItemListView::setItemSize()). Per default an empty hash - * is returned. + * @return The preferred column-width of the item with the index \a index + * for the given \a role that is shown in the column. */ - virtual QHash preferredColumnWidths(const KItemRangeList& itemRanges) const; + virtual qreal preferredColumnWidth(int index, const QByteArray& role) const; /** * If set to true, items having child-items can be expanded to show the child-items as @@ -524,6 +521,15 @@ private: */ bool useAlternateBackgrounds() const; + /** + * @param itemRanges Items that must be checked for getting the widths of columns. + * @return The preferred width of the column of each visible role. The width will + * be respected if the width of the item size is <= 0 (see + * KItemListView::setItemSize()). Per default an empty hash + * is returned. + */ + QHash preferredColumnWidths(const KItemRangeList& itemRanges) const; + /** * Applies the column-widths from m_headerWidget to the layout * of the view.