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