mirror of
https://invent.kde.org/system/dolphin
synced 2024-09-19 16:31:21 +00:00
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.
This commit is contained in:
parent
e70c2f8aa4
commit
b7f0091733
|
@ -193,52 +193,29 @@ QSizeF KFileItemListView::itemSizeHint(int index) const
|
|||
return QSize();
|
||||
}
|
||||
|
||||
QHash<QByteArray, qreal> KFileItemListView::preferredColumnWidths(const KItemRangeList& itemRanges) const
|
||||
qreal KFileItemListView::preferredColumnWidth(int index, const QByteArray& role) const
|
||||
{
|
||||
QElapsedTimer timer;
|
||||
timer.start();
|
||||
const KItemListStyleOption& option = styleOption();
|
||||
|
||||
QHash<QByteArray, qreal> 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<QByteArray, QVariant> 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<int>& 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<QByteArray, QVariant> 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()) {
|
||||
|
|
|
@ -78,7 +78,7 @@ public:
|
|||
virtual QSizeF itemSizeHint(int index) const;
|
||||
|
||||
/** @reimp */
|
||||
virtual QHash<QByteArray, qreal> preferredColumnWidths(const KItemRangeList& itemRanges) const;
|
||||
qreal preferredColumnWidth(int index, const QByteArray& role) const;
|
||||
|
||||
/** @reimp */
|
||||
virtual QPixmap createDragPixmap(const QSet<int>& 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();
|
||||
|
|
|
@ -514,10 +514,11 @@ QSizeF KItemListView::itemSizeHint(int index) const
|
|||
return itemSize();
|
||||
}
|
||||
|
||||
QHash<QByteArray, qreal> KItemListView::preferredColumnWidths(const KItemRangeList& itemRanges) const
|
||||
qreal KItemListView::preferredColumnWidth(int index, const QByteArray& role) const
|
||||
{
|
||||
Q_UNUSED(itemRanges);
|
||||
return QHash<QByteArray, qreal>();
|
||||
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<QByteArray, qreal> KItemListView::preferredColumnWidths(const KItemRangeList& itemRanges) const
|
||||
{
|
||||
QElapsedTimer timer;
|
||||
timer.start();
|
||||
|
||||
QHash<QByteArray, qreal> 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
|
||||
|
|
|
@ -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<QByteArray, qreal> 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<QByteArray, qreal> preferredColumnWidths(const KItemRangeList& itemRanges) const;
|
||||
|
||||
/**
|
||||
* Applies the column-widths from m_headerWidget to the layout
|
||||
* of the view.
|
||||
|
|
Loading…
Reference in a new issue