aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/items/qquicktext.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/quick/items/qquicktext.cpp')
-rw-r--r--src/quick/items/qquicktext.cpp32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/quick/items/qquicktext.cpp b/src/quick/items/qquicktext.cpp
index a18ab824e2..379fef7722 100644
--- a/src/quick/items/qquicktext.cpp
+++ b/src/quick/items/qquicktext.cpp
@@ -2873,6 +2873,38 @@ bool QQuickTextPrivate::isLinkHoveredConnected()
IS_SIGNAL_CONNECTED(q, QQuickText, linkHovered, (const QString &));
}
+static void getLinks_helper(const QTextLayout *layout, QVector<QQuickTextPrivate::LinkDesc> *links)
+{
+ for (const QTextLayout::FormatRange &formatRange : layout->formats()) {
+ if (formatRange.format.isAnchor()) {
+ const int start = formatRange.start;
+ const int len = formatRange.length;
+ QTextLine line = layout->lineForTextPosition(start);
+ QRectF r;
+ r.setTop(line.y());
+ r.setLeft(line.cursorToX(start, QTextLine::Leading));
+ r.setHeight(line.height());
+ r.setRight(line.cursorToX(start + len, QTextLine::Trailing));
+ // ### anchorNames() is empty?! Not sure why this doesn't work
+ // QString anchorName = formatRange.format.anchorNames().value(0); //### pick the first?
+ // Therefore, we resort to QString::mid()
+ QString anchorName = layout->text().mid(start, len);
+ const QString anchorHref = formatRange.format.anchorHref();
+ if (anchorName.isEmpty())
+ anchorName = anchorHref;
+ links->append( { anchorName, anchorHref, start, start + len, r.toRect()} );
+ }
+ }
+}
+
+QVector<QQuickTextPrivate::LinkDesc> QQuickTextPrivate::getLinks() const
+{
+ QVector<QQuickTextPrivate::LinkDesc> links;
+ getLinks_helper(&layout, &links);
+ return links;
+}
+
+
/*!
\qmlsignal QtQuick::Text::linkHovered(string link)
\since 5.2