From 81075b813c05b7b984001c8cb9e3dba9f44e0842 Mon Sep 17 00:00:00 2001 From: Mikhail Khachayants Date: Tue, 6 Dec 2022 15:28:39 +0300 Subject: [PATCH] TextEditor: Fix wrong tooltip when split mode is used It was possible to get a tooltip with cached text from other editor area Fixes: QTCREATORBUG-28571 Change-Id: I4250856e6c165eed70ddb4a6c888e16b4a6b045d Reviewed-by: Reviewed-by: David Schulz --- src/plugins/texteditor/basehoverhandler.cpp | 11 ++++++++++- src/plugins/texteditor/basehoverhandler.h | 2 ++ src/plugins/texteditor/texteditor.cpp | 5 +++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/plugins/texteditor/basehoverhandler.cpp b/src/plugins/texteditor/basehoverhandler.cpp index 05d76b20baa..0b27e46f120 100644 --- a/src/plugins/texteditor/basehoverhandler.cpp +++ b/src/plugins/texteditor/basehoverhandler.cpp @@ -19,6 +19,11 @@ void BaseHoverHandler::showToolTip(TextEditorWidget *widget, const QPoint &point operateTooltip(widget, point); } +bool BaseHoverHandler::lastHelpItemAppliesTo(const TextEditorWidget *widget) const +{ + return m_lastWidget == widget; +} + void BaseHoverHandler::checkPriority(TextEditorWidget *widget, int pos, ReportPriority report) @@ -106,8 +111,12 @@ void BaseHoverHandler::process(TextEditorWidget *widget, int pos, ReportPriority m_toolTip.clear(); m_priority = -1; m_lastHelpItemIdentified = Core::HelpItem(); + m_lastWidget = nullptr; - identifyMatch(widget, pos, report); + identifyMatch(widget, pos, [this, widget, report](int priority) { + m_lastWidget = widget; + report(priority); + }); } void BaseHoverHandler::identifyMatch(TextEditorWidget *editorWidget, int pos, ReportPriority report) diff --git a/src/plugins/texteditor/basehoverhandler.h b/src/plugins/texteditor/basehoverhandler.h index 87992e0db6d..faf8f90a8df 100644 --- a/src/plugins/texteditor/basehoverhandler.h +++ b/src/plugins/texteditor/basehoverhandler.h @@ -32,6 +32,7 @@ public: virtual void abort() {} // Implement for asynchronous priority reporter void showToolTip(TextEditorWidget *widget, const QPoint &point); + bool lastHelpItemAppliesTo(const TextEditorWidget *widget) const; protected: enum { @@ -68,6 +69,7 @@ private: Core::HelpItem m_lastHelpItemIdentified; int m_priority = -1; bool m_isContextHelpRequest = false; + TextEditorWidget *m_lastWidget = nullptr; }; } // namespace TextEditor diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 11efd589838..c5bac034225 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -294,7 +294,7 @@ public: // Does the last handler still applies? const int documentRevision = textCursor.document()->revision(); const int position = Text::wordStartCursor(textCursor).position(); - if (m_lastHandlerInfo.applies(documentRevision, position)) { + if (m_lastHandlerInfo.applies(documentRevision, position, m_widget)) { callback(m_widget, m_lastHandlerInfo.handler, position); return; } @@ -399,9 +399,10 @@ private: , cursorPosition(cursorPosition) {} - bool applies(int documentRevision, int cursorPosition) const + bool applies(int documentRevision, int cursorPosition, TextEditorWidget *widget) const { return handler + && handler->lastHelpItemAppliesTo(widget) && documentRevision == this->documentRevision && cursorPosition == this->cursorPosition; }