From: Peter Penz Date: Sun, 25 Mar 2012 20:56:13 +0000 (+0200) Subject: Details view: Don't reset to automatic resizing when adding columns X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/e70c2f8aa472c01433f9416c363c698677c5b45f?ds=sidebyside Details view: Don't reset to automatic resizing when adding columns Until now when a new column is added in the case where custom column widths are used, the automatic resizing has been turned on again. The patch fixes this so that the current widths stay and the new column gets a proper default width. --- diff --git a/src/kitemviews/kitemlistheader.cpp b/src/kitemviews/kitemlistheader.cpp index 9c617840a..be7a09c8f 100644 --- a/src/kitemviews/kitemlistheader.cpp +++ b/src/kitemviews/kitemlistheader.cpp @@ -30,7 +30,8 @@ void KItemListHeader::setAutomaticColumnResizing(bool automatic) if (m_headerWidget->automaticColumnResizing() != automatic) { m_headerWidget->setAutomaticColumnResizing(automatic); if (automatic) { - m_view->resizeColumnWidths(); + m_view->applyAutomaticColumnWidths(); + m_view->doLayout(KItemListView::NoAnimation); } } } @@ -45,6 +46,7 @@ void KItemListHeader::setColumnWidth(const QByteArray& role, qreal width) if (!m_headerWidget->automaticColumnResizing()) { m_headerWidget->setColumnWidth(role, width); m_view->applyColumnWidthsFromHeader(); + m_view->doLayout(KItemListView::NoAnimation); } } @@ -62,6 +64,7 @@ void KItemListHeader::setColumnWidths(const QHash& columnWidt } m_view->applyColumnWidthsFromHeader(); + m_view->doLayout(KItemListView::NoAnimation); } } diff --git a/src/kitemviews/kitemlistheaderwidget.cpp b/src/kitemviews/kitemlistheaderwidget.cpp index 18b37c246..d3a8f001b 100644 --- a/src/kitemviews/kitemlistheaderwidget.cpp +++ b/src/kitemviews/kitemlistheaderwidget.cpp @@ -98,9 +98,14 @@ bool KItemListHeaderWidget::automaticColumnResizing() const void KItemListHeaderWidget::setColumns(const QList& roles) { + foreach (const QByteArray& role, roles) { + if (!m_columnWidths.contains(role)) { + m_columnWidths.remove(role); + m_preferredColumnWidths.remove(role); + } + } + m_columns = roles; - m_columnWidths.clear(); - m_preferredColumnWidths.clear(); update(); } diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index d8dd3e16f..e68c1143e 100644 --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -260,6 +260,27 @@ void KItemListView::setVisibleRoles(const QList& roles) { const QList previousRoles = m_visibleRoles; m_visibleRoles = roles; + onVisibleRolesChanged(roles, previousRoles); + + m_sizeHintResolver->clearCache(); + m_layouter->markAsDirty(); + + if (m_itemSize.isEmpty()) { + m_headerWidget->setColumns(roles); + updatePreferredColumnWidths(); + if (!m_headerWidget->automaticColumnResizing()) { + // The column-width of new roles are still 0. Apply the preferred + // column-width as default with. + foreach (const QByteArray& role, m_visibleRoles) { + if (m_headerWidget->columnWidth(role) == 0) { + const qreal width = m_headerWidget->preferredColumnWidth(role); + m_headerWidget->setColumnWidth(role, width); + } + } + + applyColumnWidthsFromHeader(); + } + } const bool alternateBackgroundsChanged = m_itemSize.isEmpty() && ((roles.count() > 1 && previousRoles.count() <= 1) || @@ -270,29 +291,12 @@ void KItemListView::setVisibleRoles(const QList& roles) it.next(); KItemListWidget* widget = it.value(); widget->setVisibleRoles(roles); - updateWidgetColumnWidths(widget); if (alternateBackgroundsChanged) { updateAlternateBackgroundForWidget(widget); } } - m_sizeHintResolver->clearCache(); - m_layouter->markAsDirty(); - - if (m_headerWidget->isVisible()) { - m_headerWidget->setColumns(roles); - } - - if (m_itemSize.isEmpty()) { - updatePreferredColumnWidths(); - if (!m_headerWidget->automaticColumnResizing()) { - applyColumnWidthsFromHeader(); - } - } - doLayout(NoAnimation); - - onVisibleRolesChanged(roles, previousRoles); } QList KItemListView::visibleRoles() const @@ -415,7 +419,7 @@ void KItemListView::setGeometry(const QRectF& rect) const QSizeF newSize = rect.size(); if (m_itemSize.isEmpty()) { if (m_headerWidget->automaticColumnResizing()) { - resizeColumnWidths(); + applyAutomaticColumnWidths(); } else { const qreal requiredWidth = columnWidthsSum(); const QSizeF dynamicItemSize(qMax(newSize.width(), requiredWidth), @@ -910,6 +914,8 @@ void KItemListView::slotItemsInserted(const KItemRangeList& itemRanges) void KItemListView::slotItemsRemoved(const KItemRangeList& itemRanges) { if (m_itemSize.isEmpty()) { + // Don't pass the item-range: The preferred column-widths of + // all items must be adjusted when removing items. updatePreferredColumnWidths(); } @@ -1225,6 +1231,7 @@ void KItemListView::slotHeaderColumnWidthChanged(const QByteArray& role, m_headerWidget->setAutomaticColumnResizing(false); applyColumnWidthsFromHeader(); + doLayout(NoAnimation); } void KItemListView::slotHeaderColumnMoved(const QByteArray& role, @@ -1918,7 +1925,6 @@ void KItemListView::updateWidgetColumnWidths(KItemListWidget* widget) void KItemListView::updatePreferredColumnWidths(const KItemRangeList& itemRanges) { Q_ASSERT(m_itemSize.isEmpty()); - const int itemCount = m_model->count(); int rangesItemCount = 0; foreach (const KItemRange& range, itemRanges) { @@ -1935,7 +1941,7 @@ void KItemListView::updatePreferredColumnWidths(const KItemRangeList& itemRanges // The chances are good that the widths of the sub ranges // already fit into the available widths and hence no // expensive update might be required. - bool updateRequired = false; + bool changed = false; const QHash updatedWidths = preferredColumnWidths(itemRanges); QHashIterator it(updatedWidths); @@ -1946,19 +1952,19 @@ void KItemListView::updatePreferredColumnWidths(const KItemRangeList& itemRanges const qreal currentWidth = m_headerWidget->preferredColumnWidth(role); if (updatedWidth > currentWidth) { m_headerWidget->setPreferredColumnWidth(role, updatedWidth); - updateRequired = true; + changed = true; } } - if (!updateRequired) { + if (!changed) { // All the updated sizes are smaller than the current sizes and no change // of the stretched roles-widths is required return; } } - if (m_header->automaticColumnResizing()) { - resizeColumnWidths(); + if (m_headerWidget->automaticColumnResizing()) { + applyAutomaticColumnWidths(); } } @@ -1974,7 +1980,7 @@ void KItemListView::updatePreferredColumnWidths() } } -void KItemListView::resizeColumnWidths() +void KItemListView::applyAutomaticColumnWidths() { Q_ASSERT(m_itemSize.isEmpty()); Q_ASSERT(m_headerWidget->automaticColumnResizing()); @@ -2007,7 +2013,7 @@ void KItemListView::resizeColumnWidths() // TODO: A proper calculation of the minimum width depends on the implementation // of KItemListWidget. Probably a kind of minimum size-hint should be introduced // later. - const qreal minWidth = m_styleOption.iconSize * 2 + 200; + const qreal minWidth = qMin(firstColumnWidth, qreal(m_styleOption.iconSize * 2 + 200)); if (shrinkedFirstColumnWidth < minWidth) { shrinkedFirstColumnWidth = minWidth; } diff --git a/src/kitemviews/kitemlistview.h b/src/kitemviews/kitemlistview.h index e1433f684..a3c2059d1 100644 --- a/src/kitemviews/kitemlistview.h +++ b/src/kitemviews/kitemlistview.h @@ -543,7 +543,7 @@ private: /** * Convenience method for - * updateColumnWidthsCache(KItemRangeList() << KItemRange(0, m_model->count()). + * updatePreferredColumnWidths(KItemRangeList() << KItemRange(0, m_model->count()). */ void updatePreferredColumnWidths(); @@ -551,7 +551,7 @@ private: * Resizes the column-widths of m_headerWidget based on the preferred widths * and the vailable view-size. */ - void resizeColumnWidths(); + void applyAutomaticColumnWidths(); /** * @return Sum of the widths of all columns. diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp index 8672b531b..c9af2248a 100644 --- a/src/views/dolphinview.cpp +++ b/src/views/dolphinview.cpp @@ -844,7 +844,6 @@ void DolphinView::slotHeaderContextMenuRequested(const QPointF& pos) foreach (const QByteArray& role, view->visibleRoles()) { columnWidths.append(header->columnWidth(role)); } - props.setHeaderColumnWidths(columnWidths); header->setAutomaticColumnResizing(false); } else { @@ -861,10 +860,11 @@ void DolphinView::slotHeaderContextMenuRequested(const QPointF& pos) view->setVisibleRoles(visibleRoles); props.setVisibleRoles(visibleRoles); - // Reset the stored column-widths, so that automatic resizing is - // used again. - props.setHeaderColumnWidths(QList()); - header->setAutomaticColumnResizing(true); + QList columnWidths; + foreach (const QByteArray& role, view->visibleRoles()) { + columnWidths.append(header->columnWidth(role)); + } + props.setHeaderColumnWidths(columnWidths); } }