[system/dolphin/release/26.04] src/kitemviews: kitemlistview: cancel editing when animation starts

Méven Car <[email protected]>
Newsgroups gmane.comp.kde.cvs
Message-ID <[email protected]>
Git commit 1271cf94749996f2bf887ad85fa1844debe2b484 by Méven Car.
Committed on 18/07/2026 at 09:35.
Pushed by meven into branch 'release/26.04'.

kitemlistview: cancel editing when animation starts

For this widget.

If a file is being moved due due to external events, an animation may
start, in which case we better cancel the edit.

If we hook this at the animation start instead of checks spread out, we
can't miss this cancellation anymore.

KStandardItemListWidget gets a cancelRoleEditing slot to cleanly cancel
editing and clean up its internal state.


(cherry picked from commit 01bfa0e868a0696b8382deb4dd3c0ef12b584835)

Co-authored-by: Méven Car <[email protected]>

M  +10   -6    src/kitemviews/kitemlistview.cpp
M  +1    -0    src/kitemviews/kitemlistview.h
M  +7    -0    src/kitemviews/kstandarditemlistwidget.cpp
M  +1    -0    src/kitemviews/kstandarditemlistwidget.h

https://invent.kde.org/system/dolphin/-/commit/1271cf94749996f2bf887ad85fa1844debe2b484

diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp
index b780e3ff4d..e828b69678 100644
--- a/src/kitemviews/kitemlistview.cpp
+++ b/src/kitemviews/kitemlistview.cpp
@@ -117,6 +117,7 @@ KItemListView::KItemListView(QGraphicsWidget *parent)
 
     m_animation = new KItemListViewAnimation(this);
     connect(m_animation, &KItemListViewAnimation::finished, this, &KItemListView::slotAnimationFinished);
+    connect(m_animation, &KItemListViewAnimation::start, this, &KItemListView::slotAnimationStarted);
 
     m_rubberBand = new KItemListRubberBand(this);
     connect(m_rubberBand, &KItemListRubberBand::activationChanged, this, &KItemListView::slotRubberBandActivationChanged);
@@ -758,8 +759,7 @@ void KItemListView::editRole(int index, const QByteArray &role)
     if (!widget) {
         return;
     }
-    if (m_editingRole || m_animation->isStarted(widget)) {
-        Q_EMIT widget->roleEditingCanceled(index, role, QVariant());
+    if (widget->editedRole() == role) {
         return;
     }
 
@@ -1577,6 +1577,13 @@ void KItemListView::slotSelectionChanged(const KItemSet &current, const KItemSet
 #endif
 }
 
+void KItemListView::slotAnimationStarted(QGraphicsWidget *widget, KItemListViewAnimation::AnimationType /* type */, const QVariant & /* endValue */)
+{
+    KStandardItemListWidget *listWidget = qobject_cast<KStandardItemListWidget *>(widget);
+    Q_ASSERT(widget);
+    listWidget->cancelRoleEditing();
+}
+
 void KItemListView::slotAnimationFinished(QGraphicsWidget *widget, KItemListViewAnimation::AnimationType type)
 {
     KItemListWidget *itemListWidget = qobject_cast<KItemListWidget *>(widget);
@@ -1926,9 +1933,6 @@ 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;
             }
@@ -2804,7 +2808,7 @@ bool KItemListView::hasSiblingSuccessor(int index) const
 
 void KItemListView::disconnectRoleEditingSignals(int index)
 {
-    KStandardItemListWidget *widget = qobject_cast<KStandardItemListWidget *>(m_visibleItems.value(index));
+    KItemListWidget *widget = m_visibleItems.value(index);
     if (!widget) {
         return;
     }
diff --git a/src/kitemviews/kitemlistview.h b/src/kitemviews/kitemlistview.h
index 415710e024..c8ab796a99 100644
--- a/src/kitemviews/kitemlistview.h
+++ b/src/kitemviews/kitemlistview.h
@@ -446,6 +446,7 @@ protected Q_SLOTS:
 
 private Q_SLOTS:
     void slotAnimationFinished(QGraphicsWidget *widget, KItemListViewAnimation::AnimationType type);
+    void slotAnimationStarted(QGraphicsWidget *widget, KItemListViewAnimation::AnimationType type, const QVariant &endValue);
 
     void slotRubberBandPosChanged();
     void slotRubberBandActivationChanged(bool active);
diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp
index 97803e357d..a3301cf128 100644
--- a/src/kitemviews/kstandarditemlistwidget.cpp
+++ b/src/kitemviews/kstandarditemlistwidget.cpp
@@ -971,6 +971,13 @@ void KStandardItemListWidget::finishRoleEditing()
     }
 }
 
+void KStandardItemListWidget::cancelRoleEditing()
+{
+    if (!editedRole().isEmpty() && m_roleEditor) {
+        slotRoleEditingCanceled(editedRole(), KIO::encodeFileName(m_roleEditor->toPlainText()));
+    }
+}
+
 void KStandardItemListWidget::slotCutItemsChanged()
 {
     const QUrl itemUrl = data().value("url").toUrl();
diff --git a/src/kitemviews/kstandarditemlistwidget.h b/src/kitemviews/kstandarditemlistwidget.h
index 9dd46b1ea8..34e34e1ce7 100644
--- a/src/kitemviews/kstandarditemlistwidget.h
+++ b/src/kitemviews/kstandarditemlistwidget.h
@@ -197,6 +197,7 @@ protected:
 
 public Q_SLOTS:
     void finishRoleEditing();
+    void cancelRoleEditing();
 
 private Q_SLOTS:
     void slotCutItemsChanged();
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.