diff options
author | hjk <hjk@qt.io> | 2019-09-16 15:06:43 +0200 |
---|---|---|
committer | hjk <hjk@qt.io> | 2019-09-20 10:09:44 +0000 |
commit | e9c0ba9997294bdf440b6e60d0a1eaf94b74baef (patch) | |
tree | 234b6bcca8819ceefdc8254c4e63e5ab77838624 /src/plugins/debugger | |
parent | 413b0b6279ddb9c45811e46f6b438cd3f82b8dcf (diff) | |
download | qt-creator-e9c0ba9997294bdf440b6e60d0a1eaf94b74baef.tar.gz |
Debugger: Do not forget perspective layouts on unused perspectives
Amends 5273ef2a8aa3c8d268b107edc770b53e1aed7803
Use cases mentioned there should still work.
Fixes: QTCREATORBUG-22938
Fixes: QTCREATORBUG-22286
Change-Id: Ie7bb6b7ea6d05a94cbeeb5b8021dc638548778d9
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Diffstat (limited to 'src/plugins/debugger')
-rw-r--r-- | src/plugins/debugger/debuggermainwindow.cpp | 234 | ||||
-rw-r--r-- | src/plugins/debugger/debuggermainwindow.h | 6 |
2 files changed, 114 insertions, 126 deletions
diff --git a/src/plugins/debugger/debuggermainwindow.cpp b/src/plugins/debugger/debuggermainwindow.cpp index 2a2d20ff89..caa145b0f7 100644 --- a/src/plugins/debugger/debuggermainwindow.cpp +++ b/src/plugins/debugger/debuggermainwindow.cpp @@ -82,15 +82,19 @@ class DockOperation { public: void setupLayout(); + void ensureDockExists(); + QString name() const { QTC_ASSERT(widget, return QString()); return widget->objectName(); } + bool changedByUser() const; + void recordVisibility(); Core::Id commandId; QPointer<QWidget> widget; QPointer<QDockWidget> dock; QPointer<QWidget> anchorWidget; + QPointer<Utils::ProxyAction> toggleViewAction; Perspective::OperationType operationType = Perspective::Raise; bool visibleByDefault = true; - bool visibleByUser = true; Qt::DockWidgetArea area = Qt::BottomDockWidgetArea; }; @@ -156,12 +160,13 @@ public: QPointer<QWidget> m_editorPlaceHolder; Utils::StatusLabel *m_statusLabel = nullptr; QDockWidget *m_toolBarDock = nullptr; + bool needRestoreOnModeEnter = false; QList<QPointer<Perspective>> m_perspectives; - QSet<QString> m_persistentChangedDocks; + QSet<QString> m_persistentChangedDocks; // Dock Ids of docks with non-default visibility. - QHash<QString, QByteArray> m_lastPerspectiveStates; - QHash<QString, QByteArray> m_lastTypePerspectiveStates; + QHash<QString, QByteArray> m_lastPerspectiveStates; // Perspective::id() -> MainWindow::state() + QHash<QString, QByteArray> m_lastTypePerspectiveStates; // Perspective::settingsId() -> MainWindow::state() }; DebuggerMainWindowPrivate::DebuggerMainWindowPrivate(DebuggerMainWindow *parent) @@ -286,17 +291,7 @@ DebuggerMainWindow::DebuggerMainWindow() cmd->setAttribute(Command::CA_Hide); viewsMenu->addAction(cmd, Core::Constants::G_DEFAULT_THREE); - connect(ICore::instance(), &ICore::saveSettingsRequested, this, - [this](ICore::SaveSettingsReason reason) { - // There's one saveSettings triggered after plugin loading intentionally. - // We do not want to save anything at that time. - if (reason == ICore::InitializationDone) { - qCDebug(perspectivesLog) << "FIRST SAVE SETTINGS REQUEST IGNORED"; - } else { - qCDebug(perspectivesLog) << "SAVING SETTINGS"; - savePersistentSettings(); - } - }); + restorePersistentSettings(); } DebuggerMainWindow::~DebuggerMainWindow() @@ -320,6 +315,8 @@ void DebuggerMainWindow::doShutdown() { QTC_ASSERT(theMainWindow, return); + theMainWindow->savePersistentSettings(); + delete theMainWindow; theMainWindow = nullptr; } @@ -353,7 +350,7 @@ void DebuggerMainWindowPrivate::destroyPerspective(Perspective *perspective) for (DockOperation &op : perspective->d->m_dockOperations) { if (op.commandId.isValid()) - ActionManager::unregisterAction(op.dock->toggleViewAction(), op.commandId); + ActionManager::unregisterAction(op.toggleViewAction, op.commandId); if (op.dock) { theMainWindow->removeDockWidget(op.dock); op.widget->setParent(nullptr); // Prevent deletion @@ -386,8 +383,9 @@ void DebuggerMainWindow::showStatusMessage(const QString &message, int timeoutMS void DebuggerMainWindow::enterDebugMode() { theMainWindow->setDockActionsVisible(true); - theMainWindow->restorePersistentSettings(); QTC_CHECK(theMainWindow->d->m_currentPerspective == nullptr); + if (theMainWindow->d->needRestoreOnModeEnter) + theMainWindow->restorePersistentSettings(); QSettings *settings = ICore::settings(); const QString lastPerspectiveId = settings->value(LAST_PERSPECTIVE_KEY).toString(); @@ -411,6 +409,7 @@ void DebuggerMainWindow::enterDebugMode() void DebuggerMainWindow::leaveDebugMode() { + theMainWindow->d->needRestoreOnModeEnter = true; theMainWindow->savePersistentSettings(); if (theMainWindow->d->m_currentPerspective) @@ -428,42 +427,24 @@ void DebuggerMainWindow::leaveDebugMode() void DebuggerMainWindow::restorePersistentSettings() { - qCDebug(perspectivesLog) << "RESTORE PERSISTENT"; + qCDebug(perspectivesLog) << "RESTORE ALL PERSPECTIVES"; QSettings *settings = ICore::settings(); settings->beginGroup(MAINWINDOW_KEY); const QHash<QString, QVariant> states = settings->value(STATE_KEY).toHash(); - theMainWindow->d->m_lastTypePerspectiveStates.clear(); - for (const QString &type : states.keys()) - theMainWindow->d->m_lastTypePerspectiveStates.insert(type, states.value(type).toByteArray()); - - theMainWindow->setAutoHideTitleBars(settings->value(AUTOHIDE_TITLEBARS_KEY, true).toBool()); - theMainWindow->showCentralWidget(settings->value(SHOW_CENTRALWIDGET_KEY, true).toBool()); - theMainWindow->d->m_persistentChangedDocks - = Utils::toSet(settings->value(CHANGED_DOCK_KEY).toStringList()); - settings->endGroup(); + d->m_lastTypePerspectiveStates.clear(); + for (const QString &type : states.keys()) { + const QByteArray state = states.value(type).toByteArray(); + QTC_ASSERT(!state.isEmpty(), continue); + d->m_lastTypePerspectiveStates.insert(type, state); + } - qCDebug(perspectivesLog) << "LOADED DOCKS:" << theMainWindow->d->m_persistentChangedDocks; + setAutoHideTitleBars(settings->value(AUTOHIDE_TITLEBARS_KEY, true).toBool()); + showCentralWidget(settings->value(SHOW_CENTRALWIDGET_KEY, true).toBool()); + d->m_persistentChangedDocks = Utils::toSet(settings->value(CHANGED_DOCK_KEY).toStringList()); + settings->endGroup(); - QTC_ASSERT(theMainWindow, return); - QTC_ASSERT(theMainWindow->d, return); - for (Perspective *perspective : theMainWindow->d->m_perspectives) { - QTC_ASSERT(perspective, continue); - qCDebug(perspectivesLog) << "RESTORING PERSPECTIVE" << perspective->d->m_id; - for (DockOperation &op : perspective->d->m_dockOperations) { - if (op.operationType != Perspective::Raise) { - QTC_ASSERT(op.dock, continue); - QTC_ASSERT(op.widget, continue); - if (theMainWindow->d->m_persistentChangedDocks.contains(op.name())) { - qCDebug(perspectivesLog) << "DOCK " << op.name() << "*** UNUSUAL"; - op.visibleByUser = !op.visibleByDefault; - } else { - qCDebug(perspectivesLog) << "DOCK " << op.name() << "NORMAL"; - QTC_CHECK(op.visibleByUser == op.visibleByDefault); - } - } - } - } + qCDebug(perspectivesLog) << "LOADED CHANGED DOCKS:" << d->m_persistentChangedDocks; } Perspective *DebuggerMainWindow::currentPerspective() @@ -471,44 +452,30 @@ Perspective *DebuggerMainWindow::currentPerspective() return theMainWindow->d->m_currentPerspective; } -void DebuggerMainWindow::savePersistentSettings() +void DebuggerMainWindow::savePersistentSettings() const { // The current one might have active, non saved changes. - if (Perspective *perspective = theMainWindow->d->m_currentPerspective) + if (Perspective *perspective = d->m_currentPerspective) perspective->d->saveLayout(); - qCDebug(perspectivesLog) << "SAVE PERSISTENT"; - - QSet<QString> changedDocks = theMainWindow->d->m_persistentChangedDocks; - for (Perspective *perspective : theMainWindow->d->m_perspectives) { - QTC_ASSERT(perspective, continue); - qCDebug(perspectivesLog) << "SAVE PERSPECTIVE" << perspective->d->m_id; - for (const DockOperation &op : perspective->d->m_dockOperations) { - if (op.operationType != Perspective::Raise) { - QTC_ASSERT(op.dock, continue); - QTC_ASSERT(op.widget, continue); - qCDebug(perspectivesLog) << "DOCK " << op.name() << "ACTIVE: " << op.visibleByUser; - if (op.visibleByUser != op.visibleByDefault) - changedDocks.insert(op.name()); - else - changedDocks.remove(op.name()); - } - } - } - theMainWindow->d->m_persistentChangedDocks = changedDocks; - qCDebug(perspectivesLog) << "CHANGED DOCKS:" << changedDocks; - QVariantHash states; - for (const QString &type : theMainWindow->d->m_lastTypePerspectiveStates.keys()) - states.insert(type, QVariant::fromValue(theMainWindow->d->m_lastTypePerspectiveStates.value(type))); + 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); + } QSettings *settings = ICore::settings(); settings->beginGroup(MAINWINDOW_KEY); - settings->setValue(CHANGED_DOCK_KEY, QStringList(Utils::toList(changedDocks))); + settings->setValue(CHANGED_DOCK_KEY, QStringList(Utils::toList(d->m_persistentChangedDocks))); settings->setValue(STATE_KEY, states); - settings->setValue(AUTOHIDE_TITLEBARS_KEY, theMainWindow->autoHideTitleBars()); - settings->setValue(SHOW_CENTRALWIDGET_KEY, theMainWindow->isCentralWidgetShown()); + settings->setValue(AUTOHIDE_TITLEBARS_KEY, autoHideTitleBars()); + settings->setValue(SHOW_CENTRALWIDGET_KEY, isCentralWidgetShown()); settings->endGroup(); + + qCDebug(perspectivesLog) << "SAVED CHANGED DOCKS:" << d->m_persistentChangedDocks; } QWidget *DebuggerMainWindow::centralWidgetStack() @@ -578,7 +545,9 @@ void PerspectivePrivate::resetPerspective() showInnerToolBar(); for (DockOperation &op : m_dockOperations) { - if (op.operationType == Perspective::Raise) { + if (!op.dock) { + qCDebug(perspectivesLog) << "RESET UNUSED " << op.name(); + } else if (op.operationType == Perspective::Raise) { QTC_ASSERT(op.dock, qCDebug(perspectivesLog) << op.name(); continue); op.dock->raise(); } else { @@ -621,6 +590,44 @@ void DockOperation::setupLayout() } } +void DockOperation::ensureDockExists() +{ + if (dock) + return; + + dock = theMainWindow->addDockForWidget(widget); + + if (theMainWindow->restoreDockWidget(dock)) { + qCDebug(perspectivesLog) << "RESTORED SUCCESSFULLY" << commandId; + } else { + qCDebug(perspectivesLog) << "COULD NOT RESTORE" << commandId; + setupLayout(); + } + + toggleViewAction->setAction(dock->toggleViewAction()); + + QObject::connect(dock->toggleViewAction(), &QAction::triggered, + dock->toggleViewAction(), [this] { recordVisibility(); }); +} + +bool DockOperation::changedByUser() const +{ + return theMainWindow->d->m_persistentChangedDocks.contains(name()); +} + +void DockOperation::recordVisibility() +{ + if (operationType != Perspective::Raise) { + if (toggleViewAction->isChecked() == visibleByDefault) + theMainWindow->d->m_persistentChangedDocks.remove(name()); + else + theMainWindow->d->m_persistentChangedDocks.insert(name()); + } + qCDebug(perspectivesLog) << "RECORDING DOCK VISIBILITY " << name() + << toggleViewAction->isChecked() + << theMainWindow->d->m_persistentChangedDocks; +} + int DebuggerMainWindowPrivate::indexInChooser(Perspective *perspective) const { return perspective ? m_perspectiveChooser->findData(perspective->d->m_id) : -1; @@ -668,6 +675,7 @@ void PerspectivePrivate::depopulatePerspective() theMainWindow->d->m_statusLabel->clear(); + qCDebug(perspectivesLog) << "DEPOPULATE PERSPECTIVE" << m_id; for (QDockWidget *dock : theMainWindow->dockWidgets()) { if (dock != theMainWindow->d->m_toolBarDock) dock->setVisible(false); @@ -684,7 +692,7 @@ void PerspectivePrivate::saveAsLastUsedPerspective() m_lastActiveSubPerspectiveId.clear(); const QString &lastKey = m_parentPerspectiveId.isEmpty() ? m_id : m_parentPerspectiveId; - qCDebug(perspectivesLog) << "SAVE LAST USED PERSPECTIVE" << lastKey; + qCDebug(perspectivesLog) << "SAVE AS LAST USED PERSPECTIVE" << lastKey; ICore::settings()->setValue(LAST_PERSPECTIVE_KEY, lastKey); } @@ -853,36 +861,16 @@ void Perspective::addWindow(QWidget *widget, if (op.operationType != Perspective::Raise) { qCDebug(perspectivesLog) << "CREATING DOCK " << op.name() << "DEFAULT: " << op.visibleByDefault; - op.dock = theMainWindow->addDockForWidget(op.widget); op.commandId = Id("Dock.").withSuffix(op.name()); - if (theMainWindow->restoreDockWidget(op.dock)) { - qCDebug(perspectivesLog) << "RESTORED SUCCESSFULLY"; - } else { - qCDebug(perspectivesLog) << "COULD NOT RESTORE"; - op.setupLayout(); - } - op.dock->setVisible(false); - op.dock->toggleViewAction()->setText(op.dock->windowTitle()); - QObject::connect(op.dock->toggleViewAction(), &QAction::changed, op.dock, [this, op] { - qCDebug(perspectivesLog) << "CHANGED: " << op.name() - << "ACTION CHECKED: " << op.dock->toggleViewAction()->isChecked(); - }); + op.toggleViewAction = new ProxyAction(this); + op.toggleViewAction->setText(widget->windowTitle()); - Command *cmd = ActionManager::registerAction(op.dock->toggleViewAction(), - op.commandId, d->context()); + Command *cmd = ActionManager::registerAction(op.toggleViewAction, op.commandId, d->context()); cmd->setAttribute(Command::CA_Hide); ActionManager::actionContainer(Core::Constants::M_WINDOW_VIEWS)->addAction(cmd); } - op.visibleByUser = op.visibleByDefault; - if (theMainWindow->d->m_persistentChangedDocks.contains(op.name())) { - op.visibleByUser = !op.visibleByUser; - qCDebug(perspectivesLog) << "*** NON-DEFAULT USER: " << op.visibleByUser; - } else { - qCDebug(perspectivesLog) << "DEFAULT USER"; - } - d->m_dockOperations.append(op); } @@ -935,43 +923,43 @@ 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()) { + qCDebug(perspectivesLog) << "PERSPECTIVE STATE NOT AVAILABLE BY FULL ID."; + state = theMainWindow->d->m_lastTypePerspectiveStates.value(settingsId()); + if (state.isEmpty()) { + qCDebug(perspectivesLog) << "PERSPECTIVE STATE NOT AVAILABLE BY PERSPECTIVE TYPE"; + } else { + qCDebug(perspectivesLog) << "PERSPECTIVE STATE AVAILABLE BY PERSPECTIVE TYPE."; + } + } else { + qCDebug(perspectivesLog) << "PERSPECTIVE STATE AVAILABLE BY FULL ID."; + } + + if (state.isEmpty()) { + qCDebug(perspectivesLog) << "PERSPECTIVE " << m_id << "RESTORE NOT POSSIBLE, NO STORED STATE"; + } else { + bool result = theMainWindow->restoreState(state); + qCDebug(perspectivesLog) << "PERSPECTIVE " << m_id << "RESTORED. SUCCESS: " << result; + } + qCDebug(perspectivesLog) << "PERSPECTIVE" << m_id << "RESTORING LAYOUT FROM " << settingsId(); for (DockOperation &op : m_dockOperations) { if (op.operationType != Perspective::Raise) { + op.ensureDockExists(); QTC_ASSERT(op.dock, continue); - const bool active = op.visibleByUser; - op.dock->toggleViewAction()->setChecked(active); + const bool active = op.visibleByDefault ^ op.changedByUser(); op.dock->setVisible(active); qCDebug(perspectivesLog) << "RESTORE DOCK " << op.name() << "ACTIVE: " << active << (active == op.visibleByDefault ? "DEFAULT USER" : "*** NON-DEFAULT USER"); } } - - QByteArray state; - if (theMainWindow->d->m_lastTypePerspectiveStates.contains(settingsId())) - state = theMainWindow->d->m_lastTypePerspectiveStates.value(settingsId()); - if (theMainWindow->d->m_lastPerspectiveStates.contains(m_id)) - state = theMainWindow->d->m_lastPerspectiveStates.value(m_id); - theMainWindow->restoreState(state); } void PerspectivePrivate::saveLayout() { qCDebug(perspectivesLog) << "PERSPECTIVE" << m_id << "SAVE LAYOUT TO " << settingsId(); - for (DockOperation &op : m_dockOperations) { - if (op.operationType != Perspective::Raise) { - QTC_ASSERT(op.dock, continue); - QTC_ASSERT(op.widget, continue); - const bool active = op.dock->toggleViewAction()->isChecked(); - op.visibleByUser = active; - if (active == op.visibleByDefault) - theMainWindow->d->m_persistentChangedDocks.remove(op.name()); - else - theMainWindow->d->m_persistentChangedDocks.insert(op.name()); - qCDebug(perspectivesLog) << "SAVE DOCK " << op.name() << "ACTIVE: " << active - << (active == op.visibleByDefault ? "DEFAULT USER" : "*** NON-DEFAULT USER"); - } - } theMainWindow->d->m_lastPerspectiveStates.insert(m_id, theMainWindow->saveState()); theMainWindow->d->m_lastTypePerspectiveStates.insert(settingsId(), theMainWindow->saveState()); } diff --git a/src/plugins/debugger/debuggermainwindow.h b/src/plugins/debugger/debuggermainwindow.h index 116eb73717..b7629bdca8 100644 --- a/src/plugins/debugger/debuggermainwindow.h +++ b/src/plugins/debugger/debuggermainwindow.h @@ -132,15 +132,15 @@ public: static QWidget *centralWidgetStack(); void addSubPerspectiveSwitcher(QWidget *widget); - static void savePersistentSettings(); - static void restorePersistentSettings(); - static Perspective *currentPerspective(); private: DebuggerMainWindow(); ~DebuggerMainWindow() override; + void savePersistentSettings() const; + void restorePersistentSettings(); + void contextMenuEvent(QContextMenuEvent *ev) override; friend class Perspective; |