diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -1548,16 +1548,16 @@ { disconnectRoleEditingSignals(index); - emit roleEditingCanceled(index, role, value); m_editingRole = false; + emit roleEditingCanceled(index, role, value); } void KItemListView::slotRoleEditingFinished(int index, const QByteArray& role, const QVariant& value) { disconnectRoleEditingSignals(index); - emit roleEditingFinished(index, role, value); m_editingRole = false; + emit roleEditingFinished(index, role, value); } void KItemListView::setController(KItemListController* controller) 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 @@ -24,12 +24,19 @@ #include +struct EditResult +{ + QString newName; + bool editNext; +}; +Q_DECLARE_METATYPE(EditResult) + /** * @brief Editor for renaming roles of a KItemListWidget. * * Provides signals when the editing got cancelled (e.g. by * pressing Escape or when losing the focus) or when the editing - * got finished (e.g. by pressing Enter or Return). + * got finished (e.g. by pressing Enter, Tab or Return). * * The size automatically gets increased if the text does not fit. */ @@ -66,7 +73,7 @@ * Emits the signal roleEditingFinished if m_blockFinishedSignal * is false. */ - void emitRoleEditingFinished(); + void emitRoleEditingFinished(bool editNext = false); private: QByteArray m_role; 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 @@ -91,6 +91,10 @@ emitRoleEditingFinished(); event->accept(); return; + case Qt::Key_Tab: + emitRoleEditingFinished(true); + event->accept(); + return; case Qt::Key_Left: case Qt::Key_Right: { QTextCursor cursor = textCursor(); @@ -139,10 +143,13 @@ } } -void KItemListRoleEditor::emitRoleEditingFinished() +void KItemListRoleEditor::emitRoleEditingFinished(bool editNext) { + QVariant ret; + ret.setValue(EditResult {KIO::encodeFileName(toPlainText()), editNext}); + if (!m_blockFinishedSignal) { - emit roleEditingFinished(m_role, KIO::encodeFileName(toPlainText())); + emit roleEditingFinished(m_role, ret); } } diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp --- a/src/views/dolphinview.cpp +++ b/src/views/dolphinview.cpp @@ -68,6 +68,7 @@ #include #include #include +#include DolphinView::DolphinView(const QUrl& url, QWidget* parent) : QWidget(parent), @@ -1572,7 +1573,8 @@ if (role == "text") { const KFileItem oldItem = m_model->fileItem(index); - const QString newName = value.toString(); + const EditResult retVal = value.value(); + const QString newName = retVal.newName; if (!newName.isEmpty() && newName != oldItem.text() && newName != QLatin1Char('.') && newName != QLatin1String("..")) { const QUrl oldUrl = oldItem.url(); @@ -1627,6 +1629,12 @@ connect(job, &KJob::result, this, &DolphinView::slotRenamingResult); } } + + if (retVal.editNext) { + m_container->controller()->selectionManager()->setSelected(index, 1, KItemListSelectionManager::Deselect); + m_container->controller()->selectionManager()->setSelected(index + 1, 1, KItemListSelectionManager::Select); + renameSelectedItems(); + } } }