Designer: Fix crash when switching from docked to multiple windows.
authorFriedemann Kleint <Friedemann.Kleint@nokia.com>
Wed, 27 Jun 2012 12:43:05 +0000 (14:43 +0200)
committerQt by Nokia <qt-info@nokia.com>
Tue, 3 Jul 2012 07:23:06 +0000 (09:23 +0200)
Make sure the preference dialog is destroyed before changing the
UI mode by introducing a flag that is set on UI mode changes,
triggering the update afterwards.

Change-Id: I9c488ba6b1b24faccb0a1606994aaf0474b56fc2
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com>
Reviewed-by: Jarek Kobus <jaroslaw.kobus@nokia.com>
src/designer/src/designer/qdesigner_actions.cpp
src/designer/src/designer/qdesigner_appearanceoptions.cpp
src/designer/src/designer/qdesigner_appearanceoptions.h
src/designer/src/designer/qdesigner_workbench.cpp
src/designer/src/designer/qdesigner_workbench.h

index 0b02045..87039d5 100644 (file)
@@ -1294,8 +1294,11 @@ bool QDesignerActions::ensureBackupDirectories() {
 
 void QDesignerActions::showPreferencesDialog()
 {
-    PreferencesDialog preferencesDialog(workbench()->core(), m_core->topLevel());
-    preferencesDialog.exec();
+    {
+        PreferencesDialog preferencesDialog(workbench()->core(), m_core->topLevel());
+        preferencesDialog.exec();
+    }   // Make sure the preference dialog is destroyed before switching UI modes.
+    m_workbench->applyUiSettings();
 }
 
 void QDesignerActions::showAppFontDialog()
index 58bda38..40c9c09 100644 (file)
@@ -153,8 +153,8 @@ void QDesignerAppearanceOptionsPage::apply()
         if (newOptions != m_initialOptions) {
             QDesignerSettings settings(m_core);
             newOptions.toSettings(settings);
-            QTimer::singleShot(0, this, SIGNAL(settingsChangedDelayed()));
             m_initialOptions = newOptions;
+            emit settingsChanged();
         }
     }
 }
index af85c16..ac2ccd9 100644 (file)
@@ -105,11 +105,7 @@ private:
     UIMode m_initialUIMode;
 };
 
-/* The options page for appearance options. Emits a Timer-0 delayed changed
- * signal to allow the preferences dialog to close (and be deleted) before a
- * possible switch from docked mode to top-level mode happens. (The switch
- * would delete the main window, which the preference dialog is a child of
- * -> BOOM) */
+/* The options page for appearance options. */
 
 class QDesignerAppearanceOptionsPage : public QObject, public QDesignerOptionsPageInterface
 {
@@ -124,7 +120,7 @@ public:
     virtual void finish();
 
 signals:
-    void settingsChangedDelayed();
+    void settingsChanged();
 
 private:
     QDesignerFormEditorInterface *m_core;
index cbb1e83..5202a80 100644 (file)
@@ -182,7 +182,8 @@ QDesignerWorkbench::QDesignerWorkbench()  :
     m_globalMenuBar(new QMenuBar),
     m_mode(NeutralMode),
     m_dockedMainWindow(0),
-    m_state(StateInitializing)
+    m_state(StateInitializing),
+    m_uiSettingsChanged(false)
 {
     QDesignerSettings settings(m_core);
 
@@ -246,7 +247,7 @@ QDesignerWorkbench::QDesignerWorkbench()  :
 
     { // Add application specific options pages
         QDesignerAppearanceOptionsPage *appearanceOptions = new QDesignerAppearanceOptionsPage(m_core);
-        connect(appearanceOptions, SIGNAL(settingsChangedDelayed()), this, SLOT(restoreUISettings()));
+        connect(appearanceOptions, SIGNAL(settingsChanged()), this, SLOT(notifyUISettingsChanged()));
         QList<QDesignerOptionsPageInterface*> optionsPages = m_core->optionsPages();
         optionsPages.push_front(appearanceOptions);
         m_core->setOptionsPages(optionsPages);
@@ -1061,6 +1062,25 @@ void QDesignerWorkbench::setFormWindowMinimized(QDesignerFormWindow *fw, bool mi
     }
 }
 
+/* Applies UI mode changes using Timer-0 delayed signal
+ * signal to make sure the preferences dialog is closed and destroyed
+ * before a possible switch from docked mode to top-level mode happens.
+ * (The switch deletes the main window, which the preference dialog is
+ * a child of -> BOOM) */
+
+void QDesignerWorkbench::applyUiSettings()
+{
+    if (m_uiSettingsChanged) {
+        m_uiSettingsChanged = false;
+        QTimer::singleShot(0, this, SLOT(restoreUISettings()));
+    }
+}
+
+void QDesignerWorkbench::notifyUISettingsChanged()
+{
+    m_uiSettingsChanged = true;
+}
+
 void QDesignerWorkbench::restoreUISettings()
 {
     UIMode mode = QDesignerSettings(m_core).uiMode();
index 7f41180..cd5581d 100644 (file)
@@ -116,6 +116,7 @@ public:
     bool handleClose();
     bool readInBackup();
     void updateBackup(QDesignerFormWindowInterface* fwi);
+    void applyUiSettings();
 
 signals:
     void modeChanged(UIMode mode);
@@ -140,6 +141,7 @@ private slots:
     void minimizationStateChanged(QDesignerFormWindowInterface *formWindow, bool minimized);
 
     void restoreUISettings();
+    void notifyUISettingsChanged();
     void slotFileDropped(const QString &f);
 
 private:
@@ -205,6 +207,7 @@ private:
 
     enum State { StateInitializing, StateUp, StateClosing };
     State m_state;
+    bool m_uiSettingsChanged; // UI mode changed in preference dialog, trigger delayed slot.
 };
 
 QT_END_NAMESPACE