summaryrefslogtreecommitdiff
path: root/src/plugins/debugger/debuggertooltipmanager.cpp
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@nokia.com>2011-02-17 10:08:57 +0100
committerFriedemann Kleint <Friedemann.Kleint@nokia.com>2011-02-17 10:11:23 +0100
commitc74da9b7c58e2e427a369a10b27986c4dc61fb64 (patch)
tree073dce22bfec98415d8843026a363aa2214a5bd2 /src/plugins/debugger/debuggertooltipmanager.cpp
parentb83667058c33e633e44965b24d4f2fb1a0bad7de (diff)
downloadqt-creator-c74da9b7c58e2e427a369a10b27986c4dc61fb64.tar.gz
Debugger: Reduce tooltip flicker.
Move tooltip-request handling from DebuggerPlugin into DebuggerToolTipManager. Request tooltip only if position changed and close standard tooltip on success.
Diffstat (limited to 'src/plugins/debugger/debuggertooltipmanager.cpp')
-rw-r--r--src/plugins/debugger/debuggertooltipmanager.cpp130
1 files changed, 102 insertions, 28 deletions
diff --git a/src/plugins/debugger/debuggertooltipmanager.cpp b/src/plugins/debugger/debuggertooltipmanager.cpp
index 738ab14667..c1282f9ab2 100644
--- a/src/plugins/debugger/debuggertooltipmanager.cpp
+++ b/src/plugins/debugger/debuggertooltipmanager.cpp
@@ -34,7 +34,9 @@
#include "debuggertooltipmanager.h"
#include "watchutils.h"
#include "debuggerengine.h"
+#include "debuggeractions.h"
#include "watchhandler.h"
+#include "watchutils.h"
#include "stackhandler.h"
#include "debuggercore.h"
@@ -43,6 +45,7 @@
#include <coreplugin/imode.h>
#include <coreplugin/editormanager/editormanager.h>
#include <texteditor/itexteditor.h>
+#include <texteditor/tooltip/tooltip.h>
#include <utils/qtcassert.h>
@@ -128,28 +131,46 @@ static inline void debugMode(const QAbstractItemModel *model)
nospace << '#' << r << ' ' << model->data(model->index(r, 0)).toString() << '\n';
}
-static inline QPlainTextEdit *plainTextEditor(Core::IEditor *ie, QString *fileName = 0)
+namespace Debugger {
+namespace Internal {
+
+// A convenience struct to pass around all tooltip-relevant editor members
+// (TextEditor, Widget, File, etc), constructing from a Core::IEditor.
+struct DebuggerToolTipEditor
+{
+ explicit DebuggerToolTipEditor(Core::IEditor *ie = 0);
+ inline bool isValid() const { return textEditor != 0 && plainTextEdit != 0 && file != 0; }
+ inline operator bool() const { return isValid(); }
+ QString fileName() const { return file ? file->fileName() : QString(); }
+
+ static DebuggerToolTipEditor currentToolTipEditor();
+
+ TextEditor::ITextEditor *textEditor;
+ QPlainTextEdit *plainTextEdit;
+ Core::IFile *file;
+};
+
+DebuggerToolTipEditor::DebuggerToolTipEditor(Core::IEditor *ie) :
+ textEditor(0), plainTextEdit(0), file(0)
{
- if (const Core::IFile *file = ie->file())
- if (qobject_cast<TextEditor::ITextEditor *>(ie))
+ if (ie && ie->file() && isEditorDebuggable(ie)) {
+ if (TextEditor::ITextEditor *te = qobject_cast<TextEditor::ITextEditor *>(ie)) {
if (QPlainTextEdit *pe = qobject_cast<QPlainTextEdit *>(ie->widget())) {
- if (fileName)
- *fileName = file->fileName();
- return pe;
+ textEditor = te;
+ plainTextEdit = pe;
+ file = ie->file();
}
- return 0;
+ }
+ }
}
-static inline QPlainTextEdit *currentPlainTextEditor(QString *fileName = 0)
+DebuggerToolTipEditor DebuggerToolTipEditor::currentToolTipEditor()
{
if (Core::IEditor *ie = Core::EditorManager::instance()->currentEditor())
- return plainTextEditor(ie, fileName);
- return 0;
+ return DebuggerToolTipEditor(ie);
+ return DebuggerToolTipEditor();
}
-namespace Debugger {
-namespace Internal {
-
/* Helper for building a QStandardItemModel of a tree form (see TreeModelVisitor).
* The recursion/building is based on the scheme: \code
<row><item1><item2>
@@ -1005,7 +1026,8 @@ QString DebuggerTreeViewToolTipWidget::clipboardContents() const
DebuggerToolTipManager *DebuggerToolTipManager::m_instance = 0;
DebuggerToolTipManager::DebuggerToolTipManager(QObject *parent) :
- QObject(parent), m_debugModeActive(false)
+ QObject(parent), m_debugModeActive(false),
+ m_lastToolTipPos(-1), m_lastToolTipEditor(0)
{
DebuggerToolTipManager::m_instance = this;
}
@@ -1152,21 +1174,21 @@ void DebuggerToolTipManager::slotUpdateVisibleToolTips()
return;
}
- QString fileName;
- QPlainTextEdit *plainTextEdit = currentPlainTextEditor(&fileName);
+ DebuggerToolTipEditor toolTipEditor = DebuggerToolTipEditor::currentToolTipEditor();
if (debugToolTips)
- qDebug() << "DebuggerToolTipManager::slotUpdateVisibleToolTips() " << fileName << sender();
+ qDebug() << "DebuggerToolTipManager::slotUpdateVisibleToolTips() " << sender();
- if (fileName.isEmpty() || !plainTextEdit) {
+ if (!toolTipEditor.isValid() || toolTipEditor.fileName().isEmpty()) {
hide();
return;
}
// Reposition and show all tooltips of that file.
+ const QString fileName = toolTipEditor.fileName();
foreach (const QPointer<AbstractDebuggerToolTipWidget> &tw, m_tooltips) {
if (tw->fileName() == fileName) {
- tw->positionShow(plainTextEdit);
+ tw->positionShow(toolTipEditor.plainTextEdit);
} else {
tw->hide();
}
@@ -1250,9 +1272,12 @@ bool DebuggerToolTipManager::debug()
void DebuggerToolTipManager::slotEditorOpened(Core::IEditor *e)
{
// Move tooltip along when scrolled.
- if (QPlainTextEdit *plainTextEdit = plainTextEditor(e)) {
- connect(plainTextEdit->verticalScrollBar(), SIGNAL(valueChanged(int)),
+ if (DebuggerToolTipEditor toolTipEditor = DebuggerToolTipEditor(e)) {
+ connect(toolTipEditor.plainTextEdit->verticalScrollBar(), SIGNAL(valueChanged(int)),
this, SLOT(slotUpdateVisibleToolTips()));
+ connect(toolTipEditor.textEditor,
+ SIGNAL(tooltipOverrideRequested(TextEditor::ITextEditor*,QPoint,int,bool*)),
+ SLOT(slotTooltipOverrideRequested(TextEditor::ITextEditor*,QPoint,int,bool*)));
}
}
@@ -1288,16 +1313,65 @@ void DebuggerToolTipManager::leavingDebugMode()
if (m_debugModeActive) {
m_debugModeActive = false;
hide();
- QWidget *topLevel = Core::ICore::instance()->mainWindow()->topLevelWidget();
- topLevel->removeEventFilter(this);
- Core::EditorManager *em = Core::EditorManager::instance();
- foreach (Core::IEditor *e, em->openedEditors())
- if (QPlainTextEdit *plainTextEdit = plainTextEditor(e))
- plainTextEdit->verticalScrollBar()->disconnect(this);
- em->disconnect(this);
+ if (QWidget *topLevel = Core::ICore::instance()->mainWindow()->topLevelWidget())
+ topLevel->removeEventFilter(this);
+ if (Core::EditorManager *em = Core::EditorManager::instance()) {
+ foreach (Core::IEditor *e, em->openedEditors()) {
+ if (DebuggerToolTipEditor toolTipEditor = DebuggerToolTipEditor(e)) {
+ toolTipEditor.plainTextEdit->verticalScrollBar()->disconnect(this);
+ toolTipEditor.textEditor->disconnect(this);
+ }
+ }
+ em->disconnect(this);
+ }
+ m_lastToolTipEditor = 0;
+ m_lastToolTipPos = -1;
}
}
+void DebuggerToolTipManager::slotTooltipOverrideRequested(TextEditor::ITextEditor *editor,
+ const QPoint &point,
+ int pos, bool *handled)
+{
+ QTC_ASSERT(handled, return);
+ if (debugToolTips)
+ qDebug() << ">slotTooltipOverrideRequested() " << editor << point << pos << *handled;
+
+ DebuggerEngine *currentEngine = 0;
+ do {
+ if (*handled || (m_lastToolTipEditor == editor && pos == m_lastToolTipPos))
+ break; // Avoid flicker.
+
+ DebuggerCore *core = debuggerCore();
+ if (!isEditorDebuggable(editor) || !core->boolSetting(UseToolTipsInMainEditor))
+ break;
+
+ currentEngine = core->currentEngine();
+ if (!currentEngine || !currentEngine->canDisplayTooltip())
+ break;
+
+ const DebuggerToolTipContext context = DebuggerToolTipContext::fromEditor(editor, pos);
+ if (context.isValid() && currentEngine->setToolTipExpression(point, editor, context)) {
+ if (TextEditor::ToolTip::instance()->isVisible())
+ TextEditor::ToolTip::instance()->hide();
+ *handled = true;
+ m_lastToolTipEditor = editor;
+ m_lastToolTipPos = pos;
+ }
+
+ } while (false);
+
+ // Other tooltip, close all in case mouse never entered the tooltip
+ // and no leave was triggered.
+ if (!*handled) {
+ m_lastToolTipEditor = 0;
+ m_lastToolTipPos = -1;
+ closeUnpinnedToolTips();
+ }
+ if (debugToolTips)
+ qDebug() << "<slotTooltipOverrideRequested() " << currentEngine << *handled;
+}
+
QStringList DebuggerToolTipManager::treeWidgetExpressions(const QString &fileName,
const QString &engineType,
const QString &function) const