diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp index d0e607fb1f652ae2493e67ee6f631218b1abf87b..796208eca9a5d57f8115e185bd7afcb3ef8afd99 100644 --- a/src/plugins/debugger/debuggermanager.cpp +++ b/src/plugins/debugger/debuggermanager.cpp @@ -479,12 +479,13 @@ QDockWidget *DebuggerManager::createDockForWidget(QWidget *widget) { QDockWidget *dockWidget = new QDockWidget(widget->windowTitle(), m_mainWindow); dockWidget->setObjectName(widget->windowTitle()); - dockWidget->setFeatures(QDockWidget::DockWidgetClosable); + dockWidget->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable); dockWidget->setTitleBarWidget(new QWidget(dockWidget)); dockWidget->setWidget(widget); - connect(dockWidget->toggleViewAction(), SIGNAL(toggled(bool)), - this, SLOT(dockToggled(bool)), Qt::QueuedConnection); + connect(dockWidget->toggleViewAction(), SIGNAL(triggered()), + this, SLOT(dockActionTriggered()), Qt::QueuedConnection); m_dockWidgets.append(dockWidget); + m_dockWidgetActiveState.append(false); return dockWidget; } @@ -515,11 +516,30 @@ void DebuggerManager::setSimpleDockWidgetArrangement() m_outputDock->hide(); } +void DebuggerManager::updateDockWidgetActiveStates() +{ + for (int i = 0; i < m_dockWidgets.size(); ++i) { + m_dockWidgetActiveState[i] = m_dockWidgets.at(i)->isVisible(); + } +} + +void DebuggerManager::setFloatingDockWidgetsVisible(bool visible) +{ + 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 (visible) + updateDockWidgetActiveStates(); // we can't do that earlier, because the dock widgets are not visible at startup +} + void DebuggerManager::setLocked(bool locked) { const QDockWidget::DockWidgetFeatures features = - (locked) ? QDockWidget::DockWidgetClosable : - QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetClosable; + (locked) ? QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable : + QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable; foreach (QDockWidget *dockWidget, m_dockWidgets) { QWidget *titleBarWidget = dockWidget->titleBarWidget(); @@ -534,11 +554,16 @@ void DebuggerManager::setLocked(bool locked) } } -void DebuggerManager::dockToggled(bool on) +void DebuggerManager::dockActionTriggered() { QDockWidget *dw = qobject_cast<QDockWidget *>(sender()->parent()); - if (on && dw) - dw->raise(); + if (dw) { + if (dw->isVisible()) + dw->raise(); + int index = m_dockWidgets.indexOf(dw); + if (index >= 0) + m_dockWidgetActiveState[index] = dw->isVisible(); + } } QAbstractItemModel *DebuggerManager::threadsModel() diff --git a/src/plugins/debugger/debuggermanager.h b/src/plugins/debugger/debuggermanager.h index bd3655a33872da12ab0c2fee2fbdeb2ba4252076..22cd9e3c8bb7fa039b347024b014d0666cd6da19 100644 --- a/src/plugins/debugger/debuggermanager.h +++ b/src/plugins/debugger/debuggermanager.h @@ -217,7 +217,9 @@ public slots: void setSimpleDockWidgetArrangement(); void setLocked(bool locked); - void dockToggled(bool on); + void setFloatingDockWidgetsVisible(bool visible); + void updateDockWidgetActiveStates(); + void dockActionTriggered(); void setBusyCursor(bool on); void queryCurrentTextEditor(QString *fileName, int *lineNumber, QObject **ed); @@ -399,6 +401,7 @@ private: QDockWidget *m_threadsDock; QDockWidget *m_watchDock; QList<QDockWidget*> m_dockWidgets; + QList<bool> m_dockWidgetActiveState; BreakHandler *m_breakHandler; DisassemblerHandler *m_disassemblerHandler; diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 66e99a2b486fd4ec420b0f84a998ce8da98a9d5a..2d853d73270c02a3029385dbeced4d010a4cc8e4 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -756,7 +756,7 @@ bool DebuggerPlugin::initialize(const QStringList &arguments, QString *errorMess readSettings(); connect(ModeManager::instance(), SIGNAL(currentModeChanged(Core::IMode*)), - this, SLOT(focusCurrentEditor(Core::IMode*))); + this, SLOT(onModeChanged(Core::IMode*))); m_debugMode->widget()->setFocusProxy(EditorManager::instance()); addObject(m_debugMode); @@ -1040,10 +1040,13 @@ void DebuggerPlugin::readSettings() m_manager->mainWindow()->restoreState(ba); } -void DebuggerPlugin::focusCurrentEditor(IMode *mode) +void DebuggerPlugin::onModeChanged(IMode *mode) { - if (mode != m_debugMode) + if (mode != m_debugMode) { + m_manager->setFloatingDockWidgetsVisible(false); return; + } + m_manager->setFloatingDockWidgetsVisible(true); EditorManager *editorManager = EditorManager::instance(); diff --git a/src/plugins/debugger/debuggerplugin.h b/src/plugins/debugger/debuggerplugin.h index 116454ba291d4f80b7699050bbf630752c566029..c022e3a0ab81a133680cf85f4295626b5025f1b7 100644 --- a/src/plugins/debugger/debuggerplugin.h +++ b/src/plugins/debugger/debuggerplugin.h @@ -96,7 +96,7 @@ private slots: void breakpointSetRemoveMarginActionTriggered(); void breakpointEnableDisableMarginActionTriggered(); - void focusCurrentEditor(Core::IMode *mode); + void onModeChanged(Core::IMode *mode); void showSettingsDialog(); void startExternalApplication();