From 2e1609f3e399ac6be91266a27e7e436ab07ae3df Mon Sep 17 00:00:00 2001 From: Konstantin Ritt Date: Thu, 30 Jan 2014 01:59:00 +0200 Subject: [PATCH] Introduce QTextBlock::textFormats() A convenient way to obtain the block format ranges that should be applied to the block text. Change-Id: I220429b7c9c592c4880357c0d7b1b21f6c1c11f3 Reviewed-by: Lars Knoll --- src/gui/text/qtextobject.cpp | 50 ++++++++++++++++++++++++++++++++++++ src/gui/text/qtextobject.h | 4 ++- 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/src/gui/text/qtextobject.cpp b/src/gui/text/qtextobject.cpp index d1a39c6ab6..bd1e970583 100644 --- a/src/gui/text/qtextobject.cpp +++ b/src/gui/text/qtextobject.cpp @@ -1233,6 +1233,56 @@ QString QTextBlock::text() const return text; } +/*! + \since 5.3 + + Returns the block's text format options as a list of continuous ranges + of QTextCharFormat. The range's character format is used when inserting text + within the range boundaries. + + \sa charFormat(), blockFormat() +*/ +QList QTextBlock::textFormats() const +{ + QList formats; + if (!p || !n) + return formats; + + const QTextFormatCollection *formatCollection = p->formatCollection(); + + int start = 0; + int cur = start; + int format = -1; + + const int pos = position(); + QTextDocumentPrivate::FragmentIterator it = p->find(pos); + QTextDocumentPrivate::FragmentIterator end = p->find(pos + length() - 1); // -1 to omit the block separator char + for (; it != end; ++it) { + const QTextFragmentData * const frag = it.value(); + if (format != it.value()->format) { + if (cur - start > 0) { + QTextLayout::FormatRange range; + range.start = start; + range.length = cur - start; + range.format = formatCollection->charFormat(format); + formats.append(range); + } + + format = frag->format; + start = cur; + } + cur += frag->size_array[0]; + } + if (cur - start > 0) { + QTextLayout::FormatRange range; + range.start = start; + range.length = cur - start; + range.format = formatCollection->charFormat(format); + formats.append(range); + } + + return formats; +} /*! Returns the text document this text block belongs to, or 0 if the diff --git a/src/gui/text/qtextobject.h b/src/gui/text/qtextobject.h index 87f2cf6197..6a127f0315 100644 --- a/src/gui/text/qtextobject.h +++ b/src/gui/text/qtextobject.h @@ -44,6 +44,7 @@ #include #include +#include #include QT_BEGIN_NAMESPACE @@ -55,7 +56,6 @@ class QTextDocumentPrivate; class QTextCursor; class QTextBlock; class QTextFragment; -class QTextLayout; class QTextList; class Q_GUI_EXPORT QTextObject : public QObject @@ -223,6 +223,8 @@ public: QString text() const; + QList textFormats() const; + const QTextDocument *document() const; QTextList *textList() const;