]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Details view: Don't reset to automatic resizing when adding columns
authorPeter Penz <peter.penz19@gmail.com>
Sun, 25 Mar 2012 20:56:13 +0000 (22:56 +0200)
committerPeter Penz <peter.penz19@gmail.com>
Sun, 25 Mar 2012 20:58:16 +0000 (22:58 +0200)
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.

src/kitemviews/kitemlistheader.cpp
src/kitemviews/kitemlistheaderwidget.cpp
src/kitemviews/kitemlistview.cpp
src/kitemviews/kitemlistview.h
src/views/dolphinview.cpp

index 9c617840aa84e72acc2875aa0d9a52480dc846c0..be7a09c8f0ac12a1a36b9c0393ed7ec0d2c6c087 100644 (file)
@@ -30,7 +30,8 @@ void KItemListHeader::setAutomaticColumnResizing(bool automatic)
     if (m_headerWidget->automaticColumnResizing() != automatic) {
         m_headerWidget->setAutomaticColumnResizing(automatic);
         if (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();
     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<QByteArray, qreal>& columnWidt
         }
 
         m_view->applyColumnWidthsFromHeader();
         }
 
         m_view->applyColumnWidthsFromHeader();
+        m_view->doLayout(KItemListView::NoAnimation);
     }
 }
 
     }
 }
 
index 18b37c246dfc1d888743b0f5ffc604aea4c8a24c..d3a8f001b53bf139c1c356718e79a46b8e13e289 100644 (file)
@@ -98,9 +98,14 @@ bool KItemListHeaderWidget::automaticColumnResizing() const
 
 void KItemListHeaderWidget::setColumns(const QList<QByteArray>& roles)
 {
 
 void KItemListHeaderWidget::setColumns(const QList<QByteArray>& roles)
 {
+    foreach (const QByteArray& role, roles) {
+        if (!m_columnWidths.contains(role)) {
+            m_columnWidths.remove(role);
+            m_preferredColumnWidths.remove(role);
+        }
+    }
+
     m_columns = roles;
     m_columns = roles;
-    m_columnWidths.clear();
-    m_preferredColumnWidths.clear();
     update();
 }
 
     update();
 }
 
index d8dd3e16f4dd69a631979e86a3bcdb52066706cb..e68c1143e7c61eec1b25c17f44365155e9d0151c 100644 (file)
@@ -260,6 +260,27 @@ void KItemListView::setVisibleRoles(const QList<QByteArray>& roles)
 {
     const QList<QByteArray> previousRoles = m_visibleRoles;
     m_visibleRoles = roles;
 {
     const QList<QByteArray> 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) ||
 
     const bool alternateBackgroundsChanged = m_itemSize.isEmpty() &&
                                              ((roles.count() > 1 && previousRoles.count() <= 1) ||
@@ -270,29 +291,12 @@ void KItemListView::setVisibleRoles(const QList<QByteArray>& roles)
         it.next();
         KItemListWidget* widget = it.value();
         widget->setVisibleRoles(roles);
         it.next();
         KItemListWidget* widget = it.value();
         widget->setVisibleRoles(roles);
-        updateWidgetColumnWidths(widget);
         if (alternateBackgroundsChanged) {
             updateAlternateBackgroundForWidget(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);
     doLayout(NoAnimation);
-
-    onVisibleRolesChanged(roles, previousRoles);
 }
 
 QList<QByteArray> KItemListView::visibleRoles() const
 }
 
 QList<QByteArray> 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()) {
     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),
         } 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()) {
 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();
     }
 
         updatePreferredColumnWidths();
     }
 
@@ -1225,6 +1231,7 @@ void KItemListView::slotHeaderColumnWidthChanged(const QByteArray& role,
 
     m_headerWidget->setAutomaticColumnResizing(false);
     applyColumnWidthsFromHeader();
 
     m_headerWidget->setAutomaticColumnResizing(false);
     applyColumnWidthsFromHeader();
+    doLayout(NoAnimation);
 }
 
 void KItemListView::slotHeaderColumnMoved(const QByteArray& role,
 }
 
 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());
 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) {
     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.
         // 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<QByteArray, qreal> updatedWidths = preferredColumnWidths(itemRanges);
         QHashIterator<QByteArray, qreal> it(updatedWidths);
 
         const QHash<QByteArray, qreal> updatedWidths = preferredColumnWidths(itemRanges);
         QHashIterator<QByteArray, qreal> 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);
             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;
         }
     }
 
             // 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());
 {
     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.
         // 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;
         }
         if (shrinkedFirstColumnWidth < minWidth) {
             shrinkedFirstColumnWidth = minWidth;
         }
index e1433f684a2147526d58cc72d6308b1ecf33ff2b..a3c2059d141e7eac596aed50e2a91ccb63ec6ee3 100644 (file)
@@ -543,7 +543,7 @@ private:
 
     /**
      * Convenience method for
 
     /**
      * Convenience method for
-     * updateColumnWidthsCache(KItemRangeList() << KItemRange(0, m_model->count()).
+     * updatePreferredColumnWidths(KItemRangeList() << KItemRange(0, m_model->count()).
      */
     void updatePreferredColumnWidths();
 
      */
     void updatePreferredColumnWidths();
 
@@ -551,7 +551,7 @@ private:
      * Resizes the column-widths of m_headerWidget based on the preferred widths
      * and the vailable view-size.
      */
      * 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.
 
     /**
      * @return Sum of the widths of all columns.
index 8672b531bf356223af3b4f916440b132ea77c6f4..c9af2248a681d5bd2367ff89415539d5357d02de 100644 (file)
@@ -844,7 +844,6 @@ void DolphinView::slotHeaderContextMenuRequested(const QPointF& pos)
             foreach (const QByteArray& role, view->visibleRoles()) {
                 columnWidths.append(header->columnWidth(role));
             }
             foreach (const QByteArray& role, view->visibleRoles()) {
                 columnWidths.append(header->columnWidth(role));
             }
-
             props.setHeaderColumnWidths(columnWidths);
             header->setAutomaticColumnResizing(false);
         } else {
             props.setHeaderColumnWidths(columnWidths);
             header->setAutomaticColumnResizing(false);
         } else {
@@ -861,10 +860,11 @@ void DolphinView::slotHeaderContextMenuRequested(const QPointF& pos)
             view->setVisibleRoles(visibleRoles);
             props.setVisibleRoles(visibleRoles);
 
             view->setVisibleRoles(visibleRoles);
             props.setVisibleRoles(visibleRoles);
 
-            // Reset the stored column-widths, so that automatic resizing is
-            // used again.
-            props.setHeaderColumnWidths(QList<int>());
-            header->setAutomaticColumnResizing(true);
+            QList<int> columnWidths;
+            foreach (const QByteArray& role, view->visibleRoles()) {
+                columnWidths.append(header->columnWidth(role));
+            }
+            props.setHeaderColumnWidths(columnWidths);
         }
     }
 
         }
     }