1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QQUICKTEXT_P_P_H
5#define QQUICKTEXT_P_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include "qquicktext_p.h"
19#include "qquickimplicitsizeitem_p_p.h"
20
21#include <QtQml/qqml.h>
22#include <QtGui/qabstracttextdocumentlayout.h>
23#include <QtGui/qtextlayout.h>
24#include <private/qquickstyledtext_p.h>
25#include <private/qlazilyallocated_p.h>
26#include <private/qquicktextdocument_p.h>
27
28QT_BEGIN_NAMESPACE
29
30class QTextLayout;
31
32class Q_QUICK_EXPORT QQuickTextPrivate : public QQuickImplicitSizeItemPrivate
33{
34 Q_DECLARE_PUBLIC(QQuickText)
35public:
36 QQuickTextPrivate();
37 ~QQuickTextPrivate();
38 void init();
39
40 void updateBaseline(qreal baseline, qreal dy);
41 void updateSize();
42 void signalSizeChange(const QSizeF &previousSize);
43 void updateLayout();
44 bool determineHorizontalAlignment();
45 bool setHAlign(QQuickText::HAlignment, bool forceAlign = false);
46 void mirrorChange() override;
47 bool isLineLaidOutConnected();
48 void setLineGeometry(QTextLine &line, qreal lineWidth, qreal &height);
49
50 int lineHeightOffset() const;
51 QString elidedText(qreal lineWidth, const QTextLine &line, const QTextLine *nextLine = nullptr) const;
52 void elideFormats(int start, int length, int offset, QVector<QTextLayout::FormatRange> *elidedFormats);
53 void clearFormats();
54
55 void processHoverEvent(QHoverEvent *event);
56 bool transformChanged(QQuickItem *transformedItem) override;
57
58 QRectF layedOutTextRect;
59 QSizeF advance;
60
61 struct ExtraData {
62 ExtraData();
63
64 qreal padding;
65 qreal topPadding;
66 qreal leftPadding;
67 qreal rightPadding;
68 qreal bottomPadding;
69 bool explicitTopPadding : 1;
70 bool explicitLeftPadding : 1;
71 bool explicitRightPadding : 1;
72 bool explicitBottomPadding : 1;
73 qreal lineHeight;
74 QTextDocument *doc;
75 QQuickTextImageHandler *imageHandler = nullptr;
76 QString activeLink;
77 QString hoveredLink;
78 int minimumPixelSize;
79 int minimumPointSize;
80 int maximumLineCount;
81 int renderTypeQuality;
82 bool lineHeightValid : 1;
83 QQuickText::LineHeightMode lineHeightMode;
84 QQuickText::FontSizeMode fontSizeMode;
85 QList<QQuickStyledTextImgTag*> imgTags;
86 QList<QQuickStyledTextImgTag*> visibleImgTags;
87 QList<QQuickPixmap *> pixmapsInProgress;
88 QUrl baseUrl;
89 };
90 QLazilyAllocated<ExtraData> extra;
91
92 QString text;
93 QFont font;
94 QFont sourceFont;
95 QFontInfo fontInfo;
96
97 QTextLayout layout;
98 QScopedPointer<QTextLayout> elideLayout;
99 QScopedPointer<QQuickTextLine> textLine;
100
101 qreal lineWidth;
102
103 QRgb color;
104 QRgb linkColor;
105 QRgb styleColor;
106
107 int lineCount;
108 int multilengthEos;
109
110 enum UpdateType {
111 UpdateNone,
112 UpdatePreprocess,
113 UpdatePaintNode
114 };
115
116 QQuickText::TextElideMode elideMode;
117 QQuickText::HAlignment hAlign;
118 QQuickText::VAlignment vAlign;
119 QQuickText::TextFormat format;
120 QQuickText::WrapMode wrapMode;
121 QQuickText::TextStyle style;
122 QQuickText::RenderType renderType;
123 UpdateType updateType;
124
125 QString assignedFont;
126
127 bool maximumLineCountValid:1;
128 bool updateOnComponentComplete:1;
129 bool richText:1;
130 bool styledText:1;
131 bool markdownText:1;
132 bool widthExceeded:1;
133 bool heightExceeded:1;
134 bool internalWidthUpdate:1;
135 bool requireImplicitSize:1;
136 bool implicitWidthValid:1;
137 bool implicitHeightValid:1;
138 bool truncated:1;
139 bool hAlignImplicit:1;
140 bool rightToLeftText:1;
141 bool layoutTextElided:1;
142 bool textHasChanged:1;
143 bool needToUpdateLayout:1;
144 bool formatModifiesFontSize:1;
145 bool polishSize:1; // Workaround for problem with polish called after updateSize (QTBUG-42636)
146 bool updateSizeRecursionGuard:1;
147 bool containsUnscalableGlyphs:1;
148
149 static const QChar elideChar;
150 static const int largeTextSizeThreshold;
151
152 qreal getImplicitWidth() const override;
153 qreal getImplicitHeight() const override;
154
155 qreal availableWidth() const;
156 qreal availableHeight() const;
157
158 inline qreal padding() const { return extra.isAllocated() ? extra->padding : 0.0; }
159 void setTopPadding(qreal value, bool reset = false);
160 void setLeftPadding(qreal value, bool reset = false);
161 void setRightPadding(qreal value, bool reset = false);
162 void setBottomPadding(qreal value, bool reset = false);
163
164 void ensureDoc();
165 void updateDocumentText();
166
167 qreal devicePixelRatio() const;
168
169 QRectF setupTextLayout(qreal * const baseline);
170 void setupCustomLineGeometry(QTextLine &line, qreal &height, int fullLayoutTextLength, int lineOffset = 0);
171 bool isLinkActivatedConnected();
172 bool isLinkHoveredConnected();
173 QStringList links() const;
174
175 struct LinkDesc {
176 QString m_anchor;
177 QString m_anchorTarget;
178 int m_startIndex;
179 int m_endIndex;
180 QRect rect;
181 };
182
183 QVector<LinkDesc> getLinks() const;
184
185 static QString anchorAt(const QTextLayout *layout, const QPointF &mousePos);
186 QString anchorAt(const QPointF &pos) const;
187
188 inline qreal lineHeight() const { return extra.isAllocated() ? extra->lineHeight : 1.0; }
189 inline int maximumLineCount() const { return extra.isAllocated() ? extra->maximumLineCount : INT_MAX; }
190 inline int renderTypeQuality() const { return extra.isAllocated() ? extra->renderTypeQuality : QQuickText::DefaultRenderTypeQuality; }
191 inline QQuickText::LineHeightMode lineHeightMode() const { return extra.isAllocated() ? extra->lineHeightMode : QQuickText::ProportionalHeight; }
192 inline QQuickText::FontSizeMode fontSizeMode() const { return extra.isAllocated() ? extra->fontSizeMode : QQuickText::FixedSize; }
193 inline int minimumPixelSize() const { return extra.isAllocated() ? extra->minimumPixelSize : 12; }
194 inline int minimumPointSize() const { return extra.isAllocated() ? extra->minimumPointSize : 12; }
195 static inline QQuickTextPrivate *get(QQuickText *t) { return t->d_func(); }
196};
197
198QT_END_NAMESPACE
199
200#endif // QQUICKTEXT_P_P_H
201

Provided by KDAB

Privacy Policy
Learn Advanced QML with KDAB
Find out more

source code of qtdeclarative/src/quick/items/qquicktext_p_p.h