From 8951302ab29248564b6a8eca1e3abf1663b36f70 Mon Sep 17 00:00:00 2001 From: con Date: Mon, 25 May 2009 15:25:29 +0200 Subject: [PATCH] Fix floating dock widget support in debug mode. The dock widget visibility was not saved/restored correctly, and pulling floating dock widgets back into the layout didn't remove the header widget in case of locked mode. Now we track visibility and floating state of dock widgets directly. --- src/plugins/debugger/debuggermanager.cpp | 72 +++++++++++++++--------- src/plugins/debugger/debuggermanager.h | 8 ++- src/plugins/debugger/debuggerplugin.cpp | 5 +- 3 files changed, 55 insertions(+), 30 deletions(-) diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp index ba16c92ff1..1e32bc5074 100644 --- a/src/plugins/debugger/debuggermanager.cpp +++ b/src/plugins/debugger/debuggermanager.cpp @@ -184,6 +184,9 @@ void DebuggerManager::init() m_modulesHandler = 0; m_registerHandler = 0; + m_locked = true; + m_handleDockVisibilityChanges = false; + m_statusLabel = new QLabel; // FIXME: Do something to show overly long messages at least partially //QSizePolicy policy = m_statusLabel->sizePolicy(); @@ -479,18 +482,22 @@ QDockWidget *DebuggerManager::createDockForWidget(QWidget *widget) { QDockWidget *dockWidget = new QDockWidget(widget->windowTitle(), m_mainWindow); dockWidget->setObjectName(widget->windowTitle()); - dockWidget->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable); - dockWidget->setTitleBarWidget(new QWidget(dockWidget)); dockWidget->setWidget(widget); connect(dockWidget->toggleViewAction(), SIGNAL(triggered()), this, SLOT(dockActionTriggered()), Qt::QueuedConnection); + connect(dockWidget, SIGNAL(visibilityChanged(bool)), + this, SLOT(onDockVisibilityChange(bool))); + connect(dockWidget, SIGNAL(topLevelChanged(bool)), + this, SLOT(onTopLevelChanged())); m_dockWidgets.append(dockWidget); - m_dockWidgetActiveState.append(false); + m_dockWidgetActiveState.append(true); + updateDockWidget(dockWidget); return dockWidget; } void DebuggerManager::setSimpleDockWidgetArrangement() { + m_handleDockVisibilityChanges = false; foreach (QDockWidget *dockWidget, m_dockWidgets) m_mainWindow->removeDockWidget(dockWidget); @@ -514,44 +521,60 @@ void DebuggerManager::setSimpleDockWidgetArrangement() m_disassemblerDock->hide(); m_modulesDock->hide(); m_outputDock->hide(); + for (int i = 0; i < m_dockWidgets.size(); ++i) + m_dockWidgetActiveState[i] = m_dockWidgets[i]->isVisible(); + m_handleDockVisibilityChanges = true; } -void DebuggerManager::updateDockWidgetActiveStates() +void DebuggerManager::onDockVisibilityChange(bool visible) { - for (int i = 0; i < m_dockWidgets.size(); ++i) { - m_dockWidgetActiveState[i] = m_dockWidgets.at(i)->isVisible(); - } + if (!m_handleDockVisibilityChanges) + return; + QDockWidget *dockWidget = qobject_cast(sender()); + int index = m_dockWidgets.indexOf(dockWidget); + m_dockWidgetActiveState[index] = visible; } -void DebuggerManager::setFloatingDockWidgetsVisible(bool visible) +void DebuggerManager::modeVisibilityChanged(bool visible) { + m_handleDockVisibilityChanges = false; for (int i = 0; i < m_dockWidgets.size(); ++i) { QDockWidget *dockWidget = m_dockWidgets.at(i); - if (dockWidget->isFloating() && m_dockWidgetActiveState.at(i)) { - dockWidget->setVisible(visible); + if (dockWidget->isFloating()) { + dockWidget->setVisible(visible && m_dockWidgetActiveState.at(i)); } } if (visible) - updateDockWidgetActiveStates(); // we can't do that earlier, because the dock widgets are not visible at startup + m_handleDockVisibilityChanges = true; +} + +void DebuggerManager::onTopLevelChanged() +{ + updateDockWidget(qobject_cast(sender())); } void DebuggerManager::setLocked(bool locked) +{ + m_locked = locked; + foreach (QDockWidget *dockWidget, m_dockWidgets) { + updateDockWidget(dockWidget); + } +} + +void DebuggerManager::updateDockWidget(QDockWidget *dockWidget) { const QDockWidget::DockWidgetFeatures features = - (locked) ? QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable : + (m_locked) ? QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable : QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable; - - foreach (QDockWidget *dockWidget, m_dockWidgets) { - QWidget *titleBarWidget = dockWidget->titleBarWidget(); - if (locked && !titleBarWidget) - titleBarWidget = new QWidget(dockWidget); - else if (!locked && titleBarWidget) { - delete titleBarWidget; - titleBarWidget = 0; - } - dockWidget->setTitleBarWidget(titleBarWidget); - dockWidget->setFeatures(features); + QWidget *titleBarWidget = dockWidget->titleBarWidget(); + if (m_locked && !titleBarWidget && !dockWidget->isFloating()) + titleBarWidget = new QWidget(dockWidget); + else if ((!m_locked || dockWidget->isFloating()) && titleBarWidget) { + delete titleBarWidget; + titleBarWidget = 0; } + dockWidget->setTitleBarWidget(titleBarWidget); + dockWidget->setFeatures(features); } void DebuggerManager::dockActionTriggered() @@ -560,9 +583,6 @@ void DebuggerManager::dockActionTriggered() if (dw) { if (dw->isVisible()) dw->raise(); - int index = m_dockWidgets.indexOf(dw); - if (index >= 0) - m_dockWidgetActiveState[index] = dw->isVisible(); } } diff --git a/src/plugins/debugger/debuggermanager.h b/src/plugins/debugger/debuggermanager.h index 22cd9e3c8b..c9fd72d2ec 100644 --- a/src/plugins/debugger/debuggermanager.h +++ b/src/plugins/debugger/debuggermanager.h @@ -217,9 +217,8 @@ public slots: void setSimpleDockWidgetArrangement(); void setLocked(bool locked); - void setFloatingDockWidgetsVisible(bool visible); - void updateDockWidgetActiveStates(); void dockActionTriggered(); + void modeVisibilityChanged(bool visible); void setBusyCursor(bool on); void queryCurrentTextEditor(QString *fileName, int *lineNumber, QObject **ed); @@ -378,6 +377,9 @@ private: void runTest(const QString &fileName); QDockWidget *createDockForWidget(QWidget *widget); Q_SLOT void createNewDock(QWidget *widget); + void updateDockWidget(QDockWidget *dockWidget); + Q_SLOT void onDockVisibilityChange(bool visible); + Q_SLOT void onTopLevelChanged(); void shutdown(); @@ -402,6 +404,8 @@ private: QDockWidget *m_watchDock; QList m_dockWidgets; QList m_dockWidgetActiveState; + bool m_locked; + bool m_handleDockVisibilityChanges; BreakHandler *m_breakHandler; DisassemblerHandler *m_disassemblerHandler; diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 6e90b5cd54..8d79606064 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -1037,15 +1037,16 @@ void DebuggerPlugin::readSettings() s->endGroup(); m_manager->mainWindow()->restoreState(ba); + m_manager->setLocked(m_toggleLockedAction->isChecked()); } void DebuggerPlugin::onModeChanged(IMode *mode) { if (mode != m_debugMode) { - m_manager->setFloatingDockWidgetsVisible(false); + m_manager->modeVisibilityChanged(false); return; } - m_manager->setFloatingDockWidgetsVisible(true); + m_manager->modeVisibilityChanged(true); EditorManager *editorManager = EditorManager::instance(); -- GitLab