From 53a4c6eda0649f59ec58da865457aa77d114cf83 Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 9 Dec 2019 15:12:55 +0100 Subject: [PATCH] Debugger: Remember sizes and order of the columns in the debugger views Task-number: QTCREATORBUG-23341 Change-Id: I405be5361e732eccadebd1f51d90c7a3229a2e5e Reviewed-by: Christian Stenger --- src/plugins/debugger/debuggermainwindow.cpp | 78 ++++++++++++++++----- src/plugins/debugger/debuggermainwindow.h | 16 +++++ src/plugins/debugger/debuggerplugin.cpp | 1 + 3 files changed, 77 insertions(+), 18 deletions(-) diff --git a/src/plugins/debugger/debuggermainwindow.cpp b/src/plugins/debugger/debuggermainwindow.cpp index ce01d5a5a9e..3eab0bd3b62 100644 --- a/src/plugins/debugger/debuggermainwindow.cpp +++ b/src/plugins/debugger/debuggermainwindow.cpp @@ -52,6 +52,7 @@ #include #include #include +#include #include #include #include @@ -59,6 +60,7 @@ #include #include #include +#include using namespace Debugger; using namespace Core; @@ -73,7 +75,8 @@ const char LAST_PERSPECTIVE_KEY[] = "LastPerspective"; const char MAINWINDOW_KEY[] = "Debugger.MainWindow"; const char AUTOHIDE_TITLEBARS_KEY[] = "AutoHideTitleBars"; const char SHOW_CENTRALWIDGET_KEY[] = "ShowCentralWidget"; -const char STATE_KEY[] = "State"; +const char STATE_KEY[] = "State"; // Up to 4.10 +const char STATE_KEY2[] = "State2"; // From 4.11 on const char CHANGED_DOCK_KEY[] = "ChangedDocks"; static DebuggerMainWindow *theMainWindow = nullptr; @@ -166,8 +169,8 @@ public: QList> m_perspectives; QSet m_persistentChangedDocks; // Dock Ids of docks with non-default visibility. - QHash m_lastPerspectiveStates; // Perspective::id() -> MainWindow::state() - QHash m_lastTypePerspectiveStates; // Perspective::settingsId() -> MainWindow::state() + QHash m_lastPerspectiveStates; // Perspective::id() -> MainWindow::state() + QHash m_lastTypePerspectiveStates; // Perspective::settingsId() -> MainWindow::state() }; DebuggerMainWindowPrivate::DebuggerMainWindowPrivate(DebuggerMainWindow *parent) @@ -265,6 +268,9 @@ DebuggerMainWindowPrivate::~DebuggerMainWindowPrivate() DebuggerMainWindow::DebuggerMainWindow() : d(new DebuggerMainWindowPrivate(this)) { + qRegisterMetaType("PerspectiveState"); + qRegisterMetaTypeStreamOperators("PerspectiveState"); + setDockNestingEnabled(true); setDockActionsVisible(false); setDocumentMode(true); @@ -437,11 +443,17 @@ void DebuggerMainWindow::restorePersistentSettings() QSettings *settings = ICore::settings(); settings->beginGroup(MAINWINDOW_KEY); + // state2 is current, state is kept for upgradeing from <=4.10 + const QHash states2 = settings->value(STATE_KEY2).toHash(); const QHash states = settings->value(STATE_KEY).toHash(); d->m_lastTypePerspectiveStates.clear(); - for (const QString &type : states.keys()) { - const QByteArray state = states.value(type).toByteArray(); - QTC_ASSERT(!state.isEmpty(), continue); + QSet keys = Utils::toSet(states2.keys()); + keys.unite(Utils::toSet(states.keys())); + for (const QString &type : keys) { + PerspectiveState state = states2.value(type).value(); + if (state.mainWindowState.isEmpty()) + state.mainWindowState = states.value(type).toByteArray(); + QTC_ASSERT(!state.mainWindowState.isEmpty(), continue); d->m_lastTypePerspectiveStates.insert(type, state); } @@ -467,16 +479,17 @@ void DebuggerMainWindow::savePersistentSettings() const QVariantHash states; qCDebug(perspectivesLog) << "PERSPECTIVE TYPES: " << d->m_lastTypePerspectiveStates.keys(); for (const QString &type : d->m_lastTypePerspectiveStates.keys()) { - const QByteArray state = d->m_lastTypePerspectiveStates.value(type); - qCDebug(perspectivesLog) << "PERSPECTIVE TYPE " << type << " HAS STATE: " << !state.isEmpty(); - QTC_ASSERT(!state.isEmpty(), continue); - states.insert(type, state); + const PerspectiveState state = d->m_lastTypePerspectiveStates.value(type); + qCDebug(perspectivesLog) << "PERSPECTIVE TYPE " << type + << " HAS STATE: " << !state.mainWindowState.isEmpty(); + QTC_ASSERT(!state.mainWindowState.isEmpty(), continue); + states.insert(type, QVariant::fromValue(state)); } QSettings *settings = ICore::settings(); settings->beginGroup(MAINWINDOW_KEY); settings->setValue(CHANGED_DOCK_KEY, QStringList(Utils::toList(d->m_persistentChangedDocks))); - settings->setValue(STATE_KEY, states); + settings->setValue(STATE_KEY2, states); settings->setValue(AUTOHIDE_TITLEBARS_KEY, autoHideTitleBars()); settings->setValue(SHOW_CENTRALWIDGET_KEY, isCentralWidgetShown()); settings->endGroup(); @@ -931,11 +944,11 @@ void Perspective::select() void PerspectivePrivate::restoreLayout() { qCDebug(perspectivesLog) << "RESTORE LAYOUT FOR " << m_id << settingsId(); - QByteArray state = theMainWindow->d->m_lastPerspectiveStates.value(m_id); - if (state.isEmpty()) { + PerspectiveState state = theMainWindow->d->m_lastPerspectiveStates.value(m_id); + if (state.mainWindowState.isEmpty()) { qCDebug(perspectivesLog) << "PERSPECTIVE STATE NOT AVAILABLE BY FULL ID."; state = theMainWindow->d->m_lastTypePerspectiveStates.value(settingsId()); - if (state.isEmpty()) { + if (state.mainWindowState.isEmpty()) { qCDebug(perspectivesLog) << "PERSPECTIVE STATE NOT AVAILABLE BY PERSPECTIVE TYPE"; } else { qCDebug(perspectivesLog) << "PERSPECTIVE STATE AVAILABLE BY PERSPECTIVE TYPE."; @@ -961,19 +974,43 @@ void PerspectivePrivate::restoreLayout() } } - if (state.isEmpty()) { + if (state.mainWindowState.isEmpty()) { qCDebug(perspectivesLog) << "PERSPECTIVE " << m_id << "RESTORE NOT POSSIBLE, NO STORED STATE"; } else { - bool result = theMainWindow->restoreState(state); + bool result = theMainWindow->restoreState(state.mainWindowState); qCDebug(perspectivesLog) << "PERSPECTIVE " << m_id << "RESTORED, SUCCESS: " << result; } + + for (DockOperation &op : m_dockOperations) { + if (op.operationType != Perspective::Raise) { + QTC_ASSERT(op.dock, continue); + for (QTreeView *tv : op.dock->findChildren()) { + if (tv->property(PerspectiveState::savesHeaderKey()).toBool()) { + const QByteArray s = state.headerViewStates.value(op.name()).toByteArray(); + if (!s.isEmpty()) + tv->header()->restoreState(s); + } + } + } + } } void PerspectivePrivate::saveLayout() { qCDebug(perspectivesLog) << "PERSPECTIVE" << m_id << "SAVE LAYOUT TO " << settingsId(); - theMainWindow->d->m_lastPerspectiveStates.insert(m_id, theMainWindow->saveState()); - theMainWindow->d->m_lastTypePerspectiveStates.insert(settingsId(), theMainWindow->saveState()); + PerspectiveState state; + state.mainWindowState = theMainWindow->saveState(); + for (DockOperation &op : m_dockOperations) { + QTC_ASSERT(op.dock, continue); + for (QTreeView *tv : op.dock->findChildren()) { + if (tv->property(PerspectiveState::savesHeaderKey()).toBool()) { + if (QHeaderView *hv = tv->header()) + state.headerViewStates.insert(op.name(), hv->saveState()); + } + } + } + theMainWindow->d->m_lastPerspectiveStates.insert(m_id, state); + theMainWindow->d->m_lastTypePerspectiveStates.insert(settingsId(), state); } QString PerspectivePrivate::settingsId() const @@ -1006,4 +1043,9 @@ void OptionalAction::setToolButtonStyle(Qt::ToolButtonStyle style) m_toolButton->setToolButtonStyle(style); } +const char *PerspectiveState::savesHeaderKey() +{ + return "SavesHeader"; +} + } // Utils diff --git a/src/plugins/debugger/debuggermainwindow.h b/src/plugins/debugger/debuggermainwindow.h index b7629bdca8d..7cf3266b183 100644 --- a/src/plugins/debugger/debuggermainwindow.h +++ b/src/plugins/debugger/debuggermainwindow.h @@ -59,6 +59,20 @@ public: QPointer m_toolButton; }; +class PerspectiveState +{ +public: + static const char *savesHeaderKey(); + + QByteArray mainWindowState; + QVariantHash headerViewStates; + + friend QDataStream &operator>>(QDataStream &ds, PerspectiveState &state) + { return ds >> state.mainWindowState >> state.headerViewStates; } + friend QDataStream &operator<<(QDataStream &ds, const PerspectiveState &state) + { return ds << state.mainWindowState << state.headerViewStates; } +}; + class DEBUGGER_EXPORT Perspective : public QObject { public: @@ -150,3 +164,5 @@ private: }; } // Utils + +Q_DECLARE_METATYPE(Utils::PerspectiveState) diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index bbea513aea6..1436278a79d 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -2063,6 +2063,7 @@ QWidget *DebuggerPluginPrivate::addSearch(BaseTreeView *treeView) { QAction *act = action(UseAlternatingRowColors); treeView->setAlternatingRowColors(act->isChecked()); + treeView->setProperty(PerspectiveState::savesHeaderKey(), true); connect(act, &QAction::toggled, treeView, &BaseTreeView::setAlternatingRowColors); return ItemViewFind::createSearchableWrapper(treeView);