From 15b34a0d05e62f2056120003423a33e79329b0c4 Mon Sep 17 00:00:00 2001 From: Frank Reininghaus Date: Mon, 10 Jun 2013 21:15:53 +0200 Subject: Do not rename files unexpectedly when changing the URL If the role editor loses focus, it considers the current renaming operation finished, and tells DolphinView to rename the file. This is a problem when changing the directory, because the URL change happens before DolphinView receives the signal, which results in a file in the new directory being renamed unexpectedly. The solution is to establish the connection to the slotRoleEditingFinished signal only when the "rename inline" editor is opened, and disconnect it when renaming is finished or canceled or the URL changes. BUG: 319912 FIXED-IN: 4.10.5 REVIEW: 110908 --- src/kitemviews/kstandarditemlistwidget.cpp | 35 ++++++++++++-------------- src/kitemviews/kstandarditemlistwidget.h | 4 +-- src/kitemviews/private/kitemlistroleeditor.cpp | 15 ++--------- src/kitemviews/private/kitemlistroleeditor.h | 8 ++---- 4 files changed, 22 insertions(+), 40 deletions(-) (limited to 'src') diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index f0394dfda..9a3f8f7bd 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -642,10 +642,10 @@ void KStandardItemListWidget::editedRoleChanged(const QByteArray& current, const if (m_roleEditor) { emit roleEditingCanceled(index(), current, data().value(current)); - disconnect(m_roleEditor, SIGNAL(roleEditingCanceled(int,QByteArray,QVariant)), - this, SLOT(slotRoleEditingCanceled(int,QByteArray,QVariant))); - disconnect(m_roleEditor, SIGNAL(roleEditingFinished(int,QByteArray,QVariant)), - this, SLOT(slotRoleEditingFinished(int,QByteArray,QVariant))); + disconnect(m_roleEditor, SIGNAL(roleEditingCanceled(QByteArray,QVariant)), + this, SLOT(slotRoleEditingCanceled(QByteArray,QVariant))); + disconnect(m_roleEditor, SIGNAL(roleEditingFinished(QByteArray,QVariant)), + this, SLOT(slotRoleEditingFinished(QByteArray,QVariant))); m_oldRoleEditor = m_roleEditor; m_roleEditor->hide(); m_roleEditor = 0; @@ -663,7 +663,6 @@ void KStandardItemListWidget::editedRoleChanged(const QByteArray& current, const const TextInfo* textInfo = m_textInfo.value("text"); m_roleEditor = new KItemListRoleEditor(parent); - m_roleEditor->setIndex(index()); m_roleEditor->setRole(current); m_roleEditor->setFont(styleOption().font); @@ -682,10 +681,10 @@ void KStandardItemListWidget::editedRoleChanged(const QByteArray& current, const m_roleEditor->setTextCursor(cursor); } - connect(m_roleEditor, SIGNAL(roleEditingCanceled(int,QByteArray,QVariant)), - this, SLOT(slotRoleEditingCanceled(int,QByteArray,QVariant))); - connect(m_roleEditor, SIGNAL(roleEditingFinished(int,QByteArray,QVariant)), - this, SLOT(slotRoleEditingFinished(int,QByteArray,QVariant))); + connect(m_roleEditor, SIGNAL(roleEditingCanceled(QByteArray,QVariant)), + this, SLOT(slotRoleEditingCanceled(QByteArray,QVariant))); + connect(m_roleEditor, SIGNAL(roleEditingFinished(QByteArray,QVariant)), + this, SLOT(slotRoleEditingFinished(QByteArray,QVariant))); // Adjust the geometry of the editor QRectF rect = roleEditingRect(current); @@ -746,21 +745,19 @@ void KStandardItemListWidget::slotCutItemsChanged() } } -void KStandardItemListWidget::slotRoleEditingCanceled(int index, - const QByteArray& role, +void KStandardItemListWidget::slotRoleEditingCanceled(const QByteArray& role, const QVariant& value) { closeRoleEditor(); - emit roleEditingCanceled(index, role, value); + emit roleEditingCanceled(index(), role, value); setEditedRole(QByteArray()); } -void KStandardItemListWidget::slotRoleEditingFinished(int index, - const QByteArray& role, +void KStandardItemListWidget::slotRoleEditingFinished(const QByteArray& role, const QVariant& value) { closeRoleEditor(); - emit roleEditingFinished(index, role, value); + emit roleEditingFinished(index(), role, value); setEditedRole(QByteArray()); } @@ -1307,10 +1304,10 @@ QRectF KStandardItemListWidget::roleEditingRect(const QByteArray& role) const void KStandardItemListWidget::closeRoleEditor() { - disconnect(m_roleEditor, SIGNAL(roleEditingCanceled(int,QByteArray,QVariant)), - this, SLOT(slotRoleEditingCanceled(int,QByteArray,QVariant))); - disconnect(m_roleEditor, SIGNAL(roleEditingFinished(int,QByteArray,QVariant)), - this, SLOT(slotRoleEditingFinished(int,QByteArray,QVariant))); + disconnect(m_roleEditor, SIGNAL(roleEditingCanceled(QByteArray,QVariant)), + this, SLOT(slotRoleEditingCanceled(QByteArray,QVariant))); + disconnect(m_roleEditor, SIGNAL(roleEditingFinished(QByteArray,QVariant)), + this, SLOT(slotRoleEditingFinished(QByteArray,QVariant))); if (m_roleEditor->hasFocus()) { // If the editing was not ended by a FocusOut event, we have diff --git a/src/kitemviews/kstandarditemlistwidget.h b/src/kitemviews/kstandarditemlistwidget.h index 386f60e4b..ecf3a3b60 100644 --- a/src/kitemviews/kstandarditemlistwidget.h +++ b/src/kitemviews/kstandarditemlistwidget.h @@ -160,8 +160,8 @@ protected: private slots: void slotCutItemsChanged(); - void slotRoleEditingCanceled(int index, const QByteArray& role, const QVariant& value); - void slotRoleEditingFinished(int index, const QByteArray& role, const QVariant& value); + void slotRoleEditingCanceled(const QByteArray& role, const QVariant& value); + void slotRoleEditingFinished(const QByteArray& role, const QVariant& value); private: void triggerCacheRefreshing(); diff --git a/src/kitemviews/private/kitemlistroleeditor.cpp b/src/kitemviews/private/kitemlistroleeditor.cpp index 9f3b53c05..9f20afea2 100644 --- a/src/kitemviews/private/kitemlistroleeditor.cpp +++ b/src/kitemviews/private/kitemlistroleeditor.cpp @@ -25,7 +25,6 @@ KItemListRoleEditor::KItemListRoleEditor(QWidget *parent) : KTextEdit(parent), - m_index(0), m_role(), m_blockFinishedSignal(false) { @@ -46,16 +45,6 @@ KItemListRoleEditor::~KItemListRoleEditor() { } -void KItemListRoleEditor::setIndex(int index) -{ - m_index = index; -} - -int KItemListRoleEditor::index() const -{ - return m_index; -} - void KItemListRoleEditor::setRole(const QByteArray& role) { m_role = role; @@ -95,7 +84,7 @@ void KItemListRoleEditor::keyPressEvent(QKeyEvent* event) // a roleEditingFinished signal (see KItemListRoleEditor::event), // which is not wanted in this case. m_blockFinishedSignal = true; - emit roleEditingCanceled(m_index, m_role, KIO::encodeFileName(toPlainText())); + emit roleEditingCanceled(m_role, KIO::encodeFileName(toPlainText())); m_blockFinishedSignal = false; event->accept(); return; @@ -139,7 +128,7 @@ void KItemListRoleEditor::autoAdjustSize() void KItemListRoleEditor::emitRoleEditingFinished() { if (!m_blockFinishedSignal) { - emit roleEditingFinished(m_index, m_role, KIO::encodeFileName(toPlainText())); + emit roleEditingFinished(m_role, KIO::encodeFileName(toPlainText())); } } diff --git a/src/kitemviews/private/kitemlistroleeditor.h b/src/kitemviews/private/kitemlistroleeditor.h index aa2c97754..7c2b61e2d 100644 --- a/src/kitemviews/private/kitemlistroleeditor.h +++ b/src/kitemviews/private/kitemlistroleeditor.h @@ -41,17 +41,14 @@ public: explicit KItemListRoleEditor(QWidget* parent); virtual ~KItemListRoleEditor(); - void setIndex(int index); - int index() const; - void setRole(const QByteArray& role); QByteArray role() const; virtual bool eventFilter(QObject* watched, QEvent* event); signals: - void roleEditingFinished(int index, const QByteArray& role, const QVariant& value); - void roleEditingCanceled(int index, const QByteArray& role, const QVariant& value); + void roleEditingFinished(const QByteArray& role, const QVariant& value); + void roleEditingCanceled(const QByteArray& role, const QVariant& value); protected: virtual bool event(QEvent* event); @@ -72,7 +69,6 @@ private: void emitRoleEditingFinished(); private: - int m_index; QByteArray m_role; bool m_blockFinishedSignal; }; -- cgit v1.3 From 9cf54dcc025073f29e6a1f55c83c4edcec6a5ea3 Mon Sep 17 00:00:00 2001 From: Frank Reininghaus Date: Sun, 9 Jun 2013 12:14:26 +0200 Subject: Do not rename files unexpectedly when changing the URL This is the real fix now - note that the last commit 4de9a233642a62ee96bac6031340d3eea21f14f9 was actually the fix for bug 320823. Somehow, I have messed up the local branches in my git respository clone - sorry for the confusion! BUG: 319912 FIXED-IN: 4.10.5 REVIEW: 110908 --- src/views/dolphinview.cpp | 19 +++++++++++++++++-- src/views/dolphinview.h | 1 + 2 files changed, 18 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp index 502ffd428..d69d664af 100644 --- a/src/views/dolphinview.cpp +++ b/src/views/dolphinview.cpp @@ -174,8 +174,8 @@ DolphinView::DolphinView(const KUrl& url, QWidget* parent) : this, SLOT(slotSortRoleChangedByHeader(QByteArray,QByteArray))); connect(m_view, SIGNAL(visibleRolesChanged(QList,QList)), this, SLOT(slotVisibleRolesChangedByHeader(QList,QList))); - connect(m_view, SIGNAL(roleEditingFinished(int,QByteArray,QVariant)), - this, SLOT(slotRoleEditingFinished(int,QByteArray,QVariant))); + connect(m_view, SIGNAL(roleEditingCanceled(int,QByteArray,QVariant)), + this, SLOT(slotRoleEditingCanceled(int,QByteArray,QVariant))); connect(m_view->header(), SIGNAL(columnWidthChanged(QByteArray,qreal,qreal)), this, SLOT(slotHeaderColumnWidthChanged(QByteArray,qreal,qreal))); @@ -609,6 +609,9 @@ void DolphinView::setUrl(const KUrl& url) hideToolTip(); + disconnect(m_view, SIGNAL(roleEditingFinished(int,QByteArray,QVariant)), + this, SLOT(slotRoleEditingFinished(int,QByteArray,QVariant))); + // It is important to clear the items from the model before // applying the view properties, otherwise expensive operations // might be done on the existing items although they get cleared @@ -648,6 +651,9 @@ void DolphinView::renameSelectedItems() if (items.count() == 1 && GeneralSettings::renameInline()) { const int index = m_model->index(items.first()); m_view->editRole(index, "text"); + + connect(m_view, SIGNAL(roleEditingFinished(int,QByteArray,QVariant)), + this, SLOT(slotRoleEditingFinished(int,QByteArray,QVariant))); } else { RenameDialog* dialog = new RenameDialog(this, items); dialog->setAttribute(Qt::WA_DeleteOnClose); @@ -1366,8 +1372,17 @@ void DolphinView::slotVisibleRolesChangedByHeader(const QList& curre emit visibleRolesChanged(m_visibleRoles, previousVisibleRoles); } +void DolphinView::slotRoleEditingCanceled(int index, const QByteArray& role, const QVariant& value) +{ + disconnect(m_view, SIGNAL(roleEditingFinished(int,QByteArray,QVariant)), + this, SLOT(slotRoleEditingFinished(int,QByteArray,QVariant))); +} + void DolphinView::slotRoleEditingFinished(int index, const QByteArray& role, const QVariant& value) { + disconnect(m_view, SIGNAL(roleEditingFinished(int,QByteArray,QVariant)), + this, SLOT(slotRoleEditingFinished(int,QByteArray,QVariant))); + if (index < 0 || index >= m_model->count()) { return; } diff --git a/src/views/dolphinview.h b/src/views/dolphinview.h index a2fe9f62a..62b5df7c7 100644 --- a/src/views/dolphinview.h +++ b/src/views/dolphinview.h @@ -655,6 +655,7 @@ private slots: void slotVisibleRolesChangedByHeader(const QList& current, const QList& previous); + void slotRoleEditingCanceled(int index, const QByteArray& role, const QVariant& value); void slotRoleEditingFinished(int index, const QByteArray& role, const QVariant& value); /** -- cgit v1.3