From 48bcb83c6fc4b8e5ed6e35f81c1511e340a18e84 Mon Sep 17 00:00:00 2001 From: hjk <hjk121@nokiamail.com> Date: Tue, 2 Sep 2014 16:37:19 +0200 Subject: [PATCH] Debugger: Fix/adjust tooltip handling after editor changes Change-Id: I67ac61619c13b6cec327e8a27b45e9acfa5905f5 Reviewed-by: hjk <hjk121@nokiamail.com> --- .../debugger/debuggertooltipmanager.cpp | 113 +++++++----------- src/plugins/texteditor/basetexteditor.cpp | 1 + 2 files changed, 44 insertions(+), 70 deletions(-) diff --git a/src/plugins/debugger/debuggertooltipmanager.cpp b/src/plugins/debugger/debuggertooltipmanager.cpp index 8a767b6e1a9..92e9c279a55 100644 --- a/src/plugins/debugger/debuggertooltipmanager.cpp +++ b/src/plugins/debugger/debuggertooltipmanager.cpp @@ -177,37 +177,12 @@ void DraggableLabel::mouseMoveEvent(QMouseEvent * event) QLabel::mouseMoveEvent(event); } -// A convenience struct to pass around all tooltip-relevant editor members -// (TextEditor, Widget, File, etc), constructing from a Core::IEditor. - -class DebuggerToolTipEditor -{ -public: - 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 */ +// 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 { @@ -557,11 +532,9 @@ public slots: } void copy(); - void positionShow(const DebuggerToolTipEditor &pe); + void positionShow(const BaseTextEditorWidget *editorWidget); void pin(); - void toolButtonClicked(); -private: public: bool m_isPinned; QToolButton *m_toolButton; @@ -591,14 +564,6 @@ void DebuggerToolTipWidget::pin() m_titleLabel->active = true; // User can now drag } -void DebuggerToolTipWidget::toolButtonClicked() -{ - if (m_isPinned) - close(); - else - pin(); -} - /*! \class Debugger::Internal::DebuggerToolTipContext @@ -716,8 +681,14 @@ DebuggerToolTipWidget::DebuggerToolTipWidget(const DebuggerToolTipContext &conte mainLayout->addWidget(toolBar); mainLayout->addWidget(m_treeView); - connect(m_toolButton, SIGNAL(clicked()), this, SLOT(toolButtonClicked())); - connect(copyButton, SIGNAL(clicked()), this, SLOT(copy())); + connect(m_toolButton, &QAbstractButton::clicked, [this]() { + if (m_isPinned) + close(); + else + pin(); + }); + + connect(copyButton, &QAbstractButton::clicked, this, &DebuggerToolTipWidget::copy); } void DebuggerToolTipWidget::setWatchModel(QAbstractItemModel *watchModel) @@ -775,12 +746,12 @@ void DebuggerToolTipWidget::copy() 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. // If the line changed too much, close this tip. - QTC_ASSERT(te.isValid(), return); - QTextCursor cursor(te.widget->document()); + QTC_ASSERT(editorWidget, return); + QTextCursor cursor = editorWidget->textCursor(); cursor.setPosition(m_context.position); const int line = cursor.blockNumber(); if (qAbs(m_context.line - line) > 2) { @@ -788,9 +759,9 @@ void DebuggerToolTipWidget::positionShow(const DebuggerToolTipEditor &te) 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 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); // qDebug() << "DebuggerToolTipWidget::positionShow() " << this << m_context // << " line: " << line << " plainTextPos " << toolTipArea @@ -1235,17 +1206,22 @@ void DebuggerToolTipManager::slotUpdateVisibleToolTips() return; } - DebuggerToolTipEditor toolTipEditor = DebuggerToolTipEditor(EditorManager::currentEditor()); - if (!toolTipEditor.isValid() || toolTipEditor.fileName().isEmpty()) { + BaseTextEditor *toolTipEditor = BaseTextEditor::currentTextEditor(); + if (!toolTipEditor) { + hide(); + return; + } + + const QString fileName = toolTipEditor->textDocument()->filePath(); + if (fileName.isEmpty()) { hide(); return; } // Reposition and show all tooltips of that file. - const QString fileName = toolTipEditor.fileName(); foreach (const QPointer<DebuggerToolTipWidget> &tw, d->m_tooltips) { if (tw->fileName() == fileName) - tw->positionShow(toolTipEditor); + tw->positionShow(toolTipEditor->editorWidget()); else tw->hide(); } @@ -1272,13 +1248,12 @@ void DebuggerToolTipManager::slotDebuggerStateChanged(DebuggerState state) void DebuggerToolTipManager::slotEditorOpened(IEditor *e) { // Move tooltip along when scrolled. - DebuggerToolTipEditor toolTipEditor = DebuggerToolTipEditor(e); - if (toolTipEditor.isValid()) { - connect(toolTipEditor.widget->verticalScrollBar(), SIGNAL(valueChanged(int)), - this, SLOT(slotUpdateVisibleToolTips())); - connect(toolTipEditor.editor, - SIGNAL(tooltipOverrideRequested(TextEditor::BaseTextEditor*,QPoint,int,bool*)), - SLOT(slotTooltipOverrideRequested(TextEditor::BaseTextEditor*,QPoint,int,bool*))); + if (BaseTextEditor *textEditor = qobject_cast<BaseTextEditor *>(e)) { + BaseTextEditorWidget *widget = textEditor->editorWidget(); + connect(widget->verticalScrollBar(), &QScrollBar::valueChanged, + this, &DebuggerToolTipManager::slotUpdateVisibleToolTips); + connect(textEditor, &BaseTextEditor::tooltipOverrideRequested, + this, &DebuggerToolTipManager::slotTooltipOverrideRequested); } } @@ -1289,11 +1264,11 @@ void DebuggerToolTipManager::debugModeEntered() d->m_debugModeActive = true; QWidget *topLevel = ICore::mainWindow()->topLevelWidget(); topLevel->installEventFilter(this); - QObject *em = EditorManager::instance(); - connect(em, SIGNAL(currentEditorChanged(Core::IEditor*)), - this, SLOT(slotUpdateVisibleToolTips())); - connect(em, SIGNAL(editorOpened(Core::IEditor*)), - this, SLOT(slotEditorOpened(Core::IEditor*))); + EditorManager *em = EditorManager::instance(); + connect(em, &EditorManager::currentEditorChanged, + this, &DebuggerToolTipManager::slotUpdateVisibleToolTips); + connect(em, &EditorManager::editorOpened, + this, &DebuggerToolTipManager::slotEditorOpened); foreach (IEditor *e, DocumentModel::editorsForOpenedDocuments()) slotEditorOpened(e); // Position tooltips delayed once all the editor placeholder layouting is done. @@ -1311,10 +1286,9 @@ void DebuggerToolTipManager::leavingDebugMode() if (QWidget *topLevel = ICore::mainWindow()->topLevelWidget()) topLevel->removeEventFilter(this); foreach (IEditor *e, DocumentModel::editorsForOpenedDocuments()) { - DebuggerToolTipEditor toolTipEditor = DebuggerToolTipEditor(e); - if (toolTipEditor.isValid()) { - toolTipEditor.widget->verticalScrollBar()->disconnect(this); - toolTipEditor.editor->disconnect(this); + if (BaseTextEditor *toolTipEditor = qobject_cast<BaseTextEditor *>(e)) { + toolTipEditor->editorWidget()->verticalScrollBar()->disconnect(this); + toolTipEditor->disconnect(this); } } EditorManager::instance()->disconnect(this); @@ -1328,7 +1302,6 @@ void DebuggerToolTipManager::slotTooltipOverrideRequested { QTC_ASSERT(handled, return); QTC_ASSERT(editor, return); - QTC_ASSERT(editor->document(), return); const int movedDistance = (point - d->m_lastToolTipPoint).manhattanLength(); if (d->m_lastToolTipEditor == editor && movedDistance < 25) { diff --git a/src/plugins/texteditor/basetexteditor.cpp b/src/plugins/texteditor/basetexteditor.cpp index 9eac5d600d6..bad40ae9d44 100644 --- a/src/plugins/texteditor/basetexteditor.cpp +++ b/src/plugins/texteditor/basetexteditor.cpp @@ -2943,6 +2943,7 @@ void BaseTextEditorWidgetPrivate::processTooltipRequest(const QTextCursor &c) { const QPoint toolTipPoint = q->toolTipPosition(c); bool handled = false; + emit q->tooltipOverrideRequested(toolTipPoint, c.position(), &handled); if (!handled) emit q->tooltipRequested(toolTipPoint, c.position()); } -- GitLab