From 34b84d8c069e402f338b3bec264d98b040da63c6 Mon Sep 17 00:00:00 2001
From: Kai Koehne <kai.koehne@nokia.com>
Date: Tue, 6 Apr 2010 10:49:16 +0200
Subject: [PATCH] QmlDesigner: Fix crash on loadup

Make DesignModeWidget::showEditor reentrant save by explicitly checking
the current status.

The crash happens only reproducably when debugging creator inside
creator (gdb-7.0-ubuntu!).

Reviewed-by: Lasse Holmstedt
---
 src/plugins/qmldesigner/designmodewidget.cpp | 21 +++++++++++++-------
 src/plugins/qmldesigner/designmodewidget.h   |  5 ++++-
 2 files changed, 18 insertions(+), 8 deletions(-)

diff --git a/src/plugins/qmldesigner/designmodewidget.cpp b/src/plugins/qmldesigner/designmodewidget.cpp
index 23572260ccc..aac8c2cb0d9 100644
--- a/src/plugins/qmldesigner/designmodewidget.cpp
+++ b/src/plugins/qmldesigner/designmodewidget.cpp
@@ -123,7 +123,7 @@ DesignModeWidget::DesignModeWidget(QWidget *parent) :
     m_mainSplitter(0),
     m_leftSideBar(0),
     m_rightSideBar(0),
-    m_setup(false),
+    m_initStatus(NotInitialized),
     m_warningWidget(0)
 {
     m_undoAction = new QAction(tr("&Undo"), this);
@@ -148,8 +148,17 @@ DesignModeWidget::~DesignModeWidget()
 
 void DesignModeWidget::showEditor(Core::IEditor *editor)
 {
-    show();
-    setup();
+    //
+    // Prevent recursive calls to function by explicitly managing initialization status
+    // (QApplication::processEvents is called explicitly at a number of places)
+    //
+    if (m_initStatus == Initializing)
+        return;
+
+    if (m_initStatus == NotInitialized) {
+        m_initStatus = Initializing;
+        setup();
+    }
 
     QString fileName;
     QPlainTextEdit *textEdit = 0;
@@ -193,6 +202,8 @@ void DesignModeWidget::showEditor(Core::IEditor *editor)
         }
     }
     setCurrentDocument(document);
+
+    m_initStatus = Initialized;
 }
 
 void DesignModeWidget::closeEditors(QList<Core::IEditor*> editors)
@@ -477,10 +488,6 @@ void DesignModeWidget::setCurrentDocument(DesignDocumentController *newDesignDoc
 
 void DesignModeWidget::setup()
 {
-    if (m_setup)
-        return;
-    m_setup = true;
-
     QList<Core::INavigationWidgetFactory *> factories = ExtensionSystem::PluginManager::instance()->getObjects<Core::INavigationWidgetFactory>();
 
     QWidget *openDocumentsWidget = 0;
diff --git a/src/plugins/qmldesigner/designmodewidget.h b/src/plugins/qmldesigner/designmodewidget.h
index 934ec7b08ea..54bfeccdc71 100644
--- a/src/plugins/qmldesigner/designmodewidget.h
+++ b/src/plugins/qmldesigner/designmodewidget.h
@@ -179,7 +179,10 @@ private:
     Core::EditorToolBar *m_fakeToolBar;
 
     bool m_isDisabled;
-    bool m_setup;
+
+    enum InitializeStatus { NotInitialized, Initializing, Initialized };
+    InitializeStatus m_initStatus;
+
     DocumentWarningWidget *m_warningWidget;
 };
 
-- 
GitLab