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