┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Penz <[email protected]>2011-10-02 16:42:26 +0200
committerPeter Penz <[email protected]>2011-10-02 16:42:26 +0200
commit5b015f037c934563ae316b76d2c84cfb1b912f94 (patch)
tree6156ed64da266d2a5181a6ece98c6b6b65158194
parenta9899482987cb7d0efd542771d270206320e2df4 (diff)
Fix layout when the header has been adjusted by the user
-rw-r--r--src/kitemviews/kitemlistview.cpp146
-rw-r--r--src/kitemviews/kitemlistview.h29
-rw-r--r--src/views/dolphinitemlistcontainer.cpp7
3 files changed, 109 insertions, 73 deletions
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<KItemListWidget*> 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<QByteArray, qreal> KItemListView::headerRolesWidths() const
{
QHash<QByteArray, qreal> 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<QByteArray, QSizeF> 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<QByteArray, QSizeF> it(m_visibleRolesSizes);
+ while (it.hasNext()) {
+ it.next();
+ widthSum += it.value().width();
+ }
+ return widthSum;
+}
+
+qreal KItemListView::visibleRolesSizesHeightSum() const
+{
+ qreal heightSum = 0;
+ QHashIterator<QByteArray, QSizeF> 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
@@ -101,13 +101,6 @@ public:
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
* result in calling KItemListController::onControllerChanged().
@@ -329,12 +322,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.
*/
QHash<QByteArray, qreal> headerRolesWidths() const;
@@ -360,6 +347,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.
* @param range Range of the visible area.
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);