]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/kitemlistview.cpp
KItemListView: Don't allow starting role editing when animation is running
[dolphin.git] / src / kitemviews / kitemlistview.cpp
index 7a3cbbcb6a7eb7cf75ceca588611b1023695eaa7..75d85be358953e7897936800d303142b183ef9f5 100644 (file)
@@ -8,12 +8,16 @@
 
 #include "kitemlistview.h"
 
+#ifndef QT_NO_ACCESSIBILITY
+#include "accessibility/kitemlistcontaineraccessible.h"
+#include "accessibility/kitemlistdelegateaccessible.h"
+#include "accessibility/kitemlistviewaccessible.h"
+#endif
 #include "dolphindebug.h"
 #include "kitemlistcontainer.h"
 #include "kitemlistcontroller.h"
 #include "kitemlistheader.h"
 #include "kitemlistselectionmanager.h"
-#include "kitemlistviewaccessible.h"
 #include "kstandarditemlistwidget.h"
 
 #include "private/kitemlistheaderwidget.h"
@@ -21,6 +25,8 @@
 #include "private/kitemlistsizehintresolver.h"
 #include "private/kitemlistviewlayouter.h"
 
+#include <optional>
+
 #include <QElapsedTimer>
 #include <QGraphicsSceneMouseEvent>
 #include <QGraphicsView>
@@ -50,9 +56,14 @@ QAccessibleInterface *accessibleInterfaceFactory(const QString &key, QObject *ob
     Q_UNUSED(key)
 
     if (KItemListContainer *container = qobject_cast<KItemListContainer *>(object)) {
+        if (auto controller = container->controller(); controller) {
+            if (KItemListView *view = controller->view(); view && view->accessibleParent()) {
+                return view->accessibleParent();
+            }
+        }
         return new KItemListContainerAccessible(container);
     } else if (KItemListView *view = qobject_cast<KItemListView *>(object)) {
-        return new KItemListViewAccessible(view);
+        return new KItemListViewAccessible(view, view->accessibleParent());
     }
 
     return nullptr;
@@ -95,6 +106,7 @@ KItemListView::KItemListView(QGraphicsWidget *parent)
     , m_header(nullptr)
     , m_headerWidget(nullptr)
     , m_indicatorAnimation(nullptr)
+    , m_statusBarOffset(0)
     , m_dropIndicator()
     , m_sizeHintResolver(nullptr)
 {
@@ -181,7 +193,7 @@ qreal KItemListView::scrollOffset() const
 
 qreal KItemListView::maximumScrollOffset() const
 {
-    return m_layouter->maximumScrollOffset();
+    return m_layouter->maximumScrollOffset() + m_statusBarOffset;
 }
 
 void KItemListView::setItemOffset(qreal offset)
@@ -231,7 +243,7 @@ void KItemListView::setVisibleRoles(const QList<QByteArray> &roles)
         if (!m_headerWidget->automaticColumnResizing()) {
             // The column-width of new roles are still 0. Apply the preferred
             // column-width as default with.
-            for (const QByteArray &role : qAsConst(m_visibleRoles)) {
+            for (const QByteArray &role : std::as_const(m_visibleRoles)) {
                 if (m_headerWidget->columnWidth(role) == 0) {
                     const qreal width = m_headerWidget->preferredColumnWidth(role);
                     m_headerWidget->setColumnWidth(role, width);
@@ -337,6 +349,19 @@ KItemListGroupHeaderCreatorBase *KItemListView::groupHeaderCreator() const
     return m_groupHeaderCreator;
 }
 
+#ifndef QT_NO_ACCESSIBILITY
+void KItemListView::setAccessibleParentsObject(KItemListContainer *accessibleParentsObject)
+{
+    Q_ASSERT(!m_accessibleParent);
+    m_accessibleParent = new KItemListContainerAccessible(accessibleParentsObject);
+}
+KItemListContainerAccessible *KItemListView::accessibleParent()
+{
+    Q_CHECK_PTR(m_accessibleParent); // We always want the accessibility tree/hierarchy to be complete.
+    return m_accessibleParent;
+}
+#endif
+
 QSizeF KItemListView::itemSize() const
 {
     return m_itemSize;
@@ -361,7 +386,7 @@ void KItemListView::setGeometry(const QRectF &rect)
         if (m_headerWidget->automaticColumnResizing()) {
             applyAutomaticColumnWidths();
         } else {
-            const qreal requiredWidth = columnWidthsSum();
+            const qreal requiredWidth = m_headerWidget->leftPadding() + columnWidthsSum() + m_headerWidget->rightPadding();
             const QSizeF dynamicItemSize(qMax(newSize.width(), requiredWidth), m_itemSize.height());
             m_layouter->setItemSize(dynamicItemSize);
         }
@@ -373,6 +398,12 @@ void KItemListView::setGeometry(const QRectF &rect)
     doLayout(NoAnimation);
 }
 
+qreal KItemListView::scrollSingleStep() const
+{
+    const QFontMetrics metrics(font());
+    return metrics.height();
+}
+
 qreal KItemListView::verticalPageStep() const
 {
     qreal headerHeight = 0;
@@ -384,13 +415,17 @@ qreal KItemListView::verticalPageStep() const
 
 std::optional<int> KItemListView::itemAt(const QPointF &pos) const
 {
+    if (headerBoundaries().contains(pos)) {
+        return std::nullopt;
+    }
+
     QHashIterator<int, KItemListWidget *> it(m_visibleItems);
     while (it.hasNext()) {
         it.next();
 
         const KItemListWidget *widget = it.value();
         const QPointF mappedPos = widget->mapFromItem(this, pos);
-        if (widget->contains(mappedPos) || widget->selectionRect().contains(mappedPos)) {
+        if (widget->contains(mappedPos)) {
             return it.key();
         }
     }
@@ -507,7 +542,7 @@ QRectF KItemListView::itemContextRect(int index) const
 
     const KItemListWidget *widget = m_visibleItems.value(index);
     if (widget) {
-        contextRect = widget->iconRect() | widget->textRect();
+        contextRect = widget->selectionRectCore();
         contextRect.translate(itemRect(index).topLeft());
     }
 
@@ -519,38 +554,101 @@ bool KItemListView::isElided(int index) const
     return m_sizeHintResolver->isElided(index);
 }
 
-void KItemListView::scrollToItem(int index)
+void KItemListView::scrollToItem(int index, ViewItemPosition viewItemPosition)
 {
     QRectF viewGeometry = geometry();
     if (m_headerWidget->isVisible()) {
         const qreal headerHeight = m_headerWidget->size().height();
         viewGeometry.adjust(0, headerHeight, 0, 0);
     }
+    if (m_statusBarOffset != 0) {
+        viewGeometry.adjust(0, 0, 0, -m_statusBarOffset);
+    }
     QRectF currentRect = itemRect(index);
 
-    // Fix for Bug 311099 - View the underscore when using Ctrl + PagDown
+    if (layoutDirection() == Qt::RightToLeft && scrollOrientation() == Qt::Horizontal) {
+        currentRect.moveLeft(m_layouter->size().width() - currentRect.right());
+    }
+
+    // Fix for Bug 311099 - View the underscore when using Ctrl + PageDown
     currentRect.adjust(-m_styleOption.horizontalMargin, -m_styleOption.verticalMargin, m_styleOption.horizontalMargin, m_styleOption.verticalMargin);
 
-    if (!viewGeometry.contains(currentRect)) {
-        qreal newOffset = scrollOffset();
-        if (scrollOrientation() == Qt::Vertical) {
-            if (currentRect.top() < viewGeometry.top()) {
-                newOffset += currentRect.top() - viewGeometry.top();
-            } else if (currentRect.bottom() > viewGeometry.bottom()) {
-                newOffset += currentRect.bottom() - viewGeometry.bottom();
+    qreal offset = 0;
+    switch (scrollOrientation()) {
+    case Qt::Vertical:
+        if (currentRect.top() < viewGeometry.top() || currentRect.bottom() > viewGeometry.bottom()) {
+            switch (viewItemPosition) {
+            case Beginning:
+                offset = currentRect.top() - viewGeometry.top();
+                break;
+            case Middle:
+                offset = 0.5 * (currentRect.top() + currentRect.bottom() - (viewGeometry.top() + viewGeometry.bottom()));
+                break;
+            case End:
+                offset = currentRect.bottom() - viewGeometry.bottom();
+                break;
+            case Nearest:
+                if (currentRect.top() < viewGeometry.top()) {
+                    offset = currentRect.top() - viewGeometry.top();
+                }
+                if (currentRect.bottom() > viewGeometry.bottom() + offset) {
+                    offset += currentRect.bottom() - viewGeometry.bottom() - offset;
+                }
+                break;
+            default:
+                Q_UNREACHABLE();
             }
-        } else {
-            if (currentRect.left() < viewGeometry.left()) {
-                newOffset += currentRect.left() - viewGeometry.left();
-            } else if (currentRect.right() > viewGeometry.right()) {
-                newOffset += currentRect.right() - viewGeometry.right();
+        }
+        break;
+    case Qt::Horizontal:
+        if (currentRect.left() < viewGeometry.left() || currentRect.right() > viewGeometry.right()) {
+            switch (viewItemPosition) {
+            case Beginning:
+                if (layoutDirection() == Qt::RightToLeft) {
+                    offset = currentRect.right() - viewGeometry.right();
+                } else {
+                    offset = currentRect.left() - viewGeometry.left();
+                }
+                break;
+            case Middle:
+                offset = 0.5 * (currentRect.left() + currentRect.right() - (viewGeometry.left() + viewGeometry.right()));
+                break;
+            case End:
+                if (layoutDirection() == Qt::RightToLeft) {
+                    offset = currentRect.left() - viewGeometry.left();
+                } else {
+                    offset = currentRect.right() - viewGeometry.right();
+                }
+                break;
+            case Nearest:
+                if (layoutDirection() == Qt::RightToLeft) {
+                    if (currentRect.left() < viewGeometry.left()) {
+                        offset = currentRect.left() - viewGeometry.left();
+                    }
+                    if (currentRect.right() > viewGeometry.right() + offset) {
+                        offset += currentRect.right() - viewGeometry.right() - offset;
+                    }
+                } else {
+                    if (currentRect.right() > viewGeometry.right()) {
+                        offset = currentRect.right() - viewGeometry.right();
+                    }
+                    if (currentRect.left() < viewGeometry.left() + offset) {
+                        offset += currentRect.left() - viewGeometry.left() - offset;
+                    }
+                }
+                break;
+            default:
+                Q_UNREACHABLE();
             }
         }
+        break;
+    default:
+        Q_UNREACHABLE();
+    }
 
-        if (newOffset != scrollOffset()) {
-            Q_EMIT scrollTo(newOffset);
-            return;
-        }
+    if (!qFuzzyIsNull(offset)) {
+        Q_EMIT scrollTo(scrollOffset() + offset);
+        return;
     }
 
     Q_EMIT scrollingStopped();
@@ -652,11 +750,16 @@ QPixmap KItemListView::createDragPixmap(const KItemSet &indexes) const
 void KItemListView::editRole(int index, const QByteArray &role)
 {
     KStandardItemListWidget *widget = qobject_cast<KStandardItemListWidget *>(m_visibleItems.value(index));
-    if (!widget || m_editingRole) {
+    if (!widget) {
+        return;
+    }
+    if (m_editingRole || m_animation->isStarted(widget)) {
+        Q_EMIT widget->roleEditingCanceled(index, role, QVariant());
         return;
     }
 
     m_editingRole = true;
+    m_controller->selectionManager()->setCurrentItem(index);
     widget->setEditedRole(role);
 
     connect(widget, &KItemListWidget::roleEditingCanceled, this, &KItemListView::slotRoleEditingCanceled);
@@ -669,7 +772,7 @@ void KItemListView::paint(QPainter *painter, const QStyleOptionGraphicsItem *opt
 {
     QGraphicsWidget::paint(painter, option, widget);
 
-    for (auto animation : qAsConst(m_rubberBandAnimations)) {
+    for (auto animation : std::as_const(m_rubberBandAnimations)) {
         QRectF rubberBandRect = animation->property(RubberPropertyName).toRectF();
 
         const QPointF topLeft = rubberBandRect.topLeft();
@@ -740,6 +843,16 @@ void KItemListView::paint(QPainter *painter, const QStyleOptionGraphicsItem *opt
     }
 }
 
+void KItemListView::setStatusBarOffset(int offset)
+{
+    if (m_statusBarOffset != offset) {
+        m_statusBarOffset = offset;
+        if (m_layouter) {
+            m_layouter->setStatusBarOffset(offset);
+        }
+    }
+}
+
 QVariant KItemListView::itemChange(GraphicsItemChange change, const QVariant &value)
 {
     if (change == QGraphicsItem::ItemSceneHasChanged && scene()) {
@@ -961,6 +1074,18 @@ bool KItemListView::event(QEvent *event)
         updateFont();
         break;
 
+    case QEvent::FocusIn:
+        focusInEvent(static_cast<QFocusEvent *>(event));
+        event->accept();
+        return true;
+        break;
+
+    case QEvent::FocusOut:
+        focusOutEvent(static_cast<QFocusEvent *>(event));
+        event->accept();
+        return true;
+        break;
+
     default:
         // Forward all other events to the controller and handle them there
         if (!m_editingRole && m_controller && m_controller->processEvent(event, transform())) {
@@ -1034,12 +1159,9 @@ void KItemListView::updateFont()
 
 void KItemListView::updatePalette()
 {
-    if (scene() && !scene()->views().isEmpty()) {
-        KItemListStyleOption option = styleOption();
-        option.palette = scene()->views().first()->palette();
-
-        setStyleOption(option);
-    }
+    KItemListStyleOption option = styleOption();
+    option.palette = palette();
+    setStyleOption(option);
 }
 
 void KItemListView::slotItemsInserted(const KItemRangeList &itemRanges)
@@ -1223,7 +1345,7 @@ void KItemListView::slotItemsRemoved(const KItemRangeList &itemRanges)
         // after the deleted items. It is important to update them in ascending
         // order to prevent overlaps when setting the new index.
         std::sort(itemsToMove.begin(), itemsToMove.end());
-        for (int i : qAsConst(itemsToMove)) {
+        for (int i : std::as_const(itemsToMove)) {
             KItemListWidget *widget = m_visibleItems.value(i);
             Q_ASSERT(widget);
             const int newIndex = i - count;
@@ -1281,9 +1403,20 @@ void KItemListView::slotItemsMoved(const KItemRange &itemRange, const QList<int>
     const int firstVisibleMovedIndex = qMax(firstVisibleIndex(), itemRange.index);
     const int lastVisibleMovedIndex = qMin(lastVisibleIndex(), itemRange.index + itemRange.count - 1);
 
+    /// Represents an item that was moved while being edited.
+    struct MovedEditedItem {
+        int movedToIndex;
+        QByteArray editedRole;
+    };
+    std::optional<MovedEditedItem> movedEditedItem;
     for (int index = firstVisibleMovedIndex; index <= lastVisibleMovedIndex; ++index) {
         KItemListWidget *widget = m_visibleItems.value(index);
         if (widget) {
+            if (m_editingRole && !widget->editedRole().isEmpty()) {
+                movedEditedItem = {movedToIndexes[index - itemRange.index], widget->editedRole()};
+                disconnectRoleEditingSignals(index);
+                m_editingRole = false;
+            }
             updateWidgetProperties(widget, index);
             initializeItemListWidget(widget);
         }
@@ -1291,6 +1424,10 @@ void KItemListView::slotItemsMoved(const KItemRange &itemRange, const QList<int>
 
     doLayout(NoAnimation);
     updateSiblingsInformation();
+
+    if (movedEditedItem) {
+        editRole(movedEditedItem->movedToIndex, movedEditedItem->editedRole);
+    }
 }
 
 void KItemListView::slotItemsChanged(const KItemRangeList &itemRanges, const QSet<QByteArray> &roles)
@@ -1324,13 +1461,7 @@ void KItemListView::slotItemsChanged(const KItemRangeList &itemRanges, const QSe
             updateVisibleGroupHeaders();
             doLayout(NoAnimation);
         }
-
-        QAccessibleTableModelChangeEvent ev(this, QAccessibleTableModelChangeEvent::DataChanged);
-        ev.setFirstRow(itemRange.index);
-        ev.setLastRow(itemRange.index + itemRange.count);
-        QAccessible::updateAccessibility(&ev);
     }
-
     doLayout(NoAnimation);
 }
 
@@ -1392,8 +1523,6 @@ void KItemListView::slotSortRoleChanged(const QByteArray &current, const QByteAr
 
 void KItemListView::slotCurrentChanged(int current, int previous)
 {
-    Q_UNUSED(previous)
-
     // In SingleSelection mode (e.g., in the Places Panel), the current item is
     // always the selected item. It is not necessary to highlight the current item then.
     if (m_controller->selectionBehavior() != KItemListController::SingleSelection) {
@@ -1407,23 +1536,39 @@ void KItemListView::slotCurrentChanged(int current, int previous)
             currentWidget->setCurrent(true);
         }
     }
-
-    QAccessibleEvent ev(this, QAccessible::Focus);
-    ev.setChild(current);
-    QAccessible::updateAccessibility(&ev);
+#ifndef QT_NO_ACCESSIBILITY
+    if (current != previous && QAccessible::isActive()) {
+        static_cast<KItemListViewAccessible *>(QAccessible::queryAccessibleInterface(this))->announceCurrentItem();
+    }
+#endif
 }
 
 void KItemListView::slotSelectionChanged(const KItemSet &current, const KItemSet &previous)
 {
-    Q_UNUSED(previous)
-
     QHashIterator<int, KItemListWidget *> it(m_visibleItems);
     while (it.hasNext()) {
         it.next();
         const int index = it.key();
         KItemListWidget *widget = it.value();
-        widget->setSelected(current.contains(index));
+        const bool isSelected(current.contains(index));
+        widget->setSelected(isSelected);
+
+#ifndef QT_NO_ACCESSIBILITY
+        if (!QAccessible::isActive()) {
+            continue;
+        }
+        // Let the screen reader announce "selected" or "not selected" for the active item.
+        const bool wasSelected(previous.contains(index));
+        if (isSelected != wasSelected) {
+            QAccessibleEvent accessibleSelectionChangedEvent(this, QAccessible::SelectionAdd);
+            accessibleSelectionChangedEvent.setChild(index);
+            QAccessible::updateAccessibility(&accessibleSelectionChangedEvent);
+        }
+    }
+#else
     }
+    Q_UNUSED(previous)
+#endif
 }
 
 void KItemListView::slotAnimationFinished(QGraphicsWidget *widget, KItemListViewAnimation::AnimationType type)
@@ -1476,10 +1621,10 @@ void KItemListView::slotRubberBandActivationChanged(bool active)
         curve.addCubicBezierSegment(QPointF(0.4, 0.0), QPointF(1.0, 1.0), QPointF(1.0, 1.0));
         animation->setEasingCurve(curve);
 
-        connect(animation, &QVariantAnimation::valueChanged, this, [=](const QVariant &) {
+        connect(animation, &QVariantAnimation::valueChanged, this, [=, this](const QVariant &) {
             update();
         });
-        connect(animation, &QVariantAnimation::finished, this, [=]() {
+        connect(animation, &QVariantAnimation::finished, this, [=, this]() {
             m_rubberBandAnimations.removeAll(animation);
             delete animation;
         });
@@ -1775,6 +1920,9 @@ void KItemListView::doLayout(LayoutAnimationHint hint, int changedIndex, int cha
 
         if (animate) {
             if (m_animation->isStarted(widget, KItemListViewAnimation::MovingAnimation)) {
+                if (m_editingRole) {
+                    Q_EMIT widget->roleEditingCanceled(widget->index(), QByteArray(), QVariant());
+                }
                 m_animation->start(widget, KItemListViewAnimation::MovingAnimation, newPos);
                 applyNewPos = false;
             }
@@ -1849,7 +1997,7 @@ void KItemListView::doLayout(LayoutAnimationHint hint, int changedIndex, int cha
     }
 
     // Delete invisible KItemListWidget instances that have not been reused
-    for (int index : qAsConst(reusableItems)) {
+    for (int index : std::as_const(reusableItems)) {
         recycleWidget(m_visibleItems.value(index));
     }
 
@@ -2225,7 +2373,7 @@ QHash<QByteArray, qreal> KItemListView::preferredColumnWidths(const KItemRangeLi
     const QFontMetricsF fontMetrics(m_headerWidget->font());
     const int gripMargin = m_headerWidget->style()->pixelMetric(QStyle::PM_HeaderGripMargin);
     const int headerMargin = m_headerWidget->style()->pixelMetric(QStyle::PM_HeaderMargin);
-    for (const QByteArray &visibleRole : qAsConst(m_visibleRoles)) {
+    for (const QByteArray &visibleRole : std::as_const(m_visibleRoles)) {
         const QString headerText = m_model->roleDescription(visibleRole);
         const qreal headerWidth = fontMetrics.horizontalAdvance(headerText) + gripMargin + headerMargin * 2;
         widths.insert(visibleRole, headerWidth);
@@ -2241,7 +2389,7 @@ QHash<QByteArray, qreal> KItemListView::preferredColumnWidths(const KItemRangeLi
         const int endIndex = startIndex + itemRange.count - 1;
 
         for (int i = startIndex; i <= endIndex; ++i) {
-            for (const QByteArray &visibleRole : qAsConst(m_visibleRoles)) {
+            for (const QByteArray &visibleRole : std::as_const(m_visibleRoles)) {
                 qreal maxWidth = widths.value(visibleRole, 0);
                 const qreal width = creator->preferredRoleColumnWidth(visibleRole, i, this);
                 maxWidth = qMax(width, maxWidth);
@@ -2268,7 +2416,7 @@ QHash<QByteArray, qreal> KItemListView::preferredColumnWidths(const KItemRangeLi
 void KItemListView::applyColumnWidthsFromHeader()
 {
     // Apply the new size to the layouter
-    const qreal requiredWidth = columnWidthsSum() + m_headerWidget->sidePadding();
+    const qreal requiredWidth = m_headerWidget->leftPadding() + columnWidthsSum() + m_headerWidget->rightPadding();
     const QSizeF dynamicItemSize(qMax(size().width(), requiredWidth), m_itemSize.height());
     m_layouter->setItemSize(dynamicItemSize);
 
@@ -2282,10 +2430,10 @@ void KItemListView::applyColumnWidthsFromHeader()
 
 void KItemListView::updateWidgetColumnWidths(KItemListWidget *widget)
 {
-    for (const QByteArray &role : qAsConst(m_visibleRoles)) {
+    for (const QByteArray &role : std::as_const(m_visibleRoles)) {
         widget->setColumnWidth(role, m_headerWidget->columnWidth(role));
     }
-    widget->setSidePadding(m_headerWidget->sidePadding());
+    widget->setSidePadding(m_headerWidget->leftPadding(), m_headerWidget->rightPadding());
 }
 
 void KItemListView::updatePreferredColumnWidths(const KItemRangeList &itemRanges)
@@ -2299,7 +2447,7 @@ void KItemListView::updatePreferredColumnWidths(const KItemRangeList &itemRanges
 
     if (itemCount == rangesItemCount) {
         const QHash<QByteArray, qreal> preferredWidths = preferredColumnWidths(itemRanges);
-        for (const QByteArray &role : qAsConst(m_visibleRoles)) {
+        for (const QByteArray &role : std::as_const(m_visibleRoles)) {
             m_headerWidget->setPreferredColumnWidth(role, preferredWidths.value(role));
         }
     } else {
@@ -2354,7 +2502,7 @@ void KItemListView::applyAutomaticColumnWidths()
     // size does not use the available view-size the size of the
     // first role will get stretched.
 
-    for (const QByteArray &role : qAsConst(m_visibleRoles)) {
+    for (const QByteArray &role : std::as_const(m_visibleRoles)) {
         const qreal preferredWidth = m_headerWidget->preferredColumnWidth(role);
         m_headerWidget->setColumnWidth(role, preferredWidth);
     }
@@ -2363,9 +2511,9 @@ void KItemListView::applyAutomaticColumnWidths()
     qreal firstColumnWidth = m_headerWidget->columnWidth(firstRole);
     QSizeF dynamicItemSize = m_itemSize;
 
-    qreal requiredWidth = columnWidthsSum() + m_headerWidget->sidePadding()
-        + m_headerWidget->sidePadding(); // Adding the padding a second time so we have the same padding symmetrically on both sides of the view.
-    // This improves UX, looks better and increases the chances of users figuring out that the padding area can be used for deselecting and dropping files.
+    qreal requiredWidth = m_headerWidget->leftPadding() + columnWidthsSum() + m_headerWidget->rightPadding();
+    // By default we want the same padding symmetrically on both sides of the view. This improves UX, looks better and increases the chances of users figuring
+    // out that the padding area can be used for deselecting and dropping files.
     const qreal availableWidth = size().width();
     if (requiredWidth < availableWidth) {
         // Stretch the first column to use the whole remaining width
@@ -2403,7 +2551,7 @@ void KItemListView::applyAutomaticColumnWidths()
 qreal KItemListView::columnWidthsSum() const
 {
     qreal widthsSum = 0;
-    for (const QByteArray &role : qAsConst(m_visibleRoles)) {
+    for (const QByteArray &role : std::as_const(m_visibleRoles)) {
         widthsSum += m_headerWidget->columnWidth(role);
     }
     return widthsSum;