From c960be456d0b9ce15063e646431c6072acafbe67 Mon Sep 17 00:00:00 2001 From: dt_ <qtc-committer@nokia.com> Date: Thu, 19 May 2011 14:08:41 +0200 Subject: [PATCH] Make SettingsDialog robust against multiple accept()/rejects() That can happen if the user clicks very fast due to the multiple levels of event loops. Task-Nr: QTCREATORBUG-4818 Change-Id: I9c00dbf957a587c6e5839afebdd71e84b8c4a3c8 Reviewed-on: http://codereview.qt.nokia.com/16 Reviewed-by: Daniel Teske <daniel.teske@nokia.com> --- src/plugins/coreplugin/dialogs/settingsdialog.cpp | 10 +++++++++- src/plugins/coreplugin/dialogs/settingsdialog.h | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/plugins/coreplugin/dialogs/settingsdialog.cpp b/src/plugins/coreplugin/dialogs/settingsdialog.cpp index 114ce63e49d..fcf8fb2b737 100644 --- a/src/plugins/coreplugin/dialogs/settingsdialog.cpp +++ b/src/plugins/coreplugin/dialogs/settingsdialog.cpp @@ -290,7 +290,8 @@ SettingsDialog::SettingsDialog(QWidget *parent) : m_categoryList(new CategoryListView), m_headerLabel(new QLabel), m_running(false), - m_applied(false) + m_applied(false), + m_finished(false) { m_applied = false; @@ -507,6 +508,9 @@ void SettingsDialog::filter(const QString &text) void SettingsDialog::accept() { + if (m_finished) + return; + m_finished = true; disconnectTabWidgets(); m_applied = true; foreach (IOptionsPage *page, m_visitedPages) @@ -518,6 +522,9 @@ void SettingsDialog::accept() void SettingsDialog::reject() { + if (m_finished) + return; + m_finished = true; disconnectTabWidgets(); foreach (IOptionsPage *page, m_pages) page->finish(); @@ -571,6 +578,7 @@ bool SettingsDialog::execDialog() { if (!m_running) { m_running = true; + m_finished = false; exec(); m_running = false; m_instance = 0; diff --git a/src/plugins/coreplugin/dialogs/settingsdialog.h b/src/plugins/coreplugin/dialogs/settingsdialog.h index 416961984cf..63db6b65394 100644 --- a/src/plugins/coreplugin/dialogs/settingsdialog.h +++ b/src/plugins/coreplugin/dialogs/settingsdialog.h @@ -113,6 +113,7 @@ private: QLabel *m_headerLabel; bool m_running; bool m_applied; + bool m_finished; QList<QEventLoop *> m_eventLoops; static QPointer<SettingsDialog> m_instance; }; -- GitLab