diff --git a/src/libs/utils/fancymainwindow.cpp b/src/libs/utils/fancymainwindow.cpp new file mode 100644 index 0000000000000000000000000000000000000000..910170ebf26927f469da35b17151d6c1512e5031 --- /dev/null +++ b/src/libs/utils/fancymainwindow.cpp @@ -0,0 +1,161 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** +**************************************************************************/ + +#include "fancymainwindow.h" + +#include <QtGui/QAction> + +using namespace Core::Utils; + +FancyMainWindow::FancyMainWindow(QWidget *parent) + : QMainWindow(parent), + m_locked(true), + m_handleDockVisibilityChanges(true) +{ +} + +QDockWidget *FancyMainWindow::addDockForWidget(QWidget *widget) +{ + QDockWidget *dockWidget = new QDockWidget(widget->windowTitle(), this); + dockWidget->setObjectName(widget->windowTitle()); + dockWidget->setWidget(widget); + connect(dockWidget->toggleViewAction(), SIGNAL(triggered()), + this, SLOT(onDockActionTriggered()), 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(true); + updateDockWidget(dockWidget); + return dockWidget; +} + +void FancyMainWindow::updateDockWidget(QDockWidget *dockWidget) +{ + const QDockWidget::DockWidgetFeatures features = + (m_locked) ? QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable + : QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable; + 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 FancyMainWindow::onDockActionTriggered() +{ + QDockWidget *dw = qobject_cast<QDockWidget *>(sender()->parent()); + if (dw) { + if (dw->isVisible()) + dw->raise(); + } +} + +void FancyMainWindow::onDockVisibilityChange(bool visible) +{ + if (!m_handleDockVisibilityChanges) + return; + QDockWidget *dockWidget = qobject_cast<QDockWidget *>(sender()); + int index = m_dockWidgets.indexOf(dockWidget); + m_dockWidgetActiveState[index] = visible; +} + +void FancyMainWindow::onTopLevelChanged() +{ + updateDockWidget(qobject_cast<QDockWidget*>(sender())); +} + +void FancyMainWindow::setTrackingEnabled(bool enabled) +{ + if (enabled) { + m_handleDockVisibilityChanges = true; + for (int i = 0; i < m_dockWidgets.size(); ++i) + m_dockWidgetActiveState[i] = m_dockWidgets[i]->isVisible(); + } else { + m_handleDockVisibilityChanges = false; + } +} + +void FancyMainWindow::setLocked(bool locked) +{ + m_locked = locked; + foreach (QDockWidget *dockWidget, m_dockWidgets) { + updateDockWidget(dockWidget); + } +} + +void FancyMainWindow::hideEvent(QHideEvent *event) +{ + Q_UNUSED(event) + handleVisibilityChanged(false); +} + +void FancyMainWindow::showEvent(QShowEvent *event) +{ + Q_UNUSED(event) + handleVisibilityChanged(true); +} + +void FancyMainWindow::handleVisibilityChanged(bool visible) +{ + m_handleDockVisibilityChanges = false; + for (int i = 0; i < m_dockWidgets.size(); ++i) { + QDockWidget *dockWidget = m_dockWidgets.at(i); + if (dockWidget->isFloating()) { + dockWidget->setVisible(visible && m_dockWidgetActiveState.at(i)); + } + } + if (visible) + m_handleDockVisibilityChanges = true; +} + +void FancyMainWindow::saveSettings(QSettings *settings) const +{ + settings->setValue("State", saveState()); + settings->setValue("Locked", m_locked); + for (int i = 0; i < m_dockWidgetActiveState.count(); ++i) { + settings->setValue(m_dockWidgets.at(i)->objectName(), + m_dockWidgetActiveState.at(i)); + } +} + +void FancyMainWindow::restoreSettings(QSettings *settings) +{ + QByteArray ba = settings->value("State", QByteArray()).toByteArray(); + restoreState(ba); + m_locked = settings->value("Locked", true).toBool(); + for (int i = 0; i < m_dockWidgetActiveState.count(); ++i) { + m_dockWidgetActiveState[i] = settings->value(m_dockWidgets.at(i)->objectName(), false).toBool(); + } +} diff --git a/src/libs/utils/fancymainwindow.h b/src/libs/utils/fancymainwindow.h new file mode 100644 index 0000000000000000000000000000000000000000..f3367e448431ad0803b10631f4419a60ffb4e7af --- /dev/null +++ b/src/libs/utils/fancymainwindow.h @@ -0,0 +1,85 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** +**************************************************************************/ + +#ifndef FANCYMAINWINDOW_H +#define FANCYMAINWINDOW_H + +#include "utils_global.h" + +#include <QtCore/QList> +#include <QtCore/QSettings> +#include <QtGui/QMainWindow> +#include <QtGui/QDockWidget> +#include <QtCore/QSettings> + +namespace Core { +namespace Utils { + +class QTCREATOR_UTILS_EXPORT FancyMainWindow : public QMainWindow +{ + Q_OBJECT + +public: + FancyMainWindow(QWidget *parent = 0); + + QDockWidget *addDockForWidget(QWidget *widget); + QList<QDockWidget *> dockWidgets() const { return m_dockWidgets; } + + void setTrackingEnabled(bool enabled); + bool isLocked() const { return m_locked; } + + void saveSettings(QSettings *settings) const; + void restoreSettings(QSettings *settings); + +public slots: + void setLocked(bool locked); + +protected: + void hideEvent(QHideEvent *event); + void showEvent(QShowEvent *event); + +private slots: + void onDockActionTriggered(); + void onDockVisibilityChange(bool); + void onTopLevelChanged(); + +private: + void updateDockWidget(QDockWidget *dockWidget); + void handleVisibilityChanged(bool visible); + + QList<QDockWidget *> m_dockWidgets; + QList<bool> m_dockWidgetActiveState; + bool m_locked; + bool m_handleDockVisibilityChanges; //todo +}; + +} // namespace Utils +} // namespace Core + +#endif // FANCYMAINWINDOW_H diff --git a/src/libs/utils/utils.pro b/src/libs/utils/utils.pro index 6bf73d39547e0653f1274e1ecdf3b43559965fc0..16f9ec8e60102b00164c3f5d7da00f1e20151d1a 100644 --- a/src/libs/utils/utils.pro +++ b/src/libs/utils/utils.pro @@ -32,7 +32,8 @@ SOURCES += reloadpromptutils.cpp \ checkablemessagebox.cpp \ styledbar.cpp \ stylehelper.cpp \ - welcomemodetreewidget.cpp + welcomemodetreewidget.cpp \ + fancymainwindow.cpp win32 { SOURCES += abstractprocess_win.cpp \ consoleprocess_win.cpp \ @@ -72,7 +73,8 @@ HEADERS += utils_global.h \ qtcassert.h \ styledbar.h \ stylehelper.h \ - welcomemodetreewidget.h + welcomemodetreewidget.h \ + fancymainwindow.h FORMS += filewizardpage.ui \ projectintropage.ui \ newclasswidget.ui \ diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp index a2adb1baa6e684f4f4a0dbf336eacc98a47dc166..3bf92c362f1f971147a2b9d15125f117a68a17fe 100644 --- a/src/plugins/debugger/debuggermanager.cpp +++ b/src/plugins/debugger/debuggermanager.cpp @@ -57,6 +57,7 @@ #endif #include <coreplugin/icore.h> #include <utils/qtcassert.h> +#include <utils/fancymainwindow.h> #include <projectexplorer/toolchain.h> #include <QtCore/QDebug> @@ -73,7 +74,6 @@ #include <QtGui/QErrorMessage> #include <QtGui/QFileDialog> #include <QtGui/QLabel> -#include <QtGui/QMainWindow> #include <QtGui/QMessageBox> #include <QtGui/QPlainTextEdit> #include <QtGui/QPushButton> @@ -212,9 +212,6 @@ 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(); @@ -234,7 +231,7 @@ void DebuggerManager::init() //m_tooltipWindow = new WatchWindow(WatchWindow::TooltipType); m_statusTimer = new QTimer(this); - m_mainWindow = new QMainWindow; + m_mainWindow = new Core::Utils::FancyMainWindow; m_mainWindow->setTabPosition(Qt::AllDockWidgetAreas, QTabWidget::North); m_mainWindow->setDocumentMode(true); @@ -436,29 +433,29 @@ void DebuggerManager::init() connect(theDebuggerAction(WatchPoint), SIGNAL(triggered()), this, SLOT(watchPoint())); - m_breakDock = createDockForWidget(m_breakWindow); + m_breakDock = m_mainWindow->addDockForWidget(m_breakWindow); - m_disassemblerDock = createDockForWidget(m_disassemblerWindow); + m_disassemblerDock = m_mainWindow->addDockForWidget(m_disassemblerWindow); connect(m_disassemblerDock->toggleViewAction(), SIGNAL(toggled(bool)), this, SLOT(reloadDisassembler()), Qt::QueuedConnection); - m_modulesDock = createDockForWidget(m_modulesWindow); + m_modulesDock = m_mainWindow->addDockForWidget(m_modulesWindow); connect(m_modulesDock->toggleViewAction(), SIGNAL(toggled(bool)), this, SLOT(reloadModules()), Qt::QueuedConnection); - m_registerDock = createDockForWidget(m_registerWindow); + m_registerDock = m_mainWindow->addDockForWidget(m_registerWindow); connect(m_registerDock->toggleViewAction(), SIGNAL(toggled(bool)), this, SLOT(reloadRegisters()), Qt::QueuedConnection); - m_outputDock = createDockForWidget(m_outputWindow); + m_outputDock = m_mainWindow->addDockForWidget(m_outputWindow); - m_stackDock = createDockForWidget(m_stackWindow); + m_stackDock = m_mainWindow->addDockForWidget(m_stackWindow); - m_sourceFilesDock = createDockForWidget(m_sourceFilesWindow); + m_sourceFilesDock = m_mainWindow->addDockForWidget(m_sourceFilesWindow); connect(m_sourceFilesDock->toggleViewAction(), SIGNAL(toggled(bool)), this, SLOT(reloadSourceFiles()), Qt::QueuedConnection); - m_threadsDock = createDockForWidget(m_threadsWindow); + m_threadsDock = m_mainWindow->addDockForWidget(m_threadsWindow); QSplitter *localsAndWatchers = new QSplitter(Qt::Vertical, 0); localsAndWatchers->setWindowTitle(m_localsWindow->windowTitle()); @@ -468,7 +465,7 @@ void DebuggerManager::init() localsAndWatchers->setStretchFactor(0, 3); localsAndWatchers->setStretchFactor(1, 1); localsAndWatchers->setStretchFactor(2, 1); - m_watchDock = createDockForWidget(localsAndWatchers); + m_watchDock = m_mainWindow->addDockForWidget(localsAndWatchers); setStatus(DebuggerProcessNotReady); } @@ -509,30 +506,14 @@ void DebuggerManager::createNewDock(QWidget *widget) dockWidget->show(); } -QDockWidget *DebuggerManager::createDockForWidget(QWidget *widget) -{ - QDockWidget *dockWidget = new QDockWidget(widget->windowTitle(), m_mainWindow); - dockWidget->setObjectName(widget->windowTitle()); - 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(true); - updateDockWidget(dockWidget); - return dockWidget; -} - void DebuggerManager::setSimpleDockWidgetArrangement() { - m_handleDockVisibilityChanges = false; - foreach (QDockWidget *dockWidget, m_dockWidgets) + m_mainWindow->setTrackingEnabled(false); + QList<QDockWidget *> dockWidgets = m_mainWindow->dockWidgets(); + foreach (QDockWidget *dockWidget, dockWidgets) m_mainWindow->removeDockWidget(dockWidget); - foreach (QDockWidget *dockWidget, m_dockWidgets) { + foreach (QDockWidget *dockWidget, dockWidgets) { m_mainWindow->addDockWidget(Qt::BottomDockWidgetArea, dockWidget); dockWidget->show(); } @@ -552,69 +533,7 @@ 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::onDockVisibilityChange(bool visible) -{ - if (!m_handleDockVisibilityChanges) - return; - QDockWidget *dockWidget = qobject_cast<QDockWidget *>(sender()); - int index = m_dockWidgets.indexOf(dockWidget); - m_dockWidgetActiveState[index] = 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()) { - dockWidget->setVisible(visible && m_dockWidgetActiveState.at(i)); - } - } - if (visible) - m_handleDockVisibilityChanges = true; -} - -void DebuggerManager::onTopLevelChanged() -{ - updateDockWidget(qobject_cast<QDockWidget*>(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 = - (m_locked) ? QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable : - QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable; - 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() -{ - QDockWidget *dw = qobject_cast<QDockWidget *>(sender()->parent()); - if (dw) { - if (dw->isVisible()) - dw->raise(); - } + m_mainWindow->setTrackingEnabled(true); } QAbstractItemModel *DebuggerManager::threadsModel() diff --git a/src/plugins/debugger/debuggermanager.h b/src/plugins/debugger/debuggermanager.h index cc09c8f6bb480f48ebf8ddce10552d89ae450504..406a8403971ce3c766af616f74272ed420f6515f 100644 --- a/src/plugins/debugger/debuggermanager.h +++ b/src/plugins/debugger/debuggermanager.h @@ -30,6 +30,8 @@ #ifndef DEBUGGER_DEBUGGERMANAGER_H #define DEBUGGER_DEBUGGERMANAGER_H +#include <utils/fancymainwindow.h> + #include <QtCore/QByteArray> #include <QtCore/QObject> #include <QtCore/QStringList> @@ -41,7 +43,6 @@ class QAction; class QAbstractItemModel; class QDockWidget; class QLabel; -class QMainWindow; class QModelIndex; class QPoint; class QTimer; @@ -262,7 +263,7 @@ public: ~DebuggerManager(); IDebuggerManagerAccessForEngines *engineInterface(); - QMainWindow *mainWindow() const { return m_mainWindow; } + Core::Utils::FancyMainWindow *mainWindow() const { return m_mainWindow; } QLabel *statusLabel() const { return m_statusLabel; } public slots: @@ -276,9 +277,6 @@ public slots: void setQtDumperLibraryLocations(const QStringList &dl); void setSimpleDockWidgetArrangement(); - void setLocked(bool locked); - void dockActionTriggered(); - void modeVisibilityChanged(bool visible); void setBusyCursor(bool on); void queryCurrentTextEditor(QString *fileName, int *lineNumber, QObject **ed); @@ -374,7 +372,6 @@ private: // Implementation of IDebuggerManagerAccessForDebugMode // QWidget *threadsWindow() const { return m_threadsWindow; } - QList<QDockWidget*> dockWidgets() const { return m_dockWidgets; } virtual bool qtDumperLibraryEnabled() const; virtual QString qtDumperLibraryName() const; @@ -421,11 +418,7 @@ public: private: void init(); 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(); @@ -442,7 +435,7 @@ private: /// Views - QMainWindow *m_mainWindow; + Core::Utils::FancyMainWindow *m_mainWindow; QLabel *m_statusLabel; QDockWidget *m_breakDock; QDockWidget *m_disassemblerDock; @@ -453,10 +446,6 @@ private: QDockWidget *m_sourceFilesDock; QDockWidget *m_threadsDock; QDockWidget *m_watchDock; - QList<QDockWidget*> m_dockWidgets; - QList<bool> 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 de36dfeb45f2fc306ff8c50a04df49507753bdb9..3539ef2008e5aa4a34409ec6092be9ff9e9582a1 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -71,6 +71,7 @@ #include <utils/qtcassert.h> #include <utils/styledbar.h> +#include <utils/fancymainwindow.h> #include <QtCore/QDebug> #include <QtCore/QObject> @@ -82,7 +83,6 @@ #include <QtGui/QLineEdit> #include <QtGui/QDockWidget> -#include <QtGui/QMainWindow> #include <QtGui/QPlainTextEdit> #include <QtGui/QTextBlock> #include <QtGui/QTextCursor> @@ -742,8 +742,8 @@ bool DebuggerPlugin::initialize(const QStringList &arguments, QString *errorMess m_toggleLockedAction->setCheckable(true); m_toggleLockedAction->setChecked(true); connect(m_toggleLockedAction, SIGNAL(toggled(bool)), - m_manager, SLOT(setLocked(bool))); - foreach (QDockWidget *dockWidget, m_manager->dockWidgets()) { + m_manager->mainWindow(), SLOT(setLocked(bool))); + foreach (QDockWidget *dockWidget, m_manager->mainWindow()->dockWidgets()) { cmd = am->registerAction(dockWidget->toggleViewAction(), "Debugger." + dockWidget->objectName(), debuggercontext); viewsMenu->addAction(cmd); @@ -1135,8 +1135,7 @@ void DebuggerPlugin::writeSettings() const QSettings *s = settings(); DebuggerSettings::instance()->writeSettings(s); s->beginGroup(QLatin1String("DebugMode")); - s->setValue("State", m_manager->mainWindow()->saveState()); - s->setValue("Locked", m_toggleLockedAction->isChecked()); + m_manager->mainWindow()->saveSettings(s); s->endGroup(); } @@ -1154,12 +1153,9 @@ void DebuggerPlugin::readSettings() QString defaultScript; s->beginGroup(QLatin1String("DebugMode")); - QByteArray ba = s->value("State", QByteArray()).toByteArray(); - m_toggleLockedAction->setChecked(s->value("Locked", true).toBool()); + m_manager->mainWindow()->restoreSettings(s); + m_toggleLockedAction->setChecked(m_manager->mainWindow()->isLocked()); s->endGroup(); - - m_manager->mainWindow()->restoreState(ba); - m_manager->setLocked(m_toggleLockedAction->isChecked()); } void DebuggerPlugin::onModeChanged(IMode *mode) @@ -1169,15 +1165,10 @@ void DebuggerPlugin::onModeChanged(IMode *mode) // also on shutdown. if (mode != m_debugMode) { - if (m_manager) - m_manager->modeVisibilityChanged(false); return; } - if (m_manager) - m_manager->modeVisibilityChanged(true); EditorManager *editorManager = EditorManager::instance(); - if (editorManager->currentEditor()) editorManager->currentEditor()->widget()->setFocus(); }