diff options
| author | Frank Reininghaus <[email protected]> | 2012-12-07 22:15:32 +0100 |
|---|---|---|
| committer | Frank Reininghaus <[email protected]> | 2012-12-07 22:15:32 +0100 |
| commit | e97c050157890dd1adf14d98bbed4aa86af98354 (patch) | |
| tree | 9cc9009b03c99c82ab8bf4b82b9345815983c691 /src/kitemviews/kstandarditemlistwidget.cpp | |
| parent | a1353a9d48bc8a45516f7d9323c5a9f99194b310 (diff) | |
Fix keyboard focus handling after renaming items inline
This reverts 951cb9c35d7a9ef814b3de5b359915968da9b881 and
3143acc084d54d43df469b54762bfa10a7050a9f, and fixes the crash caused by
nested event loops by delaying the deletion of the KItemListRoleEditor
until the next item is renamed inline.
BUG: 311206
FIXED-IN: 4.9.5
REVIEW: 107606
Diffstat (limited to 'src/kitemviews/kstandarditemlistwidget.cpp')
| -rw-r--r-- | src/kitemviews/kstandarditemlistwidget.cpp | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp index f92cab50f..af1695465 100644 --- a/src/kitemviews/kstandarditemlistwidget.cpp +++ b/src/kitemviews/kstandarditemlistwidget.cpp @@ -193,7 +193,8 @@ KStandardItemListWidget::KStandardItemListWidget(KItemListWidgetInformant* infor m_additionalInfoTextColor(), m_overlay(), m_rating(), - m_roleEditor(0) + m_roleEditor(0), + m_oldRoleEditor(0) { } @@ -203,6 +204,7 @@ KStandardItemListWidget::~KStandardItemListWidget() m_textInfo.clear(); delete m_roleEditor; + delete m_oldRoleEditor; } void KStandardItemListWidget::setLayout(Layout layout) @@ -609,13 +611,16 @@ void KStandardItemListWidget::editedRoleChanged(const QByteArray& current, const this, SLOT(slotRoleEditingCanceled(int,QByteArray,QVariant))); disconnect(m_roleEditor, SIGNAL(roleEditingFinished(int,QByteArray,QVariant)), this, SLOT(slotRoleEditingFinished(int,QByteArray,QVariant))); - // Do not delete the role editor using deleteLater() because we might be - // inside a nested event loop which has been started by one of its event - // handlers (contextMenuEvent() or drag&drop inside mouseMoveEvent()). - m_roleEditor->deleteWhenIdle(); + m_oldRoleEditor = m_roleEditor; + m_roleEditor->hide(); m_roleEditor = 0; } return; + } else if (m_oldRoleEditor) { + // Delete the old editor before constructing the new one to + // prevent a memory leak. + m_oldRoleEditor->deleteLater(); + m_oldRoleEditor = 0; } Q_ASSERT(!m_roleEditor); @@ -1267,21 +1272,19 @@ 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))); + if (m_roleEditor->hasFocus()) { // If the editing was not ended by a FocusOut event, we have // to transfer the keyboard focus back to the KItemListContainer. scene()->views()[0]->parentWidget()->setFocus(); } - 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))); - - // Do not delete the role editor using deleteLater() because we might be - // inside a nested event loop which has been started by one of its event - // handlers (contextMenuEvent() or drag&drop inside mouseMoveEvent()). - m_roleEditor->deleteWhenIdle(); + m_oldRoleEditor = m_roleEditor; + m_roleEditor->hide(); m_roleEditor = 0; } |
