From: Peter Penz Date: Sun, 2 Oct 2011 14:42:26 +0000 (+0200) Subject: Fix layout when the header has been adjusted by the user X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/5b015f037c934563ae316b76d2c84cfb1b912f94 Fix layout when the header has been adjusted by the user --- diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index 7017e315c..83008518e 100644 --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -138,9 +138,11 @@ void KItemListView::setItemSize(const QSizeF& itemSize) m_itemSize = itemSize; - if (itemSize.isEmpty()) { + const bool emptySize = itemSize.isEmpty(); + if (emptySize) { updateVisibleRolesSizes(); } + setHeaderShown(emptySize); if (itemSize.width() < previousSize.width() || itemSize.height() < previousSize.height()) { prepareLayoutForIncreasedItemCount(itemSize, ItemSize); @@ -261,36 +263,6 @@ bool KItemListView::autoScroll() const return m_autoScrollTimer != 0; } -void KItemListView::setHeaderShown(bool show) -{ - if (show && !m_header) { - m_header = new KItemListHeader(this); - m_header->setPos(0, 0); - m_header->setModel(m_model); - m_header->setVisibleRoles(m_visibleRoles); - m_header->setVisibleRolesWidths(headerRolesWidths()); - m_header->setZValue(1); - - m_useHeaderWidths = false; - updateHeaderWidth(); - - connect(m_header, SIGNAL(visibleRoleWidthChanged(QByteArray,qreal,qreal)), - this, SLOT(slotVisibleRoleWidthChanged(QByteArray,qreal,qreal))); - - m_layouter->setHeaderHeight(m_header->size().height()); - } else if (!show && m_header) { - delete m_header; - m_header = 0; - m_useHeaderWidths = false; - m_layouter->setHeaderHeight(0); - } -} - -bool KItemListView::isHeaderShown() const -{ - return m_header != 0; -} - KItemListController* KItemListView::controller() const { return m_controller; @@ -614,7 +586,29 @@ QList KItemListView::visibleItemListWidgets() const void KItemListView::resizeEvent(QGraphicsSceneResizeEvent* event) { QGraphicsWidget::resizeEvent(event); - updateHeaderWidth(); + if (m_itemSize.isEmpty() && m_useHeaderWidths) { + QSizeF dynamicItemSize = m_layouter->itemSize(); + const QSizeF newSize = event->newSize(); + + if (m_itemSize.width() < 0) { + const qreal requiredWidth = visibleRolesSizesWidthSum(); + if (newSize.width() > requiredWidth) { + dynamicItemSize.setWidth(newSize.width()); + } + const qreal headerWidth = qMax(newSize.width(), requiredWidth); + m_header->resize(headerWidth, m_header->size().height()); + } + + if (m_itemSize.height() < 0) { + const qreal requiredHeight = visibleRolesSizesHeightSum(); + if (newSize.height() > requiredHeight) { + dynamicItemSize.setHeight(newSize.height()); + } + // TODO: KItemListHeader is not prepared for vertical alignment + } + + m_layouter->setItemSize(dynamicItemSize); + } } void KItemListView::slotItemsInserted(const KItemRangeList& itemRanges) @@ -950,7 +944,24 @@ void KItemListView::slotVisibleRoleWidthChanged(const QByteArray& role, m_visibleRolesSizes.insert(role, roleSize); m_stretchedVisibleRolesSizes.insert(role, roleSize); - updateVisibleRolesSizes(); + // Apply the new size to the layouter + QSizeF dynamicItemSize = m_itemSize; + if (dynamicItemSize.width() < 0) { + const qreal requiredWidth = visibleRolesSizesWidthSum(); + dynamicItemSize.setWidth(qMax(size().width(), requiredWidth)); + } + if (dynamicItemSize.height() < 0) { + const qreal requiredHeight = visibleRolesSizesHeightSum(); + dynamicItemSize.setHeight(qMax(size().height(), requiredHeight)); + } + + m_layouter->setItemSize(dynamicItemSize); + + // Update the role sizes for all visible widgets + foreach (KItemListWidget* widget, visibleItemListWidgets()) { + widget->setVisibleRolesSizes(m_stretchedVisibleRolesSizes); + } + updateLayout(); } } @@ -1387,16 +1398,6 @@ void KItemListView::updateWidgetProperties(KItemListWidget* widget, int index) widget->setData(m_model->data(index)); } -void KItemListView::updateHeaderWidth() -{ - if (!m_header) { - return; - } - - // TODO 1: Use the required width of all roles - m_header->resize(size().width(), m_header->size().height()); -} - QHash KItemListView::headerRolesWidths() const { QHash rolesWidths; @@ -1473,17 +1474,6 @@ void KItemListView::updateStretchedVisibleRolesSizes() // 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; - - QHashIterator it(m_visibleRolesSizes); - while (it.hasNext()) { - it.next(); - const QSizeF& visibleRoleSize = it.value(); - requiredWidth += visibleRoleSize.width(); - requiredHeight += visibleRoleSize.height(); - } - m_stretchedVisibleRolesSizes = m_visibleRolesSizes; const QByteArray role = visibleRoles().first(); QSizeF firstRoleSize = m_stretchedVisibleRolesSizes.value(role); @@ -1491,6 +1481,7 @@ void KItemListView::updateStretchedVisibleRolesSizes() QSizeF dynamicItemSize = m_itemSize; if (dynamicItemSize.width() <= 0) { + const qreal requiredWidth = visibleRolesSizesWidthSum(); const qreal availableWidth = size().width(); if (requiredWidth < availableWidth) { // Stretch the first role to use the whole width for the item @@ -1501,6 +1492,7 @@ void KItemListView::updateStretchedVisibleRolesSizes() } if (dynamicItemSize.height() <= 0) { + const qreal requiredHeight = visibleRolesSizesHeightSum(); const qreal availableHeight = size().height(); if (requiredHeight < availableHeight) { // Stretch the first role to use the whole height for the item @@ -1523,6 +1515,52 @@ void KItemListView::updateStretchedVisibleRolesSizes() } } +void KItemListView::setHeaderShown(bool show) +{ + if (show && !m_header) { + m_header = new KItemListHeader(this); + m_header->setPos(0, 0); + m_header->setModel(m_model); + m_header->setVisibleRoles(m_visibleRoles); + m_header->setVisibleRolesWidths(headerRolesWidths()); + m_header->setZValue(1); + + m_useHeaderWidths = false; + + connect(m_header, SIGNAL(visibleRoleWidthChanged(QByteArray,qreal,qreal)), + this, SLOT(slotVisibleRoleWidthChanged(QByteArray,qreal,qreal))); + + m_layouter->setHeaderHeight(m_header->size().height()); + } else if (!show && m_header) { + delete m_header; + m_header = 0; + m_useHeaderWidths = false; + m_layouter->setHeaderHeight(0); + } +} + +qreal KItemListView::visibleRolesSizesWidthSum() const +{ + qreal widthSum = 0; + QHashIterator it(m_visibleRolesSizes); + while (it.hasNext()) { + it.next(); + widthSum += it.value().width(); + } + return widthSum; +} + +qreal KItemListView::visibleRolesSizesHeightSum() const +{ + qreal heightSum = 0; + QHashIterator it(m_visibleRolesSizes); + while (it.hasNext()) { + it.next(); + heightSum += it.value().height(); + } + return heightSum; +} + 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 3ddfabde6..47de53e20 100644 --- a/src/kitemviews/kitemlistview.h +++ b/src/kitemviews/kitemlistview.h @@ -100,13 +100,6 @@ public: void setAutoScroll(bool enabled); bool autoScroll() const; - /** - * Turns on the header if \p show is true. Per default the - * header is not shown. - */ - void setHeaderShown(bool show); - bool isHeaderShown() const; - /** * @return Controller of the item-list. The controller gets * initialized by KItemListController::setView() and will @@ -328,12 +321,6 @@ private: */ void updateWidgetProperties(KItemListWidget* widget, int index); - /** - * Updates the width of the KItemListHeader corresponding to the required width of - * the roles. - */ - void updateHeaderWidth(); - /** * @return The widths of each visible role that is shown in the KItemListHeader. */ @@ -359,6 +346,22 @@ private: */ void updateStretchedVisibleRolesSizes(); + /** + * Turns on the header if \p show is true. Per default the + * header is not shown. + */ + void setHeaderShown(bool show); + + /** + * @return Sum of the widths of all visible roles. + */ + qreal visibleRolesSizesWidthSum() const; + + /** + * @return Sum of the heights of all visible roles. + */ + qreal visibleRolesSizesHeightSum() const; + /** * Helper function for triggerAutoScrolling(). * @param pos Logical position of the mouse relative to the range. diff --git a/src/views/dolphinitemlistcontainer.cpp b/src/views/dolphinitemlistcontainer.cpp index e1be814c0..76096dece 100644 --- a/src/views/dolphinitemlistcontainer.cpp +++ b/src/views/dolphinitemlistcontainer.cpp @@ -189,16 +189,11 @@ void DolphinItemListContainer::setItemLayout(KFileItemListView::Layout layout) switch (layout) { case KFileItemListView::IconsLayout: + case KFileItemListView::DetailsLayout: m_fileItemListView->setScrollOrientation(Qt::Vertical); - m_fileItemListView->setHeaderShown(false); break; case KFileItemListView::CompactLayout: m_fileItemListView->setScrollOrientation(Qt::Horizontal); - m_fileItemListView->setHeaderShown(false); - break; - case KFileItemListView::DetailsLayout: - m_fileItemListView->setScrollOrientation(Qt::Vertical); - m_fileItemListView->setHeaderShown(true); break; default: Q_ASSERT(false);