From 976c0446967c6e92ea294a72862a47435afc593b Mon Sep 17 00:00:00 2001 From: hjk <hjk121@nokiamail.com> Date: Fri, 11 Oct 2013 17:04:56 +0200 Subject: [PATCH] Debugger: Apply static pattern to DebuggerToolTipManager Change-Id: I49869c393b922da75572959973b917894f93f4ec Reviewed-by: David Schulz <david.schulz@digia.com> --- src/plugins/debugger/debuggerrunner.cpp | 2 +- .../debugger/debuggertooltipmanager.cpp | 128 +++++++++++------- src/plugins/debugger/debuggertooltipmanager.h | 29 +--- src/plugins/debugger/gdb/pythongdbengine.cpp | 4 +- src/plugins/debugger/watchwindow.cpp | 4 +- 5 files changed, 89 insertions(+), 78 deletions(-) diff --git a/src/plugins/debugger/debuggerrunner.cpp b/src/plugins/debugger/debuggerrunner.cpp index eeba0d25c11..2c5a71e7167 100644 --- a/src/plugins/debugger/debuggerrunner.cpp +++ b/src/plugins/debugger/debuggerrunner.cpp @@ -145,7 +145,7 @@ DebuggerRunControl::DebuggerRunControl(RunConfiguration *runConfiguration, d->m_engine = DebuggerRunControlFactory::createEngine(sp.masterEngineType, sp, &errorMessage); if (d->m_engine) { - DebuggerToolTipManager::instance()->registerEngine(d->m_engine); + DebuggerToolTipManager::registerEngine(d->m_engine); } else { debuggingFinished(); Core::ICore::showWarningWithOptions(DebuggerRunControl::tr("Debugger"), errorMessage); diff --git a/src/plugins/debugger/debuggertooltipmanager.cpp b/src/plugins/debugger/debuggertooltipmanager.cpp index 41cd49d707f..4f20ca95266 100644 --- a/src/plugins/debugger/debuggertooltipmanager.cpp +++ b/src/plugins/debugger/debuggertooltipmanager.cpp @@ -1086,25 +1086,53 @@ QString DebuggerToolTipWidget::clipboardContents() const (by file name and function) acquire the engine, others release. */ -DebuggerToolTipManager *DebuggerToolTipManager::m_instance = 0; +typedef QList<QPointer<DebuggerToolTipWidget> > DebuggerToolTipWidgetList; +class DebuggerToolTipManagerData +{ +public: + DebuggerToolTipManagerData() + : m_debugModeActive(false), m_lastToolTipPoint(-1, -1), m_lastToolTipEditor(0) + {} + + void registerToolTip(DebuggerToolTipWidget *toolTipWidget); + void moveToolTipsBy(const QPoint &distance); + // Purge out closed (null) tooltips and return list for convenience + void purgeClosedToolTips(); + + DebuggerToolTipWidgetList m_tooltips; + + bool m_debugModeActive; + QPoint m_lastToolTipPoint; + Core::IEditor *m_lastToolTipEditor; +}; + +static DebuggerToolTipManagerData *d = 0; +static DebuggerToolTipManager *m_instance = 0; DebuggerToolTipManager::DebuggerToolTipManager(QObject *parent) : - QObject(parent), m_debugModeActive(false), - m_lastToolTipPoint(-1, -1), m_lastToolTipEditor(0) + QObject(parent) { - DebuggerToolTipManager::m_instance = this; + d = new DebuggerToolTipManagerData; + m_instance = this; } DebuggerToolTipManager::~DebuggerToolTipManager() { - DebuggerToolTipManager::m_instance = 0; + delete d; + m_instance = 0; } void DebuggerToolTipManager::registerEngine(DebuggerEngine *engine) { connect(engine, SIGNAL(stateChanged(Debugger::DebuggerState)), - this, SLOT(slotDebuggerStateChanged(Debugger::DebuggerState))); - connect(engine, SIGNAL(stackFrameCompleted()), this, SLOT(slotStackFrameCompleted())); + m_instance, SLOT(slotDebuggerStateChanged(Debugger::DebuggerState))); + connect(engine, SIGNAL(stackFrameCompleted()), + m_instance, SLOT(slotStackFrameCompleted())); +} + +bool DebuggerToolTipManager::hasToolTips() +{ + return !d->m_tooltips.isEmpty(); } void DebuggerToolTipManager::showToolTip(const QPoint &p, DebuggerToolTipWidget *toolTipWidget) @@ -1113,16 +1141,16 @@ void DebuggerToolTipManager::showToolTip(const QPoint &p, DebuggerToolTipWidget qDebug() << "DebuggerToolTipManager::showToolTip" << p << " Mouse at " << QCursor::pos(); const Utils::WidgetContent widgetContent(toolTipWidget, true); Utils::ToolTip::show(p, widgetContent, debuggerCore()->mainWindow()); - m_instance->registerToolTip(toolTipWidget); + d->registerToolTip(toolTipWidget); } -void DebuggerToolTipManager::registerToolTip(DebuggerToolTipWidget *toolTipWidget) +void DebuggerToolTipManagerData::registerToolTip(DebuggerToolTipWidget *toolTipWidget) { QTC_ASSERT(toolTipWidget->context().isValid(), return); m_tooltips.push_back(toolTipWidget); } -void DebuggerToolTipManager::purgeClosedToolTips() +void DebuggerToolTipManagerData::purgeClosedToolTips() { for (DebuggerToolTipWidgetList::iterator it = m_tooltips.begin(); it != m_tooltips.end() ; ) { if (it->isNull()) @@ -1132,7 +1160,7 @@ void DebuggerToolTipManager::purgeClosedToolTips() } } -void DebuggerToolTipManager::moveToolTipsBy(const QPoint &distance) +void DebuggerToolTipManagerData::moveToolTipsBy(const QPoint &distance) { purgeClosedToolTips(); foreach (const QPointer<DebuggerToolTipWidget> &tw, m_tooltips) @@ -1147,7 +1175,7 @@ bool DebuggerToolTipManager::eventFilter(QObject *o, QEvent *e) switch (e->type()) { case QEvent::Move: { // Move along with parent (toplevel) const QMoveEvent *me = static_cast<const QMoveEvent *>(e); - moveToolTipsBy(me->pos() - me->oldPos()); + d->moveToolTipsBy(me->pos() - me->oldPos()); } break; case QEvent::WindowStateChange: { // Hide/Show along with parent (toplevel) @@ -1155,8 +1183,8 @@ bool DebuggerToolTipManager::eventFilter(QObject *o, QEvent *e) const bool wasMinimized = se->oldState() & Qt::WindowMinimized; const bool isMinimized = static_cast<const QWidget *>(o)->windowState() & Qt::WindowMinimized; if (wasMinimized ^ isMinimized) { - purgeClosedToolTips(); - foreach (const QPointer<DebuggerToolTipWidget> &tw, m_tooltips) + d->purgeClosedToolTips(); + foreach (const QPointer<DebuggerToolTipWidget> &tw, d->m_tooltips) tw->setVisible(!isMinimized); } } @@ -1184,29 +1212,29 @@ void DebuggerToolTipManager::loadSessionData() const double version = r.attributes().value(QLatin1String(sessionVersionAttributeC)).toString().toDouble(); while (!r.atEnd()) if (DebuggerToolTipWidget *tw = DebuggerToolTipWidget::loadSessionData(r)) - registerToolTip(tw); + d->registerToolTip(tw); if (debugToolTips) - qDebug() << "DebuggerToolTipManager::loadSessionData version " << version << " restored " << m_tooltips.size(); + qDebug() << "DebuggerToolTipManager::loadSessionData version " << version << " restored " << d->m_tooltips.size(); slotUpdateVisibleToolTips(); } void DebuggerToolTipManager::saveSessionData() { QString data; - purgeClosedToolTips(); - if (!m_tooltips.isEmpty()) { + d->purgeClosedToolTips(); + if (!d->m_tooltips.isEmpty()) { QXmlStreamWriter w(&data); w.writeStartDocument(); w.writeStartElement(QLatin1String(sessionDocumentC)); w.writeAttribute(QLatin1String(sessionVersionAttributeC), QLatin1String("1.0")); - foreach (const QPointer<DebuggerToolTipWidget> &tw, m_tooltips) + foreach (const QPointer<DebuggerToolTipWidget> &tw, d->m_tooltips) if (tw->isPinned()) tw->saveSessionData(w); w.writeEndDocument(); } if (debugToolTips) - qDebug() << "DebuggerToolTipManager::saveSessionData" << m_tooltips.size() << data ; + qDebug() << "DebuggerToolTipManager::saveSessionData" << d->m_tooltips.size() << data ; DebuggerCore::setSessionValue(sessionSettingsKeyC, QVariant(data)); } @@ -1215,25 +1243,25 @@ void DebuggerToolTipManager::closeAllToolTips() if (debugToolTips) qDebug() << "DebuggerToolTipManager::closeAllToolTips"; - purgeClosedToolTips(); - foreach (const QPointer<DebuggerToolTipWidget> &tw, m_tooltips) + d->purgeClosedToolTips(); + foreach (const QPointer<DebuggerToolTipWidget> &tw, d->m_tooltips) tw->close(); - m_tooltips.clear(); + d->m_tooltips.clear(); } void DebuggerToolTipManager::hide() { - purgeClosedToolTips(); - foreach (const QPointer<DebuggerToolTipWidget> &tw, m_tooltips) + d->purgeClosedToolTips(); + foreach (const QPointer<DebuggerToolTipWidget> &tw, d->m_tooltips) tw->hide(); } void DebuggerToolTipManager::slotUpdateVisibleToolTips() { - purgeClosedToolTips(); - if (m_tooltips.isEmpty()) + d->purgeClosedToolTips(); + if (d->m_tooltips.isEmpty()) return; - if (!m_debugModeActive) { + if (!d->m_debugModeActive) { hide(); return; } @@ -1250,7 +1278,7 @@ void DebuggerToolTipManager::slotUpdateVisibleToolTips() // Reposition and show all tooltips of that file. const QString fileName = toolTipEditor.fileName(); - foreach (const QPointer<DebuggerToolTipWidget> &tw, m_tooltips) { + foreach (const QPointer<DebuggerToolTipWidget> &tw, d->m_tooltips) { if (tw->fileName() == fileName) tw->positionShow(toolTipEditor); else @@ -1276,8 +1304,8 @@ void DebuggerToolTipManager::slotDebuggerStateChanged(DebuggerState state) case EngineShutdownRequested: case DebuggerFinished: case EngineShutdownOk: { - purgeClosedToolTips(); - foreach (const QPointer<DebuggerToolTipWidget> &tw, m_tooltips) + d->purgeClosedToolTips(); + foreach (const QPointer<DebuggerToolTipWidget> &tw, d->m_tooltips) if (tw->engineType() == name) tw->releaseEngine(); break; @@ -1289,8 +1317,8 @@ void DebuggerToolTipManager::slotDebuggerStateChanged(DebuggerState state) void DebuggerToolTipManager::slotStackFrameCompleted() { - purgeClosedToolTips(); - if (m_tooltips.isEmpty()) + d->purgeClosedToolTips(); + if (d->m_tooltips.isEmpty()) return; DebuggerEngine *engine = qobject_cast<DebuggerEngine *>(sender()); QTC_ASSERT(engine, return); @@ -1316,7 +1344,7 @@ void DebuggerToolTipManager::slotStackFrameCompleted() qPrintable(engineName), qPrintable(fileName), lineNumber, qPrintable(function)); unsigned acquiredCount = 0; - foreach (const QPointer<DebuggerToolTipWidget> &tw, m_tooltips) { + foreach (const QPointer<DebuggerToolTipWidget> &tw, d->m_tooltips) { if (tw->matches(fileName, engineName, function)) { tw->acquireEngine(engine); acquiredCount++; @@ -1353,8 +1381,8 @@ void DebuggerToolTipManager::debugModeEntered() qDebug("DebuggerToolTipManager::debugModeEntered"); // Hook up all signals in debug mode. - if (!m_debugModeActive) { - m_debugModeActive = true; + if (!d->m_debugModeActive) { + d->m_debugModeActive = true; QWidget *topLevel = ICore::mainWindow()->topLevelWidget(); topLevel->installEventFilter(this); QObject *em = EditorManager::instance(); @@ -1366,7 +1394,7 @@ void DebuggerToolTipManager::debugModeEntered() foreach (IEditor *e, documentModel->editorsForDocuments(documentModel->openedDocuments())) slotEditorOpened(e); // Position tooltips delayed once all the editor placeholder layouting is done. - if (!m_tooltips.isEmpty()) + if (!d->m_tooltips.isEmpty()) QTimer::singleShot(0, this, SLOT(slotUpdateVisibleToolTips())); } } @@ -1377,8 +1405,8 @@ void DebuggerToolTipManager::leavingDebugMode() qDebug("DebuggerToolTipManager::leavingDebugMode"); // Remove all signals in debug mode. - if (m_debugModeActive) { - m_debugModeActive = false; + if (d->m_debugModeActive) { + d->m_debugModeActive = false; hide(); if (QWidget *topLevel = ICore::mainWindow()->topLevelWidget()) topLevel->removeEventFilter(this); @@ -1390,8 +1418,8 @@ void DebuggerToolTipManager::leavingDebugMode() } } EditorManager::instance()->disconnect(this); - m_lastToolTipEditor = 0; - m_lastToolTipPoint = QPoint(-1, -1); + d->m_lastToolTipEditor = 0; + d->m_lastToolTipPoint = QPoint(-1, -1); } } @@ -1401,11 +1429,11 @@ void DebuggerToolTipManager::slotTooltipOverrideRequested(ITextEditor *editor, { QTC_ASSERT(handled, return); - const int movedDistance = (point - m_lastToolTipPoint).manhattanLength(); - const bool samePosition = m_lastToolTipEditor == editor && movedDistance < 25; + const int movedDistance = (point - d->m_lastToolTipPoint).manhattanLength(); + const bool samePosition = d->m_lastToolTipEditor == editor && movedDistance < 25; if (debugToolTipPositioning) qDebug() << ">slotTooltipOverrideRequested() " << editor << point - << "from " << m_lastToolTipPoint << ") pos: " + << "from " << d->m_lastToolTipPoint << ") pos: " << pos << *handled << " Same position=" << samePosition << " d=" << movedDistance; @@ -1428,8 +1456,8 @@ void DebuggerToolTipManager::slotTooltipOverrideRequested(ITextEditor *editor, const DebuggerToolTipContext context = DebuggerToolTipContext::fromEditor(editor, pos); if (context.isValid() && currentEngine->setToolTipExpression(point, editor, context)) { *handled = true; - m_lastToolTipEditor = editor; - m_lastToolTipPoint = point; + d->m_lastToolTipEditor = editor; + d->m_lastToolTipPoint = point; } } while (false); @@ -1437,8 +1465,8 @@ void DebuggerToolTipManager::slotTooltipOverrideRequested(ITextEditor *editor, // Other tooltip, close all in case mouse never entered the tooltip // and no leave was triggered. if (!*handled) { - m_lastToolTipEditor = 0; - m_lastToolTipPoint = QPoint(-1, -1); + d->m_lastToolTipEditor = 0; + d->m_lastToolTipPoint = QPoint(-1, -1); } if (debugToolTipPositioning) qDebug() << "<slotTooltipOverrideRequested() " << currentEngine << *handled; @@ -1448,10 +1476,10 @@ void DebuggerToolTipManager::slotTooltipOverrideRequested(ITextEditor *editor, DebuggerToolTipManager::ExpressionInamePairs DebuggerToolTipManager::treeWidgetExpressions(const QString &fileName, const QString &engineType, - const QString &function) const + const QString &function) { ExpressionInamePairs rc; - foreach (const QPointer<DebuggerToolTipWidget> &tw, m_tooltips) { + foreach (const QPointer<DebuggerToolTipWidget> &tw, d->m_tooltips) { if (!tw.isNull() && tw->matches(fileName, engineType, function)) rc.push_back(ExpressionInamePair(tw->expression(), tw->iname())); } diff --git a/src/plugins/debugger/debuggertooltipmanager.h b/src/plugins/debugger/debuggertooltipmanager.h index dce47dad010..9575353b6d2 100644 --- a/src/plugins/debugger/debuggertooltipmanager.h +++ b/src/plugins/debugger/debuggertooltipmanager.h @@ -196,16 +196,15 @@ public: typedef QList<ExpressionInamePair> ExpressionInamePairs; explicit DebuggerToolTipManager(QObject *parent = 0); - virtual ~DebuggerToolTipManager(); + ~DebuggerToolTipManager(); - static DebuggerToolTipManager *instance() { return m_instance; } - void registerEngine(DebuggerEngine *engine); - bool hasToolTips() const { return !m_tooltips.isEmpty(); } + static void registerEngine(DebuggerEngine *engine); + static bool hasToolTips(); // Collect all expressions of DebuggerTreeViewToolTipWidget - ExpressionInamePairs treeWidgetExpressions(const QString &fileName, + static ExpressionInamePairs treeWidgetExpressions(const QString &fileName, const QString &engineType = QString(), - const QString &function= QString()) const; + const QString &function= QString()); static void showToolTip(const QPoint &p, DebuggerToolTipWidget *); @@ -219,7 +218,7 @@ public slots: void sessionAboutToChange(); void loadSessionData(); void saveSessionData(); - void closeAllToolTips(); + static void closeAllToolTips(); void hide(); private slots: @@ -229,22 +228,6 @@ private slots: void slotEditorOpened(Core::IEditor *); void slotTooltipOverrideRequested(TextEditor::ITextEditor *editor, const QPoint &point, int pos, bool *handled); - -private: - typedef QList<QPointer<DebuggerToolTipWidget> > DebuggerToolTipWidgetList; - - void registerToolTip(DebuggerToolTipWidget *toolTipWidget); - void moveToolTipsBy(const QPoint &distance); - // Purge out closed (null) tooltips and return list for convenience - void purgeClosedToolTips(); - - static DebuggerToolTipManager *m_instance; - - DebuggerToolTipWidgetList m_tooltips; - - bool m_debugModeActive; - QPoint m_lastToolTipPoint; - Core::IEditor *m_lastToolTipEditor; }; } // namespace Internal diff --git a/src/plugins/debugger/gdb/pythongdbengine.cpp b/src/plugins/debugger/gdb/pythongdbengine.cpp index 459b4ecfaa8..b341ec61838 100644 --- a/src/plugins/debugger/gdb/pythongdbengine.cpp +++ b/src/plugins/debugger/gdb/pythongdbengine.cpp @@ -67,8 +67,8 @@ void GdbEngine::updateLocalsPython(const UpdateParameters ¶ms) // Re-create tooltip items that are not filters on existing local variables in // the tooltip model. - ExpressionInamePairs toolTips = DebuggerToolTipManager::instance() - ->treeWidgetExpressions(fileName, objectName(), function); + ExpressionInamePairs toolTips = + DebuggerToolTipManager::treeWidgetExpressions(fileName, objectName(), function); const QString currentExpression = tooltipExpression(); if (!currentExpression.isEmpty()) { diff --git a/src/plugins/debugger/watchwindow.cpp b/src/plugins/debugger/watchwindow.cpp index 81e4798578e..1619cfeb2fc 100644 --- a/src/plugins/debugger/watchwindow.cpp +++ b/src/plugins/debugger/watchwindow.cpp @@ -863,7 +863,7 @@ void WatchTreeView::contextMenuEvent(QContextMenuEvent *ev) QAction *actCloseEditorToolTips = new QAction(tr("Close Editor Tooltips"), &menu); - actCloseEditorToolTips->setEnabled(DebuggerToolTipManager::instance()->hasToolTips()); + actCloseEditorToolTips->setEnabled(DebuggerToolTipManager::hasToolTips()); menu.addAction(actCloseEditorToolTips); addBaseContextActions(&menu); @@ -932,7 +932,7 @@ void WatchTreeView::contextMenuEvent(QContextMenuEvent *ev) } else if (act == showUnprintableHexadecimal) { handler->setUnprintableBase(16); } else if (act == actCloseEditorToolTips) { - DebuggerToolTipManager::instance()->closeAllToolTips(); + DebuggerToolTipManager::closeAllToolTips(); } else if (handleBaseContextAction(act)) { ; } else { -- GitLab