┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/kitemviews
diff options
context:
space:
mode:
authorMéven Car <[email protected]>2026-03-18 12:49:50 +0100
committerMéven Car <[email protected]>2026-03-19 09:23:37 +0000
commit01bfa0e868a0696b8382deb4dd3c0ef12b584835 (patch)
tree4a8ebcedf53c445316b142c8a8786fb1696e03f0 /src/kitemviews
parent2d7b8530e2cbf30d2ff7ee8a3ff66dd4aa6a632d (diff)
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.
Diffstat (limited to 'src/kitemviews')
-rw-r--r--src/kitemviews/kitemlistview.cpp16
-rw-r--r--src/kitemviews/kitemlistview.h1
-rw-r--r--src/kitemviews/kstandarditemlistwidget.cpp7
-rw-r--r--src/kitemviews/kstandarditemlistwidget.h1
4 files changed, 19 insertions, 6 deletions
diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp
index b780e3ff4..e828b6967 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 415710e02..c8ab796a9 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 494473c62..9195f4e77 100644
--- a/src/kitemviews/kstandarditemlistwidget.cpp
+++ b/src/kitemviews/kstandarditemlistwidget.cpp
@@ -964,6 +964,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 9e6fff935..992d41aa1 100644
--- a/src/kitemviews/kstandarditemlistwidget.h
+++ b/src/kitemviews/kstandarditemlistwidget.h
@@ -196,6 +196,7 @@ protected:
public Q_SLOTS:
void finishRoleEditing();
+ void cancelRoleEditing();
private Q_SLOTS:
void slotCutItemsChanged();