X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/b81d3fbbbb188805e279791f4e06dec460f83697..b500c27e11acd6a6de4aab507f6df438b6d2f580:/src/kitemviews/private/kitemlistviewlayouter.cpp diff --git a/src/kitemviews/private/kitemlistviewlayouter.cpp b/src/kitemviews/private/kitemlistviewlayouter.cpp index 4c22b4dbc..99a95d98c 100644 --- a/src/kitemviews/private/kitemlistviewlayouter.cpp +++ b/src/kitemviews/private/kitemlistviewlayouter.cpp @@ -14,32 +14,32 @@ // #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() { Q_ASSERT(m_sizeHintResolver); } @@ -61,7 +61,7 @@ Qt::Orientation KItemListViewLayouter::scrollOrientation() const return m_scrollOrientation; } -void KItemListViewLayouter::setSize(const QSizeF& size) +void KItemListViewLayouter::setSize(const QSizeF &size) { if (m_size != size) { if (m_scrollOrientation == Qt::Vertical) { @@ -82,7 +82,7 @@ QSizeF KItemListViewLayouter::size() const return m_size; } -void KItemListViewLayouter::setItemSize(const QSizeF& size) +void KItemListViewLayouter::setItemSize(const QSizeF &size) { if (m_itemSize != size) { m_itemSize = size; @@ -95,7 +95,7 @@ QSizeF KItemListViewLayouter::itemSize() const return m_itemSize; } -void KItemListViewLayouter::setItemMargin(const QSizeF& margin) +void KItemListViewLayouter::setItemMargin(const QSizeF &margin) { if (m_itemMargin != margin) { m_itemMargin = margin; @@ -162,7 +162,7 @@ qreal KItemListViewLayouter::scrollOffset() const qreal KItemListViewLayouter::maximumScrollOffset() const { - const_cast(this)->doLayout(); + const_cast(this)->doLayout(); return m_maximumScrollOffset; } @@ -181,11 +181,11 @@ qreal KItemListViewLayouter::itemOffset() const qreal KItemListViewLayouter::maximumItemOffset() const { - const_cast(this)->doLayout(); + const_cast(this)->doLayout(); return m_maximumItemOffset; } -void KItemListViewLayouter::setModel(const KItemModelBase* model) +void KItemListViewLayouter::setModel(const KItemModelBase *model) { if (m_model != model) { m_model = model; @@ -193,26 +193,26 @@ void KItemListViewLayouter::setModel(const KItemModelBase* model) } } -const KItemModelBase* KItemListViewLayouter::model() const +const KItemModelBase *KItemListViewLayouter::model() const { return m_model; } int KItemListViewLayouter::firstVisibleIndex() const { - const_cast(this)->doLayout(); + const_cast(this)->doLayout(); return m_firstVisibleIndex; } int KItemListViewLayouter::lastVisibleIndex() const { - const_cast(this)->doLayout(); + const_cast(this)->doLayout(); return m_lastVisibleIndex; } QRectF KItemListViewLayouter::itemRect(int index) const { - const_cast(this)->doLayout(); + const_cast(this)->doLayout(); if (index < 0 || index >= m_itemInfos.count()) { return QRectF(); } @@ -226,8 +226,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 +246,7 @@ QRectF KItemListViewLayouter::itemRect(int index) const QRectF KItemListViewLayouter::groupHeaderRect(int index) const { - const_cast(this)->doLayout(); + const_cast(this)->doLayout(); const QRectF firstItemRect = itemRect(index); QPointF pos = firstItemRect.topLeft(); @@ -256,7 +260,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 +274,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 +285,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(this)->doLayout(); + const_cast(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(this)->doLayout(); + const_cast(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(this)->doLayout(); + const_cast(this)->doLayout(); const int height = static_cast(m_size.height()); const int rowHeight = static_cast(m_itemSize.height()); @@ -327,7 +332,7 @@ int KItemListViewLayouter::maximumVisibleItems() const bool KItemListViewLayouter::isFirstGroupItem(int itemIndex) const { - const_cast(this)->doLayout(); + const_cast(this)->doLayout(); return m_groupItemIndexes.contains(itemIndex); } @@ -336,18 +341,19 @@ void KItemListViewLayouter::markAsDirty() m_dirty = true; } - #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,7 +371,7 @@ 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 @@ -381,8 +387,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 +408,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 +416,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 +481,7 @@ void KItemListViewLayouter::doLayout() requiredItemHeight = sizeHintHeight; } - ItemInfo& itemInfo = m_itemInfos[index]; + ItemInfo &itemInfo = m_itemInfos[index]; itemInfo.column = column; itemInfo.row = row; @@ -598,7 +612,7 @@ bool KItemListViewLayouter::createGroupHeaders() m_groupItemIndexes.clear(); - const QList > groups = m_model->groups(); + const QList> groups = m_model->groups(); if (groups.isEmpty()) { return false; } @@ -616,3 +630,4 @@ qreal KItemListViewLayouter::minimumGroupHeaderWidth() const return 100; } +#include "moc_kitemlistviewlayouter.cpp"