TextEditor: fix emitting TextEditorWidget::tooltipRequested

... if no handler is responsible for the tooltip at the cursor position.
Since the CyclicSuggestionHoverHandler is added to all text editors we
need to make sure that this signal is still emitted for editor
implementations that rely on this signal.

Amends 6547d1e776

Change-Id: Iee3e316826ae253109ba4ea64781012ad55c1c23
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
David Schulz
2024-10-29 08:41:05 +01:00
parent 42113e28e6
commit 337b1e371a
2 changed files with 22 additions and 17 deletions

View File

@@ -35,7 +35,6 @@ public:
bool lastHelpItemAppliesTo(const TextEditorWidget *widget) const;
const QString &toolTip() const;
protected:
enum {
Priority_None = 0,
Priority_Tooltip = 5,
@@ -43,6 +42,8 @@ protected:
Priority_Diagnostic = 20,
Priority_Suggestion = 40
};
protected:
void setPriority(int priority);
int priority() const;

View File

@@ -361,6 +361,7 @@ class HoverHandlerRunner
{
public:
using Callback = std::function<void(TextEditorWidget *, BaseHoverHandler *, int)>;
using FallbackCallback = std::function<void(TextEditorWidget *)>;
HoverHandlerRunner(TextEditorWidget *widget, QList<BaseHoverHandler *> &handlers)
: m_widget(widget)
@@ -370,10 +371,12 @@ public:
~HoverHandlerRunner() { abortHandlers(); }
void startChecking(const QTextCursor &textCursor, const Callback &callback)
void startChecking(const QTextCursor &textCursor, const Callback &callback, const FallbackCallback &fallbackCallback)
{
if (m_handlers.empty())
if (m_handlers.empty()) {
fallbackCallback(m_widget);
return;
}
// Does the last handler still applies?
const int documentRevision = textCursor.document()->revision();
@@ -390,6 +393,7 @@ public:
m_documentRevision = documentRevision;
m_position = position;
m_callback = callback;
m_fallbackCallback = fallbackCallback;
restart();
}
@@ -437,6 +441,8 @@ public:
if (m_bestHandler) {
m_lastHandlerInfo = LastHandlerInfo(m_bestHandler, m_documentRevision, m_position);
m_callback(m_widget, m_bestHandler, m_position);
} else {
m_fallbackCallback(m_widget);
}
}
@@ -466,7 +472,7 @@ private:
// Re-initialize process data
m_currentHandlerIndex = 0;
m_bestHandler = nullptr;
m_highestHandlerPriority = -1;
m_highestHandlerPriority = BaseHoverHandler::Priority_None;
// Start checking
checkNext();
@@ -498,12 +504,13 @@ private:
// invocation data
Callback m_callback;
FallbackCallback m_fallbackCallback;
int m_position = -1;
int m_documentRevision = -1;
// processing data
int m_currentHandlerIndex = -1;
int m_highestHandlerPriority = -1;
int m_highestHandlerPriority = BaseHoverHandler::Priority_None;
BaseHoverHandler *m_bestHandler = nullptr;
};
@@ -4610,15 +4617,13 @@ void TextEditorWidgetPrivate::processTooltipRequest(const QTextCursor &c)
if (handled)
return;
if (m_hoverHandlers.isEmpty()) {
emit q->tooltipRequested(toolTipPoint, c.position());
return;
}
const auto callback = [toolTipPoint](TextEditorWidget *widget, BaseHoverHandler *handler, int) {
handler->showToolTip(widget, toolTipPoint);
};
m_hoverHandlerRunner.startChecking(c, callback);
const auto fallback = [toolTipPoint, position = c.position()](TextEditorWidget *widget) {
emit widget->tooltipRequested(toolTipPoint, position);
};
m_hoverHandlerRunner.startChecking(c, callback, fallback);
}
bool TextEditorWidgetPrivate::processAnnotaionTooltipRequest(const QTextBlock &block,
@@ -9760,11 +9765,6 @@ void TextEditorWidget::contextHelpItem(const IContext::HelpCallback &callback)
return;
}
const QString fallbackWordUnderCursor = Text::wordUnderCursor(textCursor());
if (d->m_hoverHandlers.isEmpty()) {
callback(fallbackWordUnderCursor);
return;
}
const auto hoverHandlerCallback = [fallbackWordUnderCursor, callback](
TextEditorWidget *widget, BaseHoverHandler *handler, int position) {
handler->contextHelpId(widget, position,
@@ -9776,7 +9776,11 @@ void TextEditorWidget::contextHelpItem(const IContext::HelpCallback &callback)
});
};
d->m_hoverHandlerRunner.startChecking(textCursor(), hoverHandlerCallback);
const auto fallback = [callback, fallbackWordUnderCursor](TextEditorWidget *) {
callback(fallbackWordUnderCursor);
};
d->m_hoverHandlerRunner.startChecking(textCursor(), hoverHandlerCallback, fallback);
}
void TextEditorWidget::setContextHelpItem(const HelpItem &item)