diff --git a/src/plugins/bookmarks/bookmark.cpp b/src/plugins/bookmarks/bookmark.cpp
index 8834ccab00b..e24f734ee44 100644
--- a/src/plugins/bookmarks/bookmark.cpp
+++ b/src/plugins/bookmarks/bookmark.cpp
@@ -84,6 +84,8 @@ void Bookmark::updateFileName(const QString &fileName)
void Bookmark::setNote(const QString ¬e)
{
setToolTip(note);
+ setLineAnnotation(note);
+ updateMarker();
}
void Bookmark::updateNote(const QString ¬e)
diff --git a/src/plugins/clangcodemodel/clangtextmark.cpp b/src/plugins/clangcodemodel/clangtextmark.cpp
index c066db538ad..1e53bce06e2 100644
--- a/src/plugins/clangcodemodel/clangtextmark.cpp
+++ b/src/plugins/clangcodemodel/clangtextmark.cpp
@@ -79,6 +79,7 @@ ClangTextMark::ClangTextMark(const QString &fileName,
setPriority(warning ? TextEditor::TextMark::NormalPriority
: TextEditor::TextMark::HighPriority);
setIcon(diagnostic.severity());
+ setLineAnnotation(diagnostic.text().toString());
}
void ClangTextMark::setIcon(ClangBackEnd::DiagnosticSeverity severity)
@@ -96,7 +97,7 @@ void ClangTextMark::setIcon(ClangBackEnd::DiagnosticSeverity severity)
TextMark::setIcon(errorIcon);
}
-bool ClangTextMark::addToolTipContent(QLayout *target)
+bool ClangTextMark::addToolTipContent(QLayout *target) const
{
using Internal::ClangDiagnosticWidget;
diff --git a/src/plugins/clangcodemodel/clangtextmark.h b/src/plugins/clangcodemodel/clangtextmark.h
index 6b504c69143..f1a1b9078ba 100644
--- a/src/plugins/clangcodemodel/clangtextmark.h
+++ b/src/plugins/clangcodemodel/clangtextmark.h
@@ -45,7 +45,7 @@ public:
private:
void setIcon(ClangBackEnd::DiagnosticSeverity severity);
- bool addToolTipContent(QLayout *target) override;
+ bool addToolTipContent(QLayout *target) const override;
void removedFromEditor() override;
private:
diff --git a/src/plugins/qmlprofiler/qmlprofilertextmark.cpp b/src/plugins/qmlprofiler/qmlprofilertextmark.cpp
index a0bdaed6cc1..bbc0bf3fc0b 100644
--- a/src/plugins/qmlprofiler/qmlprofilertextmark.cpp
+++ b/src/plugins/qmlprofiler/qmlprofilertextmark.cpp
@@ -44,7 +44,7 @@ void QmlProfilerTextMark::addTypeId(int typeId)
m_typeIds.append(typeId);
}
-void QmlProfilerTextMark::paint(QPainter *painter, const QRect &paintRect) const
+void QmlProfilerTextMark::paintIcon(QPainter *painter, const QRect &paintRect) const
{
painter->save();
painter->setPen(Qt::black);
@@ -108,7 +108,7 @@ void QmlProfilerTextMarkModel::createMarks(QmlProfilerTool *tool, const QString
}
}
-bool QmlProfilerTextMark::addToolTipContent(QLayout *target)
+bool QmlProfilerTextMark::addToolTipContent(QLayout *target) const
{
QGridLayout *layout = new QGridLayout;
layout->setHorizontalSpacing(10);
diff --git a/src/plugins/qmlprofiler/qmlprofilertextmark.h b/src/plugins/qmlprofiler/qmlprofilertextmark.h
index b3772aea134..894e5fc5178 100644
--- a/src/plugins/qmlprofiler/qmlprofilertextmark.h
+++ b/src/plugins/qmlprofiler/qmlprofilertextmark.h
@@ -37,10 +37,10 @@ public:
QmlProfilerTextMark(QmlProfilerTool *tool, int typeId, const QString &fileName, int lineNumber);
void addTypeId(int typeId);
- void paint(QPainter *painter, const QRect &rect) const override;
+ void paintIcon(QPainter *painter, const QRect &rect) const override;
void clicked() override;
bool isClickable() const override { return true; }
- bool addToolTipContent(QLayout *target) override;
+ bool addToolTipContent(QLayout *target) const override;
private:
QmlProfilerTool *m_tool;
diff --git a/src/plugins/texteditor/displaysettings.cpp b/src/plugins/texteditor/displaysettings.cpp
index d15cf52dcad..196b9434c2f 100644
--- a/src/plugins/texteditor/displaysettings.cpp
+++ b/src/plugins/texteditor/displaysettings.cpp
@@ -44,6 +44,7 @@ static const char displayFileEncodingKey[] = "DisplayFileEncoding";
static const char scrollBarHighlightsKey[] = "ScrollBarHighlights";
static const char animateNavigationWithinFileKey[] = "AnimateNavigationWithinFile";
static const char animateWithinFileTimeMaxKey[] = "AnimateWithinFileTimeMax";
+static const char displayAnnotationsKey[] = "DisplayAnnotations";
static const char groupPostfix[] = "DisplaySettings";
namespace TextEditor {
@@ -69,6 +70,7 @@ void DisplaySettings::toSettings(const QString &category, QSettings *s) const
s->setValue(QLatin1String(displayFileEncodingKey), m_displayFileEncoding);
s->setValue(QLatin1String(scrollBarHighlightsKey), m_scrollBarHighlights);
s->setValue(QLatin1String(animateNavigationWithinFileKey), m_animateNavigationWithinFile);
+ s->setValue(QLatin1String(displayAnnotationsKey), m_displayAnnotations);
s->endGroup();
}
@@ -97,6 +99,7 @@ void DisplaySettings::fromSettings(const QString &category, const QSettings *s)
m_scrollBarHighlights = s->value(group + QLatin1String(scrollBarHighlightsKey), m_scrollBarHighlights).toBool();
m_animateNavigationWithinFile = s->value(group + QLatin1String(animateNavigationWithinFileKey), m_animateNavigationWithinFile).toBool();
m_animateWithinFileTimeMax = s->value(group + QLatin1String(animateWithinFileTimeMaxKey), m_animateWithinFileTimeMax).toInt();
+ m_displayAnnotations = s->value(group + QLatin1String(displayAnnotationsKey), m_displayAnnotations).toBool();
}
bool DisplaySettings::equals(const DisplaySettings &ds) const
@@ -118,6 +121,7 @@ bool DisplaySettings::equals(const DisplaySettings &ds) const
&& m_scrollBarHighlights == ds.m_scrollBarHighlights
&& m_animateNavigationWithinFile == ds.m_animateNavigationWithinFile
&& m_animateWithinFileTimeMax == ds.m_animateWithinFileTimeMax
+ && m_displayAnnotations == ds.m_displayAnnotations
;
}
diff --git a/src/plugins/texteditor/displaysettings.h b/src/plugins/texteditor/displaysettings.h
index fabebd96d8c..a37343bb486 100644
--- a/src/plugins/texteditor/displaysettings.h
+++ b/src/plugins/texteditor/displaysettings.h
@@ -58,6 +58,7 @@ public:
bool m_scrollBarHighlights = true;
bool m_animateNavigationWithinFile = false;
int m_animateWithinFileTimeMax = 333; // read only setting
+ bool m_displayAnnotations = true;
bool equals(const DisplaySettings &ds) const;
};
diff --git a/src/plugins/texteditor/displaysettingspage.cpp b/src/plugins/texteditor/displaysettingspage.cpp
index 147fa970804..7ae27e11d73 100644
--- a/src/plugins/texteditor/displaysettingspage.cpp
+++ b/src/plugins/texteditor/displaysettingspage.cpp
@@ -119,6 +119,7 @@ void DisplaySettingsPage::settingsFromUI(DisplaySettings &displaySettings,
displaySettings.m_displayFileEncoding = d->m_page->displayFileEncoding->isChecked();
displaySettings.m_scrollBarHighlights = d->m_page->scrollBarHighlights->isChecked();
displaySettings.m_animateNavigationWithinFile = d->m_page->animateNavigationWithinFile->isChecked();
+ displaySettings.m_displayAnnotations = d->m_page->displayAnnotations->isChecked();
}
void DisplaySettingsPage::settingsToUI()
@@ -142,6 +143,7 @@ void DisplaySettingsPage::settingsToUI()
d->m_page->displayFileEncoding->setChecked(displaySettings.m_displayFileEncoding);
d->m_page->scrollBarHighlights->setChecked(displaySettings.m_scrollBarHighlights);
d->m_page->animateNavigationWithinFile->setChecked(displaySettings.m_animateNavigationWithinFile);
+ d->m_page->displayAnnotations->setChecked(displaySettings.m_displayAnnotations);
}
const DisplaySettings &DisplaySettingsPage::displaySettings() const
diff --git a/src/plugins/texteditor/displaysettingspage.ui b/src/plugins/texteditor/displaysettingspage.ui
index b91965a192c..1663840272e 100644
--- a/src/plugins/texteditor/displaysettingspage.ui
+++ b/src/plugins/texteditor/displaysettingspage.ui
@@ -80,17 +80,10 @@
Display
- -
-
+
-
+
- Display &folding markers
-
-
-
- -
-
-
- Center &cursor on scroll
+ &Highlight matching parentheses
@@ -101,20 +94,6 @@
- -
-
-
- Auto-fold first &comment
-
-
-
- -
-
-
- &Animate matching parentheses
-
-
-
-
@@ -129,6 +108,20 @@
+ -
+
+
+ Auto-fold first &comment
+
+
+
+ -
+
+
+ &Animate matching parentheses
+
+
+
-
@@ -143,6 +136,13 @@
+ -
+
+
+ Center &cursor on scroll
+
+
+
-
@@ -153,17 +153,17 @@
- -
-
+
-
+
- &Highlight matching parentheses
+ Display &folding markers
- -
-
+
-
+
- Mark &text changes
+ Animate navigation within file
@@ -174,10 +174,17 @@
- -
-
+
-
+
- Animate navigation within file
+ Mark &text changes
+
+
+
+ -
+
+
+ Display annotations behind lines
@@ -197,12 +204,14 @@
centerOnScroll
autoFoldFirstComment
scrollBarHighlights
+ displayAnnotations
highlightCurrentLine
highlightBlocks
animateMatchingParentheses
highlightMatchingParentheses
openLinksInNextSplit
displayFileEncoding
+ animateNavigationWithinFile
diff --git a/src/plugins/texteditor/textdocument.cpp b/src/plugins/texteditor/textdocument.cpp
index f146507e4c0..7c53c812962 100644
--- a/src/plugins/texteditor/textdocument.cpp
+++ b/src/plugins/texteditor/textdocument.cpp
@@ -845,6 +845,13 @@ void TextDocument::modificationChanged(bool modified)
emit changed();
}
+void TextDocument::updateLayout() const
+{
+ auto documentLayout = qobject_cast(d->m_document.documentLayout());
+ QTC_ASSERT(documentLayout, return);
+ documentLayout->requestUpdate();
+}
+
TextMarks TextDocument::marks() const
{
return d->m_marksCache;
@@ -953,6 +960,7 @@ void TextDocument::removeMark(TextMark *mark)
removeMarkFromMarksCache(mark);
mark->setBaseTextDocument(0);
+ updateLayout();
}
void TextDocument::updateMark(TextMark *mark)
@@ -964,9 +972,7 @@ void TextDocument::updateMark(TextMark *mark)
userData->removeMark(mark);
userData->addMark(mark);
}
- auto documentLayout = qobject_cast(d->m_document.documentLayout());
- QTC_ASSERT(documentLayout, return);
- documentLayout->requestUpdate();
+ updateLayout();
}
void TextDocument::moveMark(TextMark *mark, int previousLine)
diff --git a/src/plugins/texteditor/textdocument.h b/src/plugins/texteditor/textdocument.h
index 38719dd8486..63c1f78a421 100644
--- a/src/plugins/texteditor/textdocument.h
+++ b/src/plugins/texteditor/textdocument.h
@@ -154,6 +154,7 @@ private:
void cleanWhitespace(QTextCursor &cursor, bool cleanIndentation, bool inEntireDocument);
void ensureFinalNewLine(QTextCursor &cursor);
void modificationChanged(bool modified);
+ void updateLayout() const;
TextDocumentPrivate *d;
};
diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp
index 6fe57755a80..474e71fb504 100644
--- a/src/plugins/texteditor/texteditor.cpp
+++ b/src/plugins/texteditor/texteditor.cpp
@@ -73,6 +73,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -279,6 +280,7 @@ public:
bool expanded,
bool active,
bool hovered) const;
+ void drawLineAnnotation(QPainter &painter, const QTextBlock &block);
void toggleBlockVisible(const QTextBlock &block);
QRect foldBox();
@@ -297,6 +299,7 @@ public:
bool camelCaseLeft(QTextCursor &cursor, QTextCursor::MoveMode mode);
void processTooltipRequest(const QTextCursor &c);
+ bool processAnnotaionTooltipRequest(const QTextBlock &block, const QPoint &pos) const;
void transformSelection(TransformationMethod method);
void transformBlockSelection(TransformationMethod method);
@@ -384,6 +387,13 @@ public:
bool snippetCheckCursor(const QTextCursor &cursor);
void snippetTabOrBacktab(bool forward);
+ struct AnnotationRect
+ {
+ QRectF rect;
+ const TextMark *mark;
+ };
+ QMap> m_annotationRects;
+
RefactorOverlay *m_refactorOverlay = nullptr;
QString m_contextHelpId;
@@ -3165,6 +3175,42 @@ void TextEditorWidgetPrivate::processTooltipRequest(const QTextCursor &c)
highest->showToolTip(q, toolTipPoint);
}
+bool TextEditorWidgetPrivate::processAnnotaionTooltipRequest(const QTextBlock &block,
+ const QPoint &pos) const
+{
+ TextBlockUserData *blockUserData = TextDocumentLayout::testUserData(block);
+ if (!blockUserData)
+ return false;
+
+ for (const AnnotationRect &annotationRect : m_annotationRects[block.blockNumber()]) {
+ if (annotationRect.rect.contains(pos)) {
+ auto layout = new QGridLayout;
+ layout->setContentsMargins(0, 0, 0, 0);
+ layout->setSpacing(2);
+ annotationRect.mark->addToToolTipLayout(layout);
+ TextMarks marks = blockUserData->marks();
+ if (marks.size() > 1) {
+ QFrame* separator = new QFrame();
+ separator->setFrameShape(QFrame::HLine);
+ layout->addWidget(separator, 2, 0, 1, layout->columnCount());
+ layout->addWidget(new QLabel(tr("Other annotations:")), 3, 0, 1,
+ layout->columnCount());
+
+ Utils::sort(marks, [](const TextMark* mark1, const TextMark* mark2){
+ return mark1->priority() > mark2->priority();
+ });
+ for (const TextMark *mark : Utils::asConst(marks)) {
+ if (mark != annotationRect.mark)
+ mark->addToToolTipLayout(layout);
+ }
+ }
+ ToolTip::show(q->mapToGlobal(pos), layout, q);
+ return true;
+ }
+ }
+ return false;
+}
+
bool TextEditorWidget::viewportEvent(QEvent *event)
{
d->m_contentsChanged = false;
@@ -3192,10 +3238,14 @@ bool TextEditorWidget::viewportEvent(QEvent *event)
QTC_CHECK(line.isValid());
// Only handle tool tip for text cursor if mouse is within the block for the text cursor,
// and not if the mouse is e.g. in the empty space behind a short line.
- if (line.isValid()
- && pos.x() <= blockBoundingGeometry(block).left() + line.naturalTextRect().right()) {
- d->processTooltipRequest(tc);
- return true;
+ if (line.isValid()) {
+ if (pos.x() <= blockBoundingGeometry(block).left() + line.naturalTextRect().right()) {
+ d->processTooltipRequest(tc);
+ return true;
+ } else if (d->processAnnotaionTooltipRequest(block, pos)) {
+ return true;
+ }
+ ToolTip::hide();
}
}
return QPlainTextEdit::viewportEvent(event);
@@ -3632,6 +3682,52 @@ static QTextLayout::FormatRange createBlockCursorCharFormatRange(int pos, const
return o;
}
+void TextEditorWidgetPrivate::drawLineAnnotation(QPainter &painter, const QTextBlock &block)
+{
+ if (!m_displaySettings.m_displayAnnotations)
+ return;
+
+ TextBlockUserData *blockUserData = TextDocumentLayout::testUserData(block);
+ if (!blockUserData)
+ return;
+
+ TextMarks marks = blockUserData->marks();
+ if (marks.isEmpty())
+ return;
+
+ const QTextLayout *layout = block.layout();
+ const int lineCount = layout->lineCount();
+ if (lineCount < 1)
+ return;
+ const QTextLine line = layout->lineAt(lineCount - 1);
+ const QPointF contentOffset = q->contentOffset();
+ const qreal top = q->blockBoundingGeometry(block).translated(contentOffset).top();
+ const QRectF lineRect =
+ line.naturalTextRect().translated(contentOffset.x(), top).adjusted(0, 0, -1, -1);
+
+ Utils::sort(marks, [](const TextMark* mark1, const TextMark* mark2){
+ return mark1->priority() > mark2->priority();
+ });
+
+ constexpr qreal itemOffset = 10;
+ qreal x = lineRect.right() + itemOffset;
+
+ const RefactorMarkers refactorMarkers = m_refactorOverlay->markers();
+ for (auto refactorMark : refactorMarkers) {
+ if (refactorMark.cursor.block() == block)
+ x = qMax(x, refactorMark.rect.right() + itemOffset);
+ }
+
+ for (const TextMark *mark : marks) {
+ QRectF annotationRect(x, lineRect.top(), q->viewport()->width() - x, lineRect.height());
+ if (annotationRect.width() <= 0)
+ break;
+ mark->paintAnnotation(&painter, &annotationRect, q->fontMetrics());
+ x += annotationRect.width() + itemOffset;
+ m_annotationRects[block.blockNumber()].append({annotationRect, mark});
+ }
+}
+
void TextEditorWidget::paintEvent(QPaintEvent *e)
{
// draw backgrond to the right of the wrap column before everything else
@@ -3757,6 +3853,7 @@ void TextEditorWidget::paintEvent(QPaintEvent *e)
int cursor_cpos = 0;
QPen cursor_pen;
+ d->m_annotationRects.clear();
d->m_searchResultOverlay->clear();
if (!d->m_searchExpr.isEmpty()) { // first pass for the search result overlays
@@ -4272,6 +4369,7 @@ void TextEditorWidget::paintEvent(QPaintEvent *e)
painter.restore();
}
}
+ d->drawLineAnnotation(painter, block);
block = nextVisibleBlock;
top = bottom;
@@ -4557,7 +4655,7 @@ void TextEditorWidget::extraAreaPaintEvent(QPaintEvent *e)
const int height = fmLineSpacing - 1;
const int width = int(.5 + height * mark->widthFactor());
const QRect r(xoffset, top, width, height);
- mark->paint(&painter, r);
+ mark->paintIcon(&painter, r);
xoffset += 2;
}
}
@@ -8075,7 +8173,11 @@ IEditor *BaseTextEditor::duplicate()
return 0;
}
-
} // namespace TextEditor
+uint qHash(const QColor &color)
+{
+ return color.rgba();
+}
+
#include "texteditor.moc"
diff --git a/src/plugins/texteditor/texteditor.h b/src/plugins/texteditor/texteditor.h
index 841324891c6..1613de4ed02 100644
--- a/src/plugins/texteditor/texteditor.h
+++ b/src/plugins/texteditor/texteditor.h
@@ -672,4 +672,6 @@ private:
} // namespace TextEditor
+uint qHash(const QColor &color);
+
Q_DECLARE_METATYPE(TextEditor::TextEditorWidget::Link)
diff --git a/src/plugins/texteditor/textmark.cpp b/src/plugins/texteditor/textmark.cpp
index 975cc7a41c5..15939a3f44d 100644
--- a/src/plugins/texteditor/textmark.cpp
+++ b/src/plugins/texteditor/textmark.cpp
@@ -33,6 +33,7 @@
#include
#include
+#include
using namespace Core;
using namespace Utils;
@@ -57,6 +58,24 @@ private:
QHash > m_marks;
};
+class AnnotationColors
+{
+public:
+ static AnnotationColors &getAnnotationColors(const QColor &markColor,
+ const QColor &backgroundColor);
+
+public:
+ using SourceColors = QPair;
+ QColor rectColor;
+ QColor textColor;
+
+private:
+ static double clipHsl(double value);
+
+private:
+ static QHash m_colorCache;
+};
+
TextMarkRegistry *m_instance = nullptr;
TextMark::TextMark(const QString &fileName, int lineNumber, Id category, double widthFactor)
@@ -99,11 +118,49 @@ int TextMark::lineNumber() const
return m_lineNumber;
}
-void TextMark::paint(QPainter *painter, const QRect &rect) const
+void TextMark::paintIcon(QPainter *painter, const QRect &rect) const
{
m_icon.paint(painter, rect, Qt::AlignCenter);
}
+void TextMark::paintAnnotation(QPainter *painter,
+ QRectF *annotationRect,
+ const QFontMetrics &fm) const
+{
+ QString text = lineAnnotation();
+ if (text.isEmpty())
+ return;
+
+ const bool drawIcon = !m_icon.isNull();
+ int textWidth = fm.width(text);
+ constexpr qreal margin = 1;
+ const qreal iconHeight = annotationRect->height() - 2 * margin;
+ const qreal iconWidth = iconHeight * m_widthFactor + 2 * margin;
+ qreal annotationWidth = (drawIcon ? textWidth + iconWidth : textWidth) + margin;
+ if (annotationRect->left() + annotationWidth > annotationRect->right()) {
+ textWidth = int(annotationRect->width() - (drawIcon ? iconWidth + margin : margin));
+ text = fm.elidedText(text, Qt::ElideRight, textWidth);
+ annotationWidth = annotationRect->width();
+ }
+ const QColor markColor = m_hasColor ? Utils::creatorTheme()->color(m_color).toHsl()
+ : painter->pen().color();
+ const AnnotationColors &colors =
+ AnnotationColors::getAnnotationColors(markColor, painter->background().color());
+
+ painter->save();
+ annotationRect->setWidth(annotationWidth);
+ painter->setPen(colors.rectColor);
+ painter->setBrush(colors.rectColor);
+ painter->drawRect(*annotationRect);
+ painter->setPen(colors.textColor);
+ if (drawIcon) {
+ paintIcon(painter, annotationRect->adjusted(
+ margin, margin, -(textWidth + 2 * margin), -margin).toAlignedRect());
+ }
+ painter->drawText(annotationRect->adjusted(iconWidth, 0, 0, 0), Qt::AlignLeft, text);
+ painter->restore();
+}
+
void TextMark::updateLineNumber(int lineNumber)
{
m_lineNumber = lineNumber;
@@ -176,7 +233,7 @@ void TextMark::dragToLine(int lineNumber)
Q_UNUSED(lineNumber);
}
-void TextMark::addToToolTipLayout(QGridLayout *target)
+void TextMark::addToToolTipLayout(QGridLayout *target) const
{
auto *contentLayout = new QVBoxLayout;
addToolTipContent(contentLayout);
@@ -191,7 +248,7 @@ void TextMark::addToToolTipLayout(QGridLayout *target)
}
}
-bool TextMark::addToolTipContent(QLayout *target)
+bool TextMark::addToolTipContent(QLayout *target) const
{
QString text = m_toolTip;
if (text.isEmpty()) {
@@ -304,6 +361,33 @@ void TextMarkRegistry::allDocumentsRenamed(const QString &oldName, const QString
mark->updateFileName(newName);
}
+QHash AnnotationColors::m_colorCache;
+
+AnnotationColors &AnnotationColors::getAnnotationColors(const QColor &markColor,
+ const QColor &backgroundColor)
+{
+ AnnotationColors &colors = m_colorCache[{markColor, backgroundColor}];
+ if (!colors.rectColor.isValid() || !colors.textColor.isValid()) {
+ const double backgroundSaturation = clipHsl(markColor.hslSaturationF() / 2);
+ const double backgroundLightness = clipHsl(backgroundColor.lightnessF());
+ const double foregroundLightness = clipHsl(backgroundLightness > 0.5
+ ? backgroundLightness - 0.5
+ : backgroundLightness + 0.5);
+ colors.rectColor.setHslF(markColor.hslHueF(),
+ backgroundSaturation,
+ backgroundLightness);
+ colors.textColor.setHslF(markColor.hslHueF(),
+ markColor.hslSaturationF(),
+ foregroundLightness);
+ }
+ return colors;
+}
+
+double AnnotationColors::clipHsl(double value)
+{
+ return std::max(0.15, std::min(0.85, value));
+}
+
} // namespace TextEditor
#include "textmark.moc"
diff --git a/src/plugins/texteditor/textmark.h b/src/plugins/texteditor/textmark.h
index 162ac2f7943..89d3d96e023 100644
--- a/src/plugins/texteditor/textmark.h
+++ b/src/plugins/texteditor/textmark.h
@@ -63,7 +63,8 @@ public:
QString fileName() const;
int lineNumber() const;
- virtual void paint(QPainter *painter, const QRect &rect) const;
+ virtual void paintIcon(QPainter *painter, const QRect &rect) const;
+ virtual void paintAnnotation(QPainter *painter, QRectF *annotationRect, const QFontMetrics &fm) const;
/// called if the filename of the document changed
virtual void updateFileName(const QString &fileName);
virtual void updateLineNumber(int lineNumber);
@@ -74,8 +75,8 @@ public:
virtual void clicked();
virtual bool isDraggable() const;
virtual void dragToLine(int lineNumber);
- void addToToolTipLayout(QGridLayout *target);
- virtual bool addToolTipContent(QLayout *target);
+ void addToToolTipLayout(QGridLayout *target) const;
+ virtual bool addToolTipContent(QLayout *target) const;
void setIcon(const QIcon &icon) { m_icon = icon; }
const QIcon &icon() const { return m_icon; }
@@ -99,6 +100,9 @@ public:
TextDocument *baseTextDocument() const { return m_baseTextDocument; }
void setBaseTextDocument(TextDocument *baseTextDocument) { m_baseTextDocument = baseTextDocument; }
+ QString lineAnnotation() const { return m_lineAnnotation; }
+ void setLineAnnotation(const QString &lineAnnotation) { m_lineAnnotation = lineAnnotation; }
+
QString toolTip() const { return m_toolTip; }
void setToolTip(const QString &toolTip) { m_toolTip = toolTip; }
@@ -115,6 +119,7 @@ private:
bool m_hasColor = false;
Core::Id m_category;
double m_widthFactor = 1.0;
+ QString m_lineAnnotation;
QString m_toolTip;
QString m_defaultToolTip;
};
diff --git a/src/plugins/valgrind/callgrindtextmark.cpp b/src/plugins/valgrind/callgrindtextmark.cpp
index cfd19c7a0ce..e08d42f0400 100644
--- a/src/plugins/valgrind/callgrindtextmark.cpp
+++ b/src/plugins/valgrind/callgrindtextmark.cpp
@@ -48,7 +48,7 @@ CallgrindTextMark::CallgrindTextMark(const QPersistentModelIndex &index,
setPriority(TextEditor::TextMark::HighPriority);
}
-void CallgrindTextMark::paint(QPainter *painter, const QRect &paintRect) const
+void CallgrindTextMark::paintIcon(QPainter *painter, const QRect &paintRect) const
{
if (!m_modelIndex.isValid())
return;
diff --git a/src/plugins/valgrind/callgrindtextmark.h b/src/plugins/valgrind/callgrindtextmark.h
index f5f1699a257..828dc7f5bd6 100644
--- a/src/plugins/valgrind/callgrindtextmark.h
+++ b/src/plugins/valgrind/callgrindtextmark.h
@@ -49,7 +49,7 @@ public:
const Valgrind::Callgrind::Function *function() const;
- virtual void paint(QPainter *painter, const QRect &paintRect) const;
+ virtual void paintIcon(QPainter *painter, const QRect &paintRect) const;
private:
QPersistentModelIndex m_modelIndex;