diff options
author | David Faure <david.faure@kdab.com> | 2022-04-29 16:35:34 +0200 |
---|---|---|
committer | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2022-05-19 12:26:57 +0000 |
commit | 1e938c348b936328fafbcaae4c0c7d91003143e5 (patch) | |
tree | fa3460f26601a1c790bb21c93d4274e524eeca3c /src/gui | |
parent | e5a5c099afb315e6e35483c60e5bfa6d9ce9f775 (diff) |
QTextDocument: add setLayoutEnabled()
This allows to set up everything first - without paying for layouting
at every step - and only then trigger layouting.
Same performance behavior as setTextWidth(0), but this is a more
explicit/readable API.
Change-Id: I044dbd8b1301b1c97a92f9a29ccde2baf27a7665
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/text/qtextdocument.cpp | 35 | ||||
-rw-r--r-- | src/gui/text/qtextdocument.h | 4 | ||||
-rw-r--r-- | src/gui/text/qtextdocument_p.h | 3 |
3 files changed, 41 insertions, 1 deletions
diff --git a/src/gui/text/qtextdocument.cpp b/src/gui/text/qtextdocument.cpp index c01c858cc5..96ed8b167e 100644 --- a/src/gui/text/qtextdocument.cpp +++ b/src/gui/text/qtextdocument.cpp @@ -634,6 +634,41 @@ bool QTextDocument::useDesignMetrics() const return d->defaultTextOption.useDesignMetrics(); } + +/*! + \property QTextDocument::layoutEnabled + \since 6.4 + \brief whether QTextDocument should recalculate the layout after every change + + If this property is set to true, any change triggers a laying out of the + document, which makes everything work as expected, but takes time. + + Temporarily disabling the layout process can save time when making multiple changes + (not just text content, but also default font, default text option....) + so that the document is only laid out once in the end. This can be useful when the + text width or page size isn't yet known, for instance. + + By default, this property is \c true. + + \sa setTextWidth +*/ + +void QTextDocument::setLayoutEnabled(bool b) +{ + Q_D(QTextDocument); + if (d->layoutEnabled == b) + return; + d->layoutEnabled = b; + if (b && d->lout) + d->lout->documentChanged(0, 0, d->length()); +} + +bool QTextDocument::isLayoutEnabled() const +{ + Q_D(const QTextDocument); + return d->layoutEnabled; +} + /*! \since 4.2 diff --git a/src/gui/text/qtextdocument.h b/src/gui/text/qtextdocument.h index ba33e410d1..01ed9789ed 100644 --- a/src/gui/text/qtextdocument.h +++ b/src/gui/text/qtextdocument.h @@ -62,6 +62,7 @@ class Q_GUI_EXPORT QTextDocument : public QObject Q_PROPERTY(QSizeF pageSize READ pageSize WRITE setPageSize) Q_PROPERTY(QFont defaultFont READ defaultFont WRITE setDefaultFont) Q_PROPERTY(bool useDesignMetrics READ useDesignMetrics WRITE setUseDesignMetrics) + Q_PROPERTY(bool layoutEnabled READ isLayoutEnabled WRITE setLayoutEnabled) Q_PROPERTY(QSizeF size READ size) Q_PROPERTY(qreal textWidth READ textWidth WRITE setTextWidth) Q_PROPERTY(int blockCount READ blockCount) @@ -218,6 +219,9 @@ public: void setUseDesignMetrics(bool b); bool useDesignMetrics() const; + void setLayoutEnabled(bool b); + bool isLayoutEnabled() const; + void drawContents(QPainter *painter, const QRectF &rect = QRectF()); void setTextWidth(qreal width); diff --git a/src/gui/text/qtextdocument_p.h b/src/gui/text/qtextdocument_p.h index 3769d07eb7..8601be54d0 100644 --- a/src/gui/text/qtextdocument_p.h +++ b/src/gui/text/qtextdocument_p.h @@ -294,7 +294,7 @@ public: // Only test the width for 0: // * setTextWidth(x) leads to height -1, which is valid // * the default page size of (-1, -1) means size determined from contents, this is valid too - bool canLayout() const { return !qIsNull(pageSize.width()); } + bool canLayout() const { return layoutEnabled && !qIsNull(pageSize.width()); } private: QTextDocumentPrivate(const QTextDocumentPrivate& m); @@ -342,6 +342,7 @@ private: public: bool inContentsChange; + bool layoutEnabled = true; QTextOption defaultTextOption; Qt::CursorMoveStyle defaultCursorMoveStyle; #ifndef QT_NO_CSSPARSER |