From 478f404b8abf924a0e3e21bbf1dd49aefbe47672 Mon Sep 17 00:00:00 2001 From: Emirald Mateli Date: Sun, 17 Sep 2017 11:07:44 +0200 Subject: [PATCH] Keep renamed file(s) in view When renaming a file, if its new name causes it to scroll out of view, Dolphin will not scroll to the location of the new file. This patch aims to address that. This affects all view modes. CCBUG: 354330 Test Plan: 1. Have many files in a directory (or several files, just zoom in a lot) 2. Rename a file so that it will move out of view Differential Revision: https://phabricator.kde.org/D6312 --- src/views/dolphinview.cpp | 22 +++++++++++++++++++--- src/views/dolphinview.h | 9 +++++++++ src/views/renamedialog.cpp | 9 +++++++++ src/views/renamedialog.h | 4 ++++ 4 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp index 5fcec92412..2ca51f52dc 100644 --- a/src/views/dolphinview.cpp +++ b/src/views/dolphinview.cpp @@ -635,6 +635,9 @@ void DolphinView::renameSelectedItems() this, &DolphinView::slotRoleEditingFinished); } else { RenameDialog* dialog = new RenameDialog(this, items); + + connect(dialog, &RenameDialog::renamingFinished, this, &DolphinView::slotRenameDialogRenamingFinished); + dialog->setAttribute(Qt::WA_DeleteOnClose); dialog->show(); dialog->raise(); @@ -1308,9 +1311,7 @@ QUrl DolphinView::openItemAsFolderUrl(const KFileItem& item, const bool browseTh void DolphinView::observeCreatedItem(const QUrl& url) { if (m_active) { - clearSelection(); - markUrlAsCurrent(url); - markUrlsAsSelected({url}); + forceUrlsSelection(url, {url}); } } @@ -1541,6 +1542,8 @@ void DolphinView::slotRoleEditingFinished(int index, const QByteArray& role, con KIO::FileUndoManager::self()->recordJob(KIO::FileUndoManager::Rename, {oldUrl}, newUrl, job); job->uiDelegate()->setAutoErrorHandlingEnabled(true); + forceUrlsSelection(newUrl, {newUrl}); + if (!newNameExistsAlready) { // Only connect the result signal if there is no item with the new name // in the model yet, see bug 328262. @@ -1747,3 +1750,16 @@ QUrl DolphinView::viewPropertiesUrl() const url.setPath(m_viewPropertiesContext); return url; } + +void DolphinView::slotRenameDialogRenamingFinished(const QList& urls) +{ + forceUrlsSelection(urls.first(), urls); +} + +void DolphinView::forceUrlsSelection(const QUrl& current, const QList& selected) +{ + clearSelection(); + m_clearSelectionBeforeSelectingNewItems = true; + markUrlAsCurrent(current); + markUrlsAsSelected(selected); +} diff --git a/src/views/dolphinview.h b/src/views/dolphinview.h index 5c832efd1f..911103b5d7 100644 --- a/src/views/dolphinview.h +++ b/src/views/dolphinview.h @@ -576,6 +576,7 @@ private slots: void slotItemDropEvent(int index, QGraphicsSceneDragDropEvent* event); void slotModelChanged(KItemModelBase* current, KItemModelBase* previous); void slotMouseButtonPressed(int itemIndex, Qt::MouseButtons buttons); + void slotRenameDialogRenamingFinished(const QList& urls); /* * Is called when new items get pasted or dropped. @@ -760,6 +761,14 @@ private: */ QUrl viewPropertiesUrl() const; + /** + * Clears the selection and updates current item and selection according to the parameters + * + * @param current URL to be set as current + * @param selected list of selected items + */ + void forceUrlsSelection(const QUrl& current, const QList& selected); + private: void updatePalette(); diff --git a/src/views/renamedialog.cpp b/src/views/renamedialog.cpp index df4827b3a5..6309bfbdfe 100644 --- a/src/views/renamedialog.cpp +++ b/src/views/renamedialog.cpp @@ -162,6 +162,11 @@ void RenameDialog::renameItem(const KFileItem &item, const QString& newName) KIO::Job * job = KIO::moveAs(oldUrl, newUrl, KIO::HideProgressInfo); KJobWidgets::setWindow(job, widget); KIO::FileUndoManager::self()->recordJob(KIO::FileUndoManager::Rename, {oldUrl}, newUrl, job); + + if (!job->error()) { + m_renamedItems << newUrl; + } + job->uiDelegate()->setAutoErrorHandlingEnabled(true); } @@ -223,6 +228,10 @@ void RenameDialog::renameItems() renameItem(item, newName); } } + + if (!m_items.empty()) { + emit renamingFinished(m_renamedItems); + } } QString RenameDialog::indexedName(const QString& name, int index, const QChar& indexPlaceHolder) diff --git a/src/views/renamedialog.h b/src/views/renamedialog.h index 3964c0a5c4..7ead0ca9f8 100644 --- a/src/views/renamedialog.h +++ b/src/views/renamedialog.h @@ -41,6 +41,9 @@ public: explicit RenameDialog(QWidget* parent, const KFileItemList& items); virtual ~RenameDialog(); +signals: + void renamingFinished(const QList& urls); + private slots: void slotAccepted(); void slotTextChanged(const QString& newName); @@ -63,6 +66,7 @@ private: private: bool m_renameOneItem; + QList m_renamedItems; QString m_newName; QLineEdit* m_lineEdit; KFileItemList m_items;