// #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);
}
return m_scrollOrientation;
}
-void KItemListViewLayouter::setSize(const QSizeF& size)
+void KItemListViewLayouter::setSize(const QSizeF &size)
{
if (m_size != size) {
if (m_scrollOrientation == Qt::Vertical) {
return m_size;
}
-void KItemListViewLayouter::setItemSize(const QSizeF& size)
+void KItemListViewLayouter::setItemSize(const QSizeF &size)
{
if (m_itemSize != size) {
m_itemSize = size;
return m_itemSize;
}
-void KItemListViewLayouter::setItemMargin(const QSizeF& margin)
+void KItemListViewLayouter::setItemMargin(const QSizeF &margin)
{
if (m_itemMargin != margin) {
m_itemMargin = margin;
qreal KItemListViewLayouter::maximumScrollOffset() const
{
- const_cast<KItemListViewLayouter*>(this)->doLayout();
+ const_cast<KItemListViewLayouter *>(this)->doLayout();
return m_maximumScrollOffset;
}
qreal KItemListViewLayouter::maximumItemOffset() const
{
- const_cast<KItemListViewLayouter*>(this)->doLayout();
+ const_cast<KItemListViewLayouter *>(this)->doLayout();
return m_maximumItemOffset;
}
-void KItemListViewLayouter::setModel(const KItemModelBase* model)
+void KItemListViewLayouter::setModel(const KItemModelBase *model)
{
if (m_model != model) {
m_model = model;
}
}
-const KItemModelBase* KItemListViewLayouter::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();
}
// 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);
}
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();
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
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;
}
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());
bool KItemListViewLayouter::isFirstGroupItem(int itemIndex) const
{
- const_cast<KItemListViewLayouter*>(this)->doLayout();
+ const_cast<KItemListViewLayouter *>(this)->doLayout();
return m_groupItemIndexes.contains(itemIndex);
}
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;
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
}
}
+ 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();
// 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
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.
requiredItemHeight = sizeHintHeight;
}
- ItemInfo& itemInfo = m_itemInfos[index];
+ ItemInfo &itemInfo = m_itemInfos[index];
itemInfo.column = column;
itemInfo.row = row;
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;
}
return 100;
}
+#include "moc_kitemlistviewlayouter.cpp"