diff --git a/src/libs/utils/fancymainwindow.cpp b/src/libs/utils/fancymainwindow.cpp index a06c060dd16..482c8ab5da1 100644 --- a/src/libs/utils/fancymainwindow.cpp +++ b/src/libs/utils/fancymainwindow.cpp @@ -590,11 +590,13 @@ Store FancyMainWindow::saveSettings() const return settings; } -void FancyMainWindow::restoreSettings(const Store &settings) +bool FancyMainWindow::restoreSettings(const Store &settings) { + bool success = true; QByteArray ba = settings.value(StateKey, QByteArray()).toByteArray(); if (!ba.isEmpty()) { - if (!restoreFancyState(ba, settingsVersion)) + success = restoreFancyState(ba, settingsVersion); + if (!success) qWarning() << "Restoring the state of dock widgets failed."; } d->m_showCentralWidget.setChecked(settings.value(ShowCentralWidgetKey, true).toBool()); @@ -603,6 +605,8 @@ void FancyMainWindow::restoreSettings(const Store &settings) settings.value(keyFromString(widget->objectName()), false)); } d->restoreHiddenDockAreasFromHash(settings.value(HiddenDockAreasKey).toHash()); + emit dockWidgetsChanged(); + return success; } bool FancyMainWindow::restoreFancyState(const QByteArray &state, int version) diff --git a/src/libs/utils/fancymainwindow.h b/src/libs/utils/fancymainwindow.h index 8967affb749..1c9fc6a38de 100644 --- a/src/libs/utils/fancymainwindow.h +++ b/src/libs/utils/fancymainwindow.h @@ -33,7 +33,7 @@ public: void saveSettings(QtcSettings *settings) const; void restoreSettings(const QtcSettings *settings); Store saveSettings() const; - void restoreSettings(const Store &settings); + bool restoreSettings(const Store &settings); bool restoreFancyState(const QByteArray &state, int version = 0); // Additional context menu actions diff --git a/src/plugins/debugger/debuggermainwindow.cpp b/src/plugins/debugger/debuggermainwindow.cpp index e87ef9e1741..16f0f8dface 100644 --- a/src/plugins/debugger/debuggermainwindow.cpp +++ b/src/plugins/debugger/debuggermainwindow.cpp @@ -437,8 +437,14 @@ void DebuggerMainWindow::restorePersistentSettings() d->m_lastTypePerspectiveStates.clear(); QSet keys = Utils::toSet(states2.keys()); for (const QString &type : keys) { - PerspectiveState state = states2.value(type).value(); - QTC_ASSERT(!state.mainWindowState.isEmpty(), continue); + PerspectiveState state; + if (states2.value(type).canConvert()) { + state = PerspectiveState::fromSettings(storeFromMap(states2.value(type).toMap())); + } else { + // legacy for up to QtC 12 + state = states2.value(type).value(); + } + QTC_ASSERT(state.hasWindowState(), continue); d->m_lastTypePerspectiveStates.insert(type, state); } @@ -469,7 +475,7 @@ void DebuggerMainWindow::savePersistentSettings() const qCDebug(perspectivesLog) << "PERSPECTIVE TYPE " << type << " HAS STATE: " << !state.mainWindowState.isEmpty(); QTC_ASSERT(!state.mainWindowState.isEmpty(), continue); - states.insert(type, QVariant::fromValue(state)); + states.insert(type, mapFromStore(state.toSettings())); } QtcSettings *settings = ICore::settings(); @@ -965,10 +971,10 @@ void PerspectivePrivate::restoreLayout() { qCDebug(perspectivesLog) << "RESTORE LAYOUT FOR " << m_id << settingsId(); PerspectiveState state = theMainWindow->d->m_lastPerspectiveStates.value(m_id); - if (state.mainWindowState.isEmpty()) { + if (!state.hasWindowState()) { qCDebug(perspectivesLog) << "PERSPECTIVE STATE NOT AVAILABLE BY FULL ID."; state = theMainWindow->d->m_lastTypePerspectiveStates.value(settingsId()); - if (state.mainWindowState.isEmpty()) { + if (state.hasWindowState()) { qCDebug(perspectivesLog) << "PERSPECTIVE STATE NOT AVAILABLE BY PERSPECTIVE TYPE"; } else { qCDebug(perspectivesLog) << "PERSPECTIVE STATE AVAILABLE BY PERSPECTIVE TYPE."; @@ -994,10 +1000,10 @@ void PerspectivePrivate::restoreLayout() } } - if (state.mainWindowState.isEmpty()) { + if (!state.hasWindowState()) { qCDebug(perspectivesLog) << "PERSPECTIVE " << m_id << "RESTORE NOT POSSIBLE, NO STORED STATE"; } else { - bool result = theMainWindow->restoreFancyState(state.mainWindowState); + const bool result = state.restoreWindowState(theMainWindow); qCDebug(perspectivesLog) << "PERSPECTIVE " << m_id << "RESTORED, SUCCESS: " << result; } @@ -1019,7 +1025,7 @@ void PerspectivePrivate::saveLayout() { qCDebug(perspectivesLog) << "PERSPECTIVE" << m_id << "SAVE LAYOUT TO " << settingsId(); PerspectiveState state; - state.mainWindowState = theMainWindow->saveState(); + state.mainWindowState = theMainWindow->saveSettings(); for (DockOperation &op : m_dockOperations) { if (op.operationType != Perspective::Raise) { QTC_ASSERT(op.dock, continue); @@ -1070,4 +1076,36 @@ const char *PerspectiveState::savesHeaderKey() return "SavesHeader"; } +bool PerspectiveState::hasWindowState() const +{ + return !mainWindowState.isEmpty() || !mainWindowStateLegacy.isEmpty(); +} + +bool PerspectiveState::restoreWindowState(FancyMainWindow * mainWindow) +{ + if (!mainWindowState.isEmpty()) + return mainWindow->restoreSettings(mainWindowState); + if (!mainWindowStateLegacy.isEmpty()) + return mainWindow->restoreFancyState(mainWindowStateLegacy); + return false; +} + +const char kMainWindowStateKey[] = "MainWindow"; +const char kHeaderViewStatesKey[] = "HeaderViewStates"; + +Store PerspectiveState::toSettings() const +{ + Store result; + result.insert(kMainWindowStateKey, QVariant::fromValue(mainWindowState)); + result.insert(kHeaderViewStatesKey, QVariant::fromValue(headerViewStates)); + return result; +} +PerspectiveState PerspectiveState::fromSettings(const Store &settings) +{ + PerspectiveState state; + state.mainWindowState = settings.value(kMainWindowStateKey).value(); + state.headerViewStates = settings.value(kHeaderViewStatesKey).value(); + return state; +} + } // Utils diff --git a/src/plugins/debugger/debuggermainwindow.h b/src/plugins/debugger/debuggermainwindow.h index fbe959f19fd..ed53e30db78 100644 --- a/src/plugins/debugger/debuggermainwindow.h +++ b/src/plugins/debugger/debuggermainwindow.h @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -37,13 +38,27 @@ class PerspectiveState public: static const char *savesHeaderKey(); - QByteArray mainWindowState; + bool hasWindowState() const; + + bool restoreWindowState(FancyMainWindow *mainWindow); + + Store mainWindowState; QVariantHash headerViewStates; + QByteArray mainWindowStateLegacy; // legacy for up to QtC 12 + + Store toSettings() const; + static PerspectiveState fromSettings(const Store &settings); + + // legacy for up to QtC 12, operators for direct QVariant conversion friend QDataStream &operator>>(QDataStream &ds, PerspectiveState &state) - { return ds >> state.mainWindowState >> state.headerViewStates; } + { + return ds >> state.mainWindowStateLegacy >> state.headerViewStates; + } friend QDataStream &operator<<(QDataStream &ds, const PerspectiveState &state) - { return ds << state.mainWindowState << state.headerViewStates; } + { + return ds << state.mainWindowStateLegacy << state.headerViewStates; + } }; class DEBUGGER_EXPORT Perspective : public QObject diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index cbfe4b7b2b6..1a5b9ad21e4 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -512,6 +512,7 @@ public: mainWindow->addSubPerspectiveSwitcher(EngineManager::dapEngineChooser()); setWidget(splitter); + setMainWindow(mainWindow); setMenu(DebuggerMainWindow::perspectiveMenu()); }