]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/private/kitemlistviewlayouter.cpp
dolphinmainwindow: zoom action is now a KToolBarPopupAction
[dolphin.git] / src / kitemviews / private / kitemlistviewlayouter.cpp
index 4c22b4dbcbac26714888e4fed1adb6c82acf0fb3..3ed2343a83c2ace6ae93af4b6acbf727a67fa677 100644 (file)
 
 // #define KITEMLISTVIEWLAYOUTER_DEBUG
 
-KItemListViewLayouter::KItemListViewLayouter(KItemListSizeHintResolver* sizeHintResolver, QObject* parent) :
-    QObject(parent),
-    m_dirty(true),
-    m_visibleIndexesDirty(true),
-    m_scrollOrientation(Qt::Vertical),
-    m_size(),
-    m_itemSize(128, 128),
-    m_itemMargin(),
-    m_headerHeight(0),
-    m_model(nullptr),
-    m_sizeHintResolver(sizeHintResolver),
-    m_scrollOffset(0),
-    m_maximumScrollOffset(0),
-    m_itemOffset(0),
-    m_maximumItemOffset(0),
-    m_firstVisibleIndex(-1),
-    m_lastVisibleIndex(-1),
-    m_columnWidth(0),
-    m_xPosInc(0),
-    m_columnCount(0),
-    m_rowOffsets(),
-    m_columnOffsets(),
-    m_groupItemIndexes(),
-    m_groupHeaderHeight(0),
-    m_groupHeaderMargin(0),
-    m_itemInfos()
+KItemListViewLayouter::KItemListViewLayouter(KItemListSizeHintResolver *sizeHintResolver, QObject *parent)
+    : QObject(parent)
+    , m_dirty(true)
+    , m_visibleIndexesDirty(true)
+    , m_scrollOrientation(Qt::Vertical)
+    , m_size()
+    , m_itemSize(128, 128)
+    , m_itemMargin()
+    , m_headerHeight(0)
+    , m_model(nullptr)
+    , m_sizeHintResolver(sizeHintResolver)
+    , m_scrollOffset(0)
+    , m_maximumScrollOffset(0)
+    , m_itemOffset(0)
+    , m_maximumItemOffset(0)
+    , m_firstVisibleIndex(-1)
+    , m_lastVisibleIndex(-1)
+    , m_columnWidth(0)
+    , m_xPosInc(0)
+    , m_columnCount(0)
+    , m_rowOffsets()
+    , m_columnOffsets()
+    , m_groupItemIndexes()
+    , m_groupHeaderHeight(0)
+    , m_groupHeaderMargin(0)
+    , m_itemInfos()
+    , m_statusBarOffset(0)
 {
     Q_ASSERT(m_sizeHintResolver);
 }
@@ -61,7 +62,7 @@ Qt::Orientation KItemListViewLayouter::scrollOrientation() const
     return m_scrollOrientation;
 }
 
-void KItemListViewLayouter::setSize(const QSizeFsize)
+void KItemListViewLayouter::setSize(const QSizeF &size)
 {
     if (m_size != size) {
         if (m_scrollOrientation == Qt::Vertical) {
@@ -82,7 +83,7 @@ QSizeF KItemListViewLayouter::size() const
     return m_size;
 }
 
-void KItemListViewLayouter::setItemSize(const QSizeFsize)
+void KItemListViewLayouter::setItemSize(const QSizeF &size)
 {
     if (m_itemSize != size) {
         m_itemSize = size;
@@ -95,7 +96,7 @@ QSizeF KItemListViewLayouter::itemSize() const
     return m_itemSize;
 }
 
-void KItemListViewLayouter::setItemMargin(const QSizeFmargin)
+void KItemListViewLayouter::setItemMargin(const QSizeF &margin)
 {
     if (m_itemMargin != margin) {
         m_itemMargin = margin;
@@ -162,7 +163,7 @@ qreal KItemListViewLayouter::scrollOffset() const
 
 qreal KItemListViewLayouter::maximumScrollOffset() const
 {
-    const_cast<KItemListViewLayouter*>(this)->doLayout();
+    const_cast<KItemListViewLayouter *>(this)->doLayout();
     return m_maximumScrollOffset;
 }
 
@@ -181,11 +182,11 @@ qreal KItemListViewLayouter::itemOffset() const
 
 qreal KItemListViewLayouter::maximumItemOffset() const
 {
-    const_cast<KItemListViewLayouter*>(this)->doLayout();
+    const_cast<KItemListViewLayouter *>(this)->doLayout();
     return m_maximumItemOffset;
 }
 
-void KItemListViewLayouter::setModel(const KItemModelBasemodel)
+void KItemListViewLayouter::setModel(const KItemModelBase *model)
 {
     if (m_model != model) {
         m_model = model;
@@ -193,26 +194,26 @@ void KItemListViewLayouter::setModel(const KItemModelBase* model)
     }
 }
 
-const KItemModelBaseKItemListViewLayouter::model() const
+const KItemModelBase *KItemListViewLayouter::model() const
 {
     return m_model;
 }
 
 int KItemListViewLayouter::firstVisibleIndex() const
 {
-    const_cast<KItemListViewLayouter*>(this)->doLayout();
+    const_cast<KItemListViewLayouter *>(this)->doLayout();
     return m_firstVisibleIndex;
 }
 
 int KItemListViewLayouter::lastVisibleIndex() const
 {
-    const_cast<KItemListViewLayouter*>(this)->doLayout();
+    const_cast<KItemListViewLayouter *>(this)->doLayout();
     return m_lastVisibleIndex;
 }
 
 QRectF KItemListViewLayouter::itemRect(int index) const
 {
-    const_cast<KItemListViewLayouter*>(this)->doLayout();
+    const_cast<KItemListViewLayouter *>(this)->doLayout();
     if (index < 0 || index >= m_itemInfos.count()) {
         return QRectF();
     }
@@ -226,8 +227,12 @@ QRectF KItemListViewLayouter::itemRect(int index) const
         // Rotate the logical direction which is always vertical by 90°
         // to get the physical horizontal direction
         QPointF pos(y, x);
-        pos.rx() -= m_scrollOffset;
         sizeHint.transpose();
+        if (QGuiApplication::isRightToLeft()) {
+            pos.rx() = m_size.width() - 1 + m_scrollOffset - pos.x() - sizeHint.width();
+        } else {
+            pos.rx() -= m_scrollOffset;
+        }
         return QRectF(pos, sizeHint);
     }
 
@@ -242,7 +247,7 @@ QRectF KItemListViewLayouter::itemRect(int index) const
 
 QRectF KItemListViewLayouter::groupHeaderRect(int index) const
 {
-    const_cast<KItemListViewLayouter*>(this)->doLayout();
+    const_cast<KItemListViewLayouter *>(this)->doLayout();
 
     const QRectF firstItemRect = itemRect(index);
     QPointF pos = firstItemRect.topLeft();
@@ -256,7 +261,6 @@ QRectF KItemListViewLayouter::groupHeaderRect(int index) const
         pos.ry() -= m_groupHeaderHeight;
         size = QSizeF(m_size.width(), m_groupHeaderHeight);
     } else {
-        pos.rx() -= m_itemMargin.width();
         pos.ry() = 0;
 
         // Determine the maximum width used in the current column. As the
@@ -271,9 +275,8 @@ QRectF KItemListViewLayouter::groupHeaderRect(int index) const
                 break;
             }
 
-            const qreal itemWidth = (m_scrollOrientation == Qt::Vertical)
-                                     ? m_sizeHintResolver->sizeHint(index).width()
-                                     : m_sizeHintResolver->sizeHint(index).height();
+            const qreal itemWidth =
+                (m_scrollOrientation == Qt::Vertical) ? m_sizeHintResolver->sizeHint(index).width() : m_sizeHintResolver->sizeHint(index).height();
 
             if (itemWidth > headerWidth) {
                 headerWidth = itemWidth;
@@ -283,37 +286,40 @@ QRectF KItemListViewLayouter::groupHeaderRect(int index) const
         }
 
         size = QSizeF(headerWidth, m_size.height());
+
+        if (QGuiApplication::isRightToLeft()) {
+            pos.setX(firstItemRect.right() + m_itemMargin.width() - size.width());
+        } else {
+            pos.rx() -= m_itemMargin.width();
+        }
     }
+
     return QRectF(pos, size);
 }
 
 int KItemListViewLayouter::itemColumn(int index) const
 {
-    const_cast<KItemListViewLayouter*>(this)->doLayout();
+    const_cast<KItemListViewLayouter *>(this)->doLayout();
     if (index < 0 || index >= m_itemInfos.count()) {
         return -1;
     }
 
-    return (m_scrollOrientation == Qt::Vertical)
-            ? m_itemInfos[index].column
-            : m_itemInfos[index].row;
+    return (m_scrollOrientation == Qt::Vertical) ? m_itemInfos[index].column : m_itemInfos[index].row;
 }
 
 int KItemListViewLayouter::itemRow(int index) const
 {
-    const_cast<KItemListViewLayouter*>(this)->doLayout();
+    const_cast<KItemListViewLayouter *>(this)->doLayout();
     if (index < 0 || index >= m_itemInfos.count()) {
         return -1;
     }
 
-    return (m_scrollOrientation == Qt::Vertical)
-            ? m_itemInfos[index].row
-            : m_itemInfos[index].column;
+    return (m_scrollOrientation == Qt::Vertical) ? m_itemInfos[index].row : m_itemInfos[index].column;
 }
 
 int KItemListViewLayouter::maximumVisibleItems() const
 {
-    const_cast<KItemListViewLayouter*>(this)->doLayout();
+    const_cast<KItemListViewLayouter *>(this)->doLayout();
 
     const int height = static_cast<int>(m_size.height());
     const int rowHeight = static_cast<int>(m_itemSize.height());
@@ -327,7 +333,7 @@ int KItemListViewLayouter::maximumVisibleItems() const
 
 bool KItemListViewLayouter::isFirstGroupItem(int itemIndex) const
 {
-    const_cast<KItemListViewLayouter*>(this)->doLayout();
+    const_cast<KItemListViewLayouter *>(this)->doLayout();
     return m_groupItemIndexes.contains(itemIndex);
 }
 
@@ -336,18 +342,26 @@ void KItemListViewLayouter::markAsDirty()
     m_dirty = true;
 }
 
+void KItemListViewLayouter::setStatusBarOffset(int offset)
+{
+    if (m_statusBarOffset != offset) {
+        m_statusBarOffset = offset;
+    }
+}
 
 #ifndef QT_NO_DEBUG
-    bool KItemListViewLayouter::isDirty()
-    {
-        return m_dirty;
-    }
+bool KItemListViewLayouter::isDirty()
+{
+    return m_dirty;
+}
 #endif
 
 void KItemListViewLayouter::doLayout()
 {
     // we always want to update visible indexes after performing a layout
-    auto qsg = qScopeGuard([this] { updateVisibleIndexes(); });
+    auto qsg = qScopeGuard([this] {
+        updateVisibleIndexes();
+    });
 
     if (!m_dirty) {
         return;
@@ -365,13 +379,14 @@ void KItemListViewLayouter::doLayout()
 
     const bool grouped = createGroupHeaders();
 
-    const bool horizontalScrolling = (m_scrollOrientation == Qt::Horizontal);
+    const bool horizontalScrolling = m_scrollOrientation == Qt::Horizontal;
     if (horizontalScrolling) {
         // Flip everything so that the layout logically can work like having
         // a vertical scrolling
         itemSize.transpose();
         itemMargin.transpose();
         size.transpose();
+        size.rwidth() -= m_statusBarOffset;
 
         if (grouped) {
             // In the horizontal scrolling case all groups are aligned
@@ -381,8 +396,9 @@ void KItemListViewLayouter::doLayout()
         }
     }
 
+    const bool isRightToLeft = QGuiApplication::isRightToLeft();
     m_columnWidth = itemSize.width() + itemMargin.width();
-    const qreal widthForColumns = size.width() - itemMargin.width();
+    const qreal widthForColumns = std::max(size.width() - itemMargin.width(), m_columnWidth);
     m_columnCount = qMax(1, int(widthForColumns / m_columnWidth));
     m_xPosInc = itemMargin.width();
 
@@ -401,7 +417,7 @@ void KItemListViewLayouter::doLayout()
 
     // Calculate the offset of each column, i.e., the x-coordinate where the column starts.
     m_columnOffsets.resize(m_columnCount);
-    qreal currentOffset = QGuiApplication::isRightToLeft() ? widthForColumns : m_xPosInc;
+    qreal currentOffset = isRightToLeft && !horizontalScrolling ? widthForColumns : m_xPosInc;
 
     if (grouped && horizontalScrolling) {
         // All group headers will always be aligned on the top and not
@@ -409,13 +425,20 @@ void KItemListViewLayouter::doLayout()
         currentOffset += m_groupHeaderHeight;
     }
 
-    if (QGuiApplication::isLeftToRight()) for (int column = 0; column < m_columnCount; ++column) {
-        m_columnOffsets[column] = currentOffset;
-        currentOffset += m_columnWidth;
-    }
-    else for (int column = 0; column < m_columnCount; ++column) {
-        m_columnOffsets[column] = currentOffset - m_columnWidth;
-        currentOffset -= m_columnWidth;
+    if (isRightToLeft) {
+        for (int column = 0; column < m_columnCount; ++column) {
+            if (horizontalScrolling) {
+                m_columnOffsets[column] = currentOffset + column * m_columnWidth;
+            } else {
+                currentOffset -= m_columnWidth;
+                m_columnOffsets[column] = currentOffset;
+            }
+        }
+    } else {
+        for (int column = 0; column < m_columnCount; ++column) {
+            m_columnOffsets[column] = currentOffset;
+            currentOffset += m_columnWidth;
+        }
     }
 
     // Prepare the QVector which stores the y-coordinate for each new row.
@@ -467,7 +490,7 @@ void KItemListViewLayouter::doLayout()
                 requiredItemHeight = sizeHintHeight;
             }
 
-            ItemInfoitemInfo = m_itemInfos[index];
+            ItemInfo &itemInfo = m_itemInfos[index];
             itemInfo.column = column;
             itemInfo.row = row;
 
@@ -598,7 +621,7 @@ bool KItemListViewLayouter::createGroupHeaders()
 
     m_groupItemIndexes.clear();
 
-    const QList<QPair<int, QVariant> > groups = m_model->groups();
+    const QList<QPair<int, QVariant>> groups = m_model->groups();
     if (groups.isEmpty()) {
         return false;
     }
@@ -616,3 +639,4 @@ qreal KItemListViewLayouter::minimumGroupHeaderWidth() const
     return 100;
 }
 
+#include "moc_kitemlistviewlayouter.cpp"