diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -27,7 +27,7 @@ #include "kitemlistcontroller.h" #include "kitemlistheader.h" #include "kitemlistselectionmanager.h" -#include "kitemlistwidget.h" +#include "kstandarditemlistwidget.h" #include "private/kitemlistheaderwidget.h" #include "private/kitemlistrubberband.h" @@ -642,7 +642,7 @@ void KItemListView::editRole(int index, const QByteArray& role) { - KItemListWidget* widget = m_visibleItems.value(index); + KStandardItemListWidget* widget = qobject_cast(m_visibleItems.value(index)); if (!widget || m_editingRole) { return; } @@ -654,6 +654,9 @@ this, &KItemListView::slotRoleEditingCanceled); connect(widget, &KItemListWidget::roleEditingFinished, this, &KItemListView::slotRoleEditingFinished); + + connect(this, &KItemListView::scrollOffsetChanged, + widget, &KStandardItemListWidget::forceRoleEditingFinished); } void KItemListView::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) @@ -2639,13 +2642,14 @@ void KItemListView::disconnectRoleEditingSignals(int index) { - KItemListWidget* widget = m_visibleItems.value(index); + KStandardItemListWidget* widget = qobject_cast(m_visibleItems.value(index)); if (!widget) { return; } disconnect(widget, &KItemListWidget::roleEditingCanceled, this, nullptr); disconnect(widget, &KItemListWidget::roleEditingFinished, this, nullptr); + disconnect(this, &KItemListView::scrollOffsetChanged, widget, nullptr); } int KItemListView::calculateAutoScrollingIncrement(int pos, int range, int oldInc) diff --git a/src/kitemviews/kstandarditemlistwidget.h b/src/kitemviews/kstandarditemlistwidget.h --- a/src/kitemviews/kstandarditemlistwidget.h +++ b/src/kitemviews/kstandarditemlistwidget.h @@ -185,6 +185,9 @@ virtual void hideEvent(QHideEvent* event) Q_DECL_OVERRIDE; bool event(QEvent *event) Q_DECL_OVERRIDE; +public slots: + void forceRoleEditingFinished(); + private slots: void slotCutItemsChanged(); void slotRoleEditingCanceled(const QByteArray& role, const QVariant& value); diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -860,6 +860,13 @@ return KItemListWidget::event(event); } +void KStandardItemListWidget::forceRoleEditingFinished() +{ + if (!editedRole().isEmpty() && m_roleEditor) { + slotRoleEditingFinished(editedRole(), m_roleEditor->encodedFileName()); + } +} + void KStandardItemListWidget::slotCutItemsChanged() { const QUrl itemUrl = data().value("url").toUrl(); diff --git a/src/kitemviews/private/kitemlistroleeditor.h b/src/kitemviews/private/kitemlistroleeditor.h --- a/src/kitemviews/private/kitemlistroleeditor.h +++ b/src/kitemviews/private/kitemlistroleeditor.h @@ -44,6 +44,8 @@ void setRole(const QByteArray& role); QByteArray role() const; + QString encodedFileName() const; + bool eventFilter(QObject* watched, QEvent* event) Q_DECL_OVERRIDE; signals: diff --git a/src/kitemviews/private/kitemlistroleeditor.cpp b/src/kitemviews/private/kitemlistroleeditor.cpp --- a/src/kitemviews/private/kitemlistroleeditor.cpp +++ b/src/kitemviews/private/kitemlistroleeditor.cpp @@ -54,6 +54,11 @@ return m_role; } +QString KItemListRoleEditor::encodedFileName() const +{ + return KIO::encodeFileName(toPlainText()); +} + bool KItemListRoleEditor::eventFilter(QObject* watched, QEvent* event) { if (watched == parentWidget() && event->type() == QEvent::Resize) { @@ -83,7 +88,7 @@ // a roleEditingFinished signal (see KItemListRoleEditor::event), // which is not wanted in this case. m_blockFinishedSignal = true; - emit roleEditingCanceled(m_role, KIO::encodeFileName(toPlainText())); + emit roleEditingCanceled(m_role, encodedFileName()); m_blockFinishedSignal = false; event->accept(); return; @@ -143,7 +148,7 @@ void KItemListRoleEditor::emitRoleEditingFinished() { if (!m_blockFinishedSignal) { - emit roleEditingFinished(m_role, KIO::encodeFileName(toPlainText())); + emit roleEditingFinished(m_role, encodedFileName()); } }