diff options
author | Nikolai Kosjar <nikolai.kosjar@qt.io> | 2019-01-31 13:16:44 +0100 |
---|---|---|
committer | Nikolai Kosjar <nikolai.kosjar@qt.io> | 2019-02-05 11:22:27 +0000 |
commit | c5e43d86d12ce51c9035159a8acd86800fdf69bc (patch) | |
tree | 90030cd07fa47a25705cf485c333d06a90462660 /src/plugins/clangcodemodel | |
parent | 1a58a30685a7acb386989f8edbcd497d9472acf1 (diff) |
Clang: Make diagnostic tooltips consistent
Fix that triggering a diagnostic tooltip from the diagnostic
location/range itself (underlined text) did not show the icon on the
left and the actions/toolbuttons on the right in the tooltip.
Instead of showing the tooltip content itself, request the tooltip for
the corresponding text mark to get the extra decoration and actions.
Change-Id: I5e94aca117a761f7a798d4f4b33db6e386e54d84
Reviewed-by: David Schulz <david.schulz@qt.io>
Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
Diffstat (limited to 'src/plugins/clangcodemodel')
6 files changed, 31 insertions, 100 deletions
diff --git a/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp b/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp index 72049242dc..8bc0b925c2 100644 --- a/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp +++ b/src/plugins/clangcodemodel/clangdiagnosticmanager.cpp @@ -210,36 +210,6 @@ bool isDiagnosticAtLocation(const ClangBackEnd::DiagnosticContainer &diagnostic, return isDiagnosticRelatedToLocation(diagnostic, {cursorRange}, line, column); } -QVector<ClangBackEnd::DiagnosticContainer> -filteredDiagnosticsAtLocation(const QVector<ClangBackEnd::DiagnosticContainer> &diagnostics, - uint line, - uint column, - QTextDocument *textDocument) -{ - QVector<ClangBackEnd::DiagnosticContainer> filteredDiagnostics; - - foreach (const auto &diagnostic, diagnostics) { - if (isDiagnosticAtLocation(diagnostic, line, column, textDocument)) - filteredDiagnostics.append(diagnostic); - } - - return filteredDiagnostics; -} - -bool editorDocumentProcessorHasDiagnosticAt( - const QVector<ClangBackEnd::DiagnosticContainer> &diagnostics, - uint line, - uint column, - QTextDocument *textDocument) -{ - foreach (const auto &diagnostic, diagnostics) { - if (isDiagnosticAtLocation(diagnostic, line, column, textDocument)) - return true; - } - - return false; -} - QTextCursor cursorAtLastPositionOfLine(QTextDocument *textDocument, int lineNumber) { const QTextBlock textBlock = textDocument->findBlockByNumber(lineNumber - 1); @@ -399,24 +369,16 @@ TextEditor::RefactorMarkers ClangDiagnosticManager::takeFixItAvailableMarkers() return fixItAvailableMarkers; } -bool ClangDiagnosticManager::hasDiagnosticsAt(uint line, uint column) const +TextEditor::TextMarks ClangDiagnosticManager::diagnosticTextMarksAt(uint line, uint column) const { - QTextDocument *textDocument = m_textDocument->document(); - - return editorDocumentProcessorHasDiagnosticAt(m_errorDiagnostics, line, column, textDocument) - || editorDocumentProcessorHasDiagnosticAt(m_warningDiagnostics, line, column, textDocument); -} + QList<TextEditor::TextMark *> textMarks; -QVector<ClangBackEnd::DiagnosticContainer> -ClangDiagnosticManager::diagnosticsAt(uint line, uint column) const -{ - QTextDocument *textDocument = m_textDocument->document(); - - QVector<ClangBackEnd::DiagnosticContainer> diagnostics; - diagnostics += filteredDiagnosticsAtLocation(m_errorDiagnostics, line, column, textDocument); - diagnostics += filteredDiagnosticsAtLocation(m_warningDiagnostics, line, column, textDocument); + for (ClangTextMark *textMark : m_clangTextMarks) { + if (isDiagnosticAtLocation(textMark->diagnostic(), line, column, m_textDocument->document())) + textMarks << textMark; + } - return diagnostics; + return textMarks; } void ClangDiagnosticManager::invalidateDiagnostics() diff --git a/src/plugins/clangcodemodel/clangdiagnosticmanager.h b/src/plugins/clangcodemodel/clangdiagnosticmanager.h index d0c31bf68b..2996936ed0 100644 --- a/src/plugins/clangcodemodel/clangdiagnosticmanager.h +++ b/src/plugins/clangcodemodel/clangdiagnosticmanager.h @@ -57,8 +57,7 @@ public: QList<QTextEdit::ExtraSelection> takeExtraSelections(); TextEditor::RefactorMarkers takeFixItAvailableMarkers(); - bool hasDiagnosticsAt(uint line, uint column) const; - QVector<ClangBackEnd::DiagnosticContainer> diagnosticsAt(uint line, uint column) const; + QList<TextEditor::TextMark *> diagnosticTextMarksAt(uint line, uint column) const; void invalidateDiagnostics(); void clearDiagnosticsWithFixIts(); diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp index 8e1d06da6c..40d7e4e63f 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp @@ -48,7 +48,6 @@ #include <cpptools/cppworkingcopy.h> #include <cpptools/editordocumenthandle.h> -#include <texteditor/displaysettings.h> #include <texteditor/fontsettings.h> #include <texteditor/texteditor.h> #include <texteditor/texteditorconstants.h> @@ -292,27 +291,6 @@ TextEditor::QuickFixOperations ClangEditorDocumentProcessor::extraRefactoringOpe return extractor.extract(assistInterface.fileName(), currentLine(assistInterface)); } -bool ClangEditorDocumentProcessor::hasDiagnosticsAt(uint line, uint column) const -{ - return m_diagnosticManager.hasDiagnosticsAt(line, column); -} - -void ClangEditorDocumentProcessor::addDiagnosticToolTipToLayout(uint line, - uint column, - QLayout *target) const -{ - using Internal::ClangDiagnosticWidget; - - const QVector<ClangBackEnd::DiagnosticContainer> diagnostics - = m_diagnosticManager.diagnosticsAt(line, column); - - target->addWidget( - ClangDiagnosticWidget::createWidget(diagnostics, ClangDiagnosticWidget::ToolTip)); - auto link = TextEditor::DisplaySettings::createAnnotationSettingsLink(); - target->addWidget(link); - target->setAlignment(link, Qt::AlignRight); -} - void ClangEditorDocumentProcessor::editorDocumentTimerRestarted() { m_updateBackendDocumentTimer.stop(); // Wait for the next call to run(). @@ -323,6 +301,12 @@ void ClangEditorDocumentProcessor::invalidateDiagnostics() m_diagnosticManager.invalidateDiagnostics(); } +TextEditor::TextMarks ClangEditorDocumentProcessor::diagnosticTextMarksAt(uint line, + uint column) const +{ + return m_diagnosticManager.diagnosticTextMarksAt(line, column); +} + void ClangEditorDocumentProcessor::setParserConfig( const CppTools::BaseEditorDocumentParser::Configuration &config) { diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h index a7da1bb2e1..8e0ee003d3 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h @@ -83,8 +83,8 @@ public: extraRefactoringOperations(const TextEditor::AssistInterface &assistInterface) override; void invalidateDiagnostics() override; - bool hasDiagnosticsAt(uint line, uint column) const override; - void addDiagnosticToolTipToLayout(uint line, uint column, QLayout *target) const override; + + TextEditor::TextMarks diagnosticTextMarksAt(uint line, uint column) const; void editorDocumentTimerRestarted() override; diff --git a/src/plugins/clangcodemodel/clanghoverhandler.cpp b/src/plugins/clangcodemodel/clanghoverhandler.cpp index da9f974adb..58f414d9f1 100644 --- a/src/plugins/clangcodemodel/clanghoverhandler.cpp +++ b/src/plugins/clangcodemodel/clanghoverhandler.cpp @@ -25,8 +25,9 @@ #include "clanghoverhandler.h" +#include "clangeditordocumentprocessor.h" + #include <coreplugin/helpmanager.h> -#include <cpptools/baseeditordocumentprocessor.h> #include <cpptools/cppmodelmanager.h> #include <cpptools/cpptoolsreuse.h> #include <cpptools/editordocumenthandle.h> @@ -61,32 +62,17 @@ static CppTools::BaseEditorDocumentProcessor *editorDocumentProcessor(TextEditor return nullptr; } -static bool editorDocumentProcessorHasDiagnosticAt(TextEditorWidget *editorWidget, int pos) +static TextMarks diagnosticTextMarksAt(TextEditorWidget *editorWidget, int position) { - if (CppTools::BaseEditorDocumentProcessor *processor = editorDocumentProcessor(editorWidget)) { - int line, column; - if (Utils::Text::convertPosition(editorWidget->document(), pos, &line, &column)) - return processor->hasDiagnosticsAt(line, column); - } + const auto processor = qobject_cast<ClangEditorDocumentProcessor *>( + editorDocumentProcessor(editorWidget)); + QTC_ASSERT(processor, return TextMarks()); - return false; -} + int line, column; + const bool ok = Utils::Text::convertPosition(editorWidget->document(), position, &line, &column); + QTC_ASSERT(ok, return TextMarks()); -static void processWithEditorDocumentProcessor(TextEditorWidget *editorWidget, - const QPoint &point, - int position, - const Core::HelpItem &helpItem) -{ - if (CppTools::BaseEditorDocumentProcessor *processor = editorDocumentProcessor(editorWidget)) { - int line, column; - if (Utils::Text::convertPosition(editorWidget->document(), position, &line, &column)) { - auto layout = new QVBoxLayout; - layout->setContentsMargins(0, 0, 0, 0); - layout->setSpacing(2); - processor->addDiagnosticToolTipToLayout(line, column, layout); - Utils::ToolTip::show(point, layout, editorWidget, qVariantFromValue(helpItem)); - } - } + return processor->diagnosticTextMarksAt(line, column); } static QFuture<CppTools::ToolTipInfo> editorDocumentHandlesToolTipInfo( @@ -189,7 +175,7 @@ void ClangHoverHandler::identifyMatch(TextEditorWidget *editorWidget, m_cursorPosition = -1; // Check for diagnostics (sync) - if (!isContextHelpRequest() && editorDocumentProcessorHasDiagnosticAt(editorWidget, pos)) { + if (!isContextHelpRequest() && !diagnosticTextMarksAt(editorWidget, pos).isEmpty()) { qCDebug(hoverLog) << "Checking for diagnostic at" << pos; setPriority(Priority_Diagnostic); m_cursorPosition = pos; @@ -275,10 +261,8 @@ void ClangHoverHandler::operateTooltip(TextEditor::TextEditorWidget *editorWidge const QPoint &point) { if (priority() == Priority_Diagnostic) { - processWithEditorDocumentProcessor(editorWidget, - point, - m_cursorPosition, - lastHelpItemIdentified()); + const TextMarks textMarks = diagnosticTextMarksAt(editorWidget, m_cursorPosition); + editorWidget->showTextMarksToolTip(point, textMarks); return; } diff --git a/src/plugins/clangcodemodel/clangtextmark.h b/src/plugins/clangcodemodel/clangtextmark.h index 1301cd200b..00cadfb5c8 100644 --- a/src/plugins/clangcodemodel/clangtextmark.h +++ b/src/plugins/clangcodemodel/clangtextmark.h @@ -44,7 +44,9 @@ public: const RemovedFromEditorHandler &removedHandler, bool fullVisualization); + ClangBackEnd::DiagnosticContainer diagnostic() const { return m_diagnostic; } void updateIcon(bool valid = true); + private: bool addToolTipContent(QLayout *target) const override; void removedFromEditor() override; |