forked from qt-creator/qt-creator
Debugger: Fix/adjust tooltip handling after editor changes
Change-Id: I67ac61619c13b6cec327e8a27b45e9acfa5905f5 Reviewed-by: hjk <hjk121@nokiamail.com>
This commit is contained in:
@@ -177,37 +177,12 @@ void DraggableLabel::mouseMoveEvent(QMouseEvent * event)
|
|||||||
QLabel::mouseMoveEvent(event);
|
QLabel::mouseMoveEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
// A convenience struct to pass around all tooltip-relevant editor members
|
// Helper for building a QStandardItemModel of a tree form (see TreeModelVisitor).
|
||||||
// (TextEditor, Widget, File, etc), constructing from a Core::IEditor.
|
// The recursion/building is based on the scheme: \code
|
||||||
|
// <row><item1><item2>
|
||||||
class DebuggerToolTipEditor
|
// <row><item11><item12></row>
|
||||||
{
|
// </row>
|
||||||
public:
|
// \endcode
|
||||||
explicit DebuggerToolTipEditor(IEditor *ie);
|
|
||||||
bool isValid() const { return editor; }
|
|
||||||
QString fileName() const { return editor->document() ? editor->document()->filePath() : QString(); }
|
|
||||||
|
|
||||||
IEditor *editor;
|
|
||||||
BaseTextEditorWidget *widget;
|
|
||||||
};
|
|
||||||
|
|
||||||
DebuggerToolTipEditor::DebuggerToolTipEditor(IEditor *ie) :
|
|
||||||
editor(0), widget(0)
|
|
||||||
{
|
|
||||||
if (ie && ie->document()) {
|
|
||||||
if (BaseTextEditorWidget *w = qobject_cast<BaseTextEditorWidget *>(ie->widget())) {
|
|
||||||
editor = ie;
|
|
||||||
widget = w;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Helper for building a QStandardItemModel of a tree form (see TreeModelVisitor).
|
|
||||||
* The recursion/building is based on the scheme: \code
|
|
||||||
<row><item1><item2>
|
|
||||||
<row><item11><item12></row>
|
|
||||||
</row>
|
|
||||||
\endcode */
|
|
||||||
|
|
||||||
class StandardItemTreeModelBuilder
|
class StandardItemTreeModelBuilder
|
||||||
{
|
{
|
||||||
@@ -557,11 +532,9 @@ public slots:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void copy();
|
void copy();
|
||||||
void positionShow(const DebuggerToolTipEditor &pe);
|
void positionShow(const BaseTextEditorWidget *editorWidget);
|
||||||
void pin();
|
void pin();
|
||||||
void toolButtonClicked();
|
|
||||||
|
|
||||||
private:
|
|
||||||
public:
|
public:
|
||||||
bool m_isPinned;
|
bool m_isPinned;
|
||||||
QToolButton *m_toolButton;
|
QToolButton *m_toolButton;
|
||||||
@@ -591,14 +564,6 @@ void DebuggerToolTipWidget::pin()
|
|||||||
m_titleLabel->active = true; // User can now drag
|
m_titleLabel->active = true; // User can now drag
|
||||||
}
|
}
|
||||||
|
|
||||||
void DebuggerToolTipWidget::toolButtonClicked()
|
|
||||||
{
|
|
||||||
if (m_isPinned)
|
|
||||||
close();
|
|
||||||
else
|
|
||||||
pin();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\class Debugger::Internal::DebuggerToolTipContext
|
\class Debugger::Internal::DebuggerToolTipContext
|
||||||
|
|
||||||
@@ -716,8 +681,14 @@ DebuggerToolTipWidget::DebuggerToolTipWidget(const DebuggerToolTipContext &conte
|
|||||||
mainLayout->addWidget(toolBar);
|
mainLayout->addWidget(toolBar);
|
||||||
mainLayout->addWidget(m_treeView);
|
mainLayout->addWidget(m_treeView);
|
||||||
|
|
||||||
connect(m_toolButton, SIGNAL(clicked()), this, SLOT(toolButtonClicked()));
|
connect(m_toolButton, &QAbstractButton::clicked, [this]() {
|
||||||
connect(copyButton, SIGNAL(clicked()), this, SLOT(copy()));
|
if (m_isPinned)
|
||||||
|
close();
|
||||||
|
else
|
||||||
|
pin();
|
||||||
|
});
|
||||||
|
|
||||||
|
connect(copyButton, &QAbstractButton::clicked, this, &DebuggerToolTipWidget::copy);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DebuggerToolTipWidget::setWatchModel(QAbstractItemModel *watchModel)
|
void DebuggerToolTipWidget::setWatchModel(QAbstractItemModel *watchModel)
|
||||||
@@ -775,12 +746,12 @@ void DebuggerToolTipWidget::copy()
|
|||||||
clipboard->setText(clipboardText, QClipboard::Clipboard);
|
clipboard->setText(clipboardText, QClipboard::Clipboard);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DebuggerToolTipWidget::positionShow(const DebuggerToolTipEditor &te)
|
void DebuggerToolTipWidget::positionShow(const BaseTextEditorWidget *editorWidget)
|
||||||
{
|
{
|
||||||
// Figure out new position of tooltip using the text edit.
|
// Figure out new position of tooltip using the text edit.
|
||||||
// If the line changed too much, close this tip.
|
// If the line changed too much, close this tip.
|
||||||
QTC_ASSERT(te.isValid(), return);
|
QTC_ASSERT(editorWidget, return);
|
||||||
QTextCursor cursor(te.widget->document());
|
QTextCursor cursor = editorWidget->textCursor();
|
||||||
cursor.setPosition(m_context.position);
|
cursor.setPosition(m_context.position);
|
||||||
const int line = cursor.blockNumber();
|
const int line = cursor.blockNumber();
|
||||||
if (qAbs(m_context.line - line) > 2) {
|
if (qAbs(m_context.line - line) > 2) {
|
||||||
@@ -788,9 +759,9 @@ void DebuggerToolTipWidget::positionShow(const DebuggerToolTipEditor &te)
|
|||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
const QPoint screenPos = te.widget->toolTipPosition(cursor) + m_titleLabel->m_offset;
|
const QPoint screenPos = editorWidget->toolTipPosition(cursor) + m_titleLabel->m_offset;
|
||||||
const QRect toolTipArea = QRect(screenPos, QSize(sizeHint()));
|
const QRect toolTipArea = QRect(screenPos, QSize(sizeHint()));
|
||||||
const QRect plainTextArea = QRect(te.widget->mapToGlobal(QPoint(0, 0)), te.widget->size());
|
const QRect plainTextArea = QRect(editorWidget->mapToGlobal(QPoint(0, 0)), editorWidget->size());
|
||||||
const bool visible = plainTextArea.intersects(toolTipArea);
|
const bool visible = plainTextArea.intersects(toolTipArea);
|
||||||
// qDebug() << "DebuggerToolTipWidget::positionShow() " << this << m_context
|
// qDebug() << "DebuggerToolTipWidget::positionShow() " << this << m_context
|
||||||
// << " line: " << line << " plainTextPos " << toolTipArea
|
// << " line: " << line << " plainTextPos " << toolTipArea
|
||||||
@@ -1235,17 +1206,22 @@ void DebuggerToolTipManager::slotUpdateVisibleToolTips()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
DebuggerToolTipEditor toolTipEditor = DebuggerToolTipEditor(EditorManager::currentEditor());
|
BaseTextEditor *toolTipEditor = BaseTextEditor::currentTextEditor();
|
||||||
if (!toolTipEditor.isValid() || toolTipEditor.fileName().isEmpty()) {
|
if (!toolTipEditor) {
|
||||||
|
hide();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const QString fileName = toolTipEditor->textDocument()->filePath();
|
||||||
|
if (fileName.isEmpty()) {
|
||||||
hide();
|
hide();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reposition and show all tooltips of that file.
|
// Reposition and show all tooltips of that file.
|
||||||
const QString fileName = toolTipEditor.fileName();
|
|
||||||
foreach (const QPointer<DebuggerToolTipWidget> &tw, d->m_tooltips) {
|
foreach (const QPointer<DebuggerToolTipWidget> &tw, d->m_tooltips) {
|
||||||
if (tw->fileName() == fileName)
|
if (tw->fileName() == fileName)
|
||||||
tw->positionShow(toolTipEditor);
|
tw->positionShow(toolTipEditor->editorWidget());
|
||||||
else
|
else
|
||||||
tw->hide();
|
tw->hide();
|
||||||
}
|
}
|
||||||
@@ -1272,13 +1248,12 @@ void DebuggerToolTipManager::slotDebuggerStateChanged(DebuggerState state)
|
|||||||
void DebuggerToolTipManager::slotEditorOpened(IEditor *e)
|
void DebuggerToolTipManager::slotEditorOpened(IEditor *e)
|
||||||
{
|
{
|
||||||
// Move tooltip along when scrolled.
|
// Move tooltip along when scrolled.
|
||||||
DebuggerToolTipEditor toolTipEditor = DebuggerToolTipEditor(e);
|
if (BaseTextEditor *textEditor = qobject_cast<BaseTextEditor *>(e)) {
|
||||||
if (toolTipEditor.isValid()) {
|
BaseTextEditorWidget *widget = textEditor->editorWidget();
|
||||||
connect(toolTipEditor.widget->verticalScrollBar(), SIGNAL(valueChanged(int)),
|
connect(widget->verticalScrollBar(), &QScrollBar::valueChanged,
|
||||||
this, SLOT(slotUpdateVisibleToolTips()));
|
this, &DebuggerToolTipManager::slotUpdateVisibleToolTips);
|
||||||
connect(toolTipEditor.editor,
|
connect(textEditor, &BaseTextEditor::tooltipOverrideRequested,
|
||||||
SIGNAL(tooltipOverrideRequested(TextEditor::BaseTextEditor*,QPoint,int,bool*)),
|
this, &DebuggerToolTipManager::slotTooltipOverrideRequested);
|
||||||
SLOT(slotTooltipOverrideRequested(TextEditor::BaseTextEditor*,QPoint,int,bool*)));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1289,11 +1264,11 @@ void DebuggerToolTipManager::debugModeEntered()
|
|||||||
d->m_debugModeActive = true;
|
d->m_debugModeActive = true;
|
||||||
QWidget *topLevel = ICore::mainWindow()->topLevelWidget();
|
QWidget *topLevel = ICore::mainWindow()->topLevelWidget();
|
||||||
topLevel->installEventFilter(this);
|
topLevel->installEventFilter(this);
|
||||||
QObject *em = EditorManager::instance();
|
EditorManager *em = EditorManager::instance();
|
||||||
connect(em, SIGNAL(currentEditorChanged(Core::IEditor*)),
|
connect(em, &EditorManager::currentEditorChanged,
|
||||||
this, SLOT(slotUpdateVisibleToolTips()));
|
this, &DebuggerToolTipManager::slotUpdateVisibleToolTips);
|
||||||
connect(em, SIGNAL(editorOpened(Core::IEditor*)),
|
connect(em, &EditorManager::editorOpened,
|
||||||
this, SLOT(slotEditorOpened(Core::IEditor*)));
|
this, &DebuggerToolTipManager::slotEditorOpened);
|
||||||
foreach (IEditor *e, DocumentModel::editorsForOpenedDocuments())
|
foreach (IEditor *e, DocumentModel::editorsForOpenedDocuments())
|
||||||
slotEditorOpened(e);
|
slotEditorOpened(e);
|
||||||
// Position tooltips delayed once all the editor placeholder layouting is done.
|
// Position tooltips delayed once all the editor placeholder layouting is done.
|
||||||
@@ -1311,10 +1286,9 @@ void DebuggerToolTipManager::leavingDebugMode()
|
|||||||
if (QWidget *topLevel = ICore::mainWindow()->topLevelWidget())
|
if (QWidget *topLevel = ICore::mainWindow()->topLevelWidget())
|
||||||
topLevel->removeEventFilter(this);
|
topLevel->removeEventFilter(this);
|
||||||
foreach (IEditor *e, DocumentModel::editorsForOpenedDocuments()) {
|
foreach (IEditor *e, DocumentModel::editorsForOpenedDocuments()) {
|
||||||
DebuggerToolTipEditor toolTipEditor = DebuggerToolTipEditor(e);
|
if (BaseTextEditor *toolTipEditor = qobject_cast<BaseTextEditor *>(e)) {
|
||||||
if (toolTipEditor.isValid()) {
|
toolTipEditor->editorWidget()->verticalScrollBar()->disconnect(this);
|
||||||
toolTipEditor.widget->verticalScrollBar()->disconnect(this);
|
toolTipEditor->disconnect(this);
|
||||||
toolTipEditor.editor->disconnect(this);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EditorManager::instance()->disconnect(this);
|
EditorManager::instance()->disconnect(this);
|
||||||
@@ -1328,7 +1302,6 @@ void DebuggerToolTipManager::slotTooltipOverrideRequested
|
|||||||
{
|
{
|
||||||
QTC_ASSERT(handled, return);
|
QTC_ASSERT(handled, return);
|
||||||
QTC_ASSERT(editor, return);
|
QTC_ASSERT(editor, return);
|
||||||
QTC_ASSERT(editor->document(), return);
|
|
||||||
|
|
||||||
const int movedDistance = (point - d->m_lastToolTipPoint).manhattanLength();
|
const int movedDistance = (point - d->m_lastToolTipPoint).manhattanLength();
|
||||||
if (d->m_lastToolTipEditor == editor && movedDistance < 25) {
|
if (d->m_lastToolTipEditor == editor && movedDistance < 25) {
|
||||||
|
|||||||
@@ -2943,6 +2943,7 @@ void BaseTextEditorWidgetPrivate::processTooltipRequest(const QTextCursor &c)
|
|||||||
{
|
{
|
||||||
const QPoint toolTipPoint = q->toolTipPosition(c);
|
const QPoint toolTipPoint = q->toolTipPosition(c);
|
||||||
bool handled = false;
|
bool handled = false;
|
||||||
|
emit q->tooltipOverrideRequested(toolTipPoint, c.position(), &handled);
|
||||||
if (!handled)
|
if (!handled)
|
||||||
emit q->tooltipRequested(toolTipPoint, c.position());
|
emit q->tooltipRequested(toolTipPoint, c.position());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user