summaryrefslogtreecommitdiff
path: root/src/designer
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@nokia.com>2012-06-27 14:43:05 +0200
committerQt by Nokia <qt-info@nokia.com>2012-07-03 09:23:06 +0200
commitfad1730d19b573661b6527146fe13661e5ae1f72 (patch)
treec39523e1f817d746237a516be7f9ecc6c370ce7d /src/designer
parent26b79c6115cb9cfc8ed03e5f94c39b36bb02d873 (diff)
downloadqttools-fad1730d19b573661b6527146fe13661e5ae1f72.tar.gz
Designer: Fix crash when switching from docked to multiple windows.
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>
Diffstat (limited to 'src/designer')
-rw-r--r--src/designer/src/designer/qdesigner_actions.cpp7
-rw-r--r--src/designer/src/designer/qdesigner_appearanceoptions.cpp2
-rw-r--r--src/designer/src/designer/qdesigner_appearanceoptions.h8
-rw-r--r--src/designer/src/designer/qdesigner_workbench.cpp24
-rw-r--r--src/designer/src/designer/qdesigner_workbench.h3
5 files changed, 33 insertions, 11 deletions
diff --git a/src/designer/src/designer/qdesigner_actions.cpp b/src/designer/src/designer/qdesigner_actions.cpp
index 0b020453b..87039d5e9 100644
--- a/src/designer/src/designer/qdesigner_actions.cpp
+++ b/src/designer/src/designer/qdesigner_actions.cpp
@@ -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()
diff --git a/src/designer/src/designer/qdesigner_appearanceoptions.cpp b/src/designer/src/designer/qdesigner_appearanceoptions.cpp
index 58bda38de..40c9c0923 100644
--- a/src/designer/src/designer/qdesigner_appearanceoptions.cpp
+++ b/src/designer/src/designer/qdesigner_appearanceoptions.cpp
@@ -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();
}
}
}
diff --git a/src/designer/src/designer/qdesigner_appearanceoptions.h b/src/designer/src/designer/qdesigner_appearanceoptions.h
index af85c16d9..ac2ccd951 100644
--- a/src/designer/src/designer/qdesigner_appearanceoptions.h
+++ b/src/designer/src/designer/qdesigner_appearanceoptions.h
@@ -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;
diff --git a/src/designer/src/designer/qdesigner_workbench.cpp b/src/designer/src/designer/qdesigner_workbench.cpp
index cbb1e83e8..5202a8006 100644
--- a/src/designer/src/designer/qdesigner_workbench.cpp
+++ b/src/designer/src/designer/qdesigner_workbench.cpp
@@ -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();
diff --git a/src/designer/src/designer/qdesigner_workbench.h b/src/designer/src/designer/qdesigner_workbench.h
index 7f41180da..cd5581d49 100644
--- a/src/designer/src/designer/qdesigner_workbench.h
+++ b/src/designer/src/designer/qdesigner_workbench.h
@@ -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