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 QQUICKSHAPE_P_H |
5 | #define QQUICKSHAPE_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 <QtQuickShapes/private/qquickshapesglobal_p.h> |
19 | #include <QtQuick/qquickitem.h> |
20 | |
21 | #include <private/qtquickglobal_p.h> |
22 | #include <private/qquickpath_p_p.h> |
23 | #include <private/qquickrectangle_p.h> |
24 | |
25 | QT_BEGIN_NAMESPACE |
26 | |
27 | class QQuickShapePathPrivate; |
28 | class QQuickShapePrivate; |
29 | |
30 | void Q_QUICKSHAPES_EXPORT QQuickShapes_initializeModule(); |
31 | |
32 | class Q_QUICKSHAPES_EXPORT QQuickShapesModule |
33 | { |
34 | public: |
35 | static void defineModule(); |
36 | }; |
37 | |
38 | class Q_QUICKSHAPES_EXPORT QQuickShapeGradient : public QQuickGradient |
39 | { |
40 | Q_OBJECT |
41 | Q_PROPERTY(SpreadMode spread READ spread WRITE setSpread NOTIFY spreadChanged) |
42 | Q_CLASSINFO("DefaultProperty" , "stops" ) |
43 | |
44 | QML_NAMED_ELEMENT(ShapeGradient) |
45 | QML_ADDED_IN_VERSION(1, 0) |
46 | QML_UNCREATABLE("ShapeGradient is an abstract base class." ); |
47 | |
48 | public: |
49 | enum SpreadMode { |
50 | PadSpread, |
51 | ReflectSpread, |
52 | RepeatSpread |
53 | }; |
54 | Q_ENUM(SpreadMode) |
55 | |
56 | QQuickShapeGradient(QObject *parent = nullptr); |
57 | |
58 | SpreadMode spread() const; |
59 | void setSpread(SpreadMode mode); |
60 | |
61 | Q_SIGNALS: |
62 | void spreadChanged(); |
63 | |
64 | private: |
65 | SpreadMode m_spread; |
66 | }; |
67 | |
68 | class Q_QUICKSHAPES_EXPORT QQuickShapeLinearGradient : public QQuickShapeGradient |
69 | { |
70 | Q_OBJECT |
71 | Q_PROPERTY(qreal x1 READ x1 WRITE setX1 NOTIFY x1Changed) |
72 | Q_PROPERTY(qreal y1 READ y1 WRITE setY1 NOTIFY y1Changed) |
73 | Q_PROPERTY(qreal x2 READ x2 WRITE setX2 NOTIFY x2Changed) |
74 | Q_PROPERTY(qreal y2 READ y2 WRITE setY2 NOTIFY y2Changed) |
75 | Q_CLASSINFO("DefaultProperty" , "stops" ) |
76 | QML_NAMED_ELEMENT(LinearGradient) |
77 | QML_ADDED_IN_VERSION(1, 0) |
78 | |
79 | public: |
80 | QQuickShapeLinearGradient(QObject *parent = nullptr); |
81 | |
82 | qreal x1() const; |
83 | void setX1(qreal v); |
84 | qreal y1() const; |
85 | void setY1(qreal v); |
86 | qreal x2() const; |
87 | void setX2(qreal v); |
88 | qreal y2() const; |
89 | void setY2(qreal v); |
90 | |
91 | Q_SIGNALS: |
92 | void x1Changed(); |
93 | void y1Changed(); |
94 | void x2Changed(); |
95 | void y2Changed(); |
96 | |
97 | private: |
98 | QPointF m_start; |
99 | QPointF m_end; |
100 | }; |
101 | |
102 | class Q_QUICKSHAPES_EXPORT QQuickShapeRadialGradient : public QQuickShapeGradient |
103 | { |
104 | Q_OBJECT |
105 | Q_PROPERTY(qreal centerX READ centerX WRITE setCenterX NOTIFY centerXChanged) |
106 | Q_PROPERTY(qreal centerY READ centerY WRITE setCenterY NOTIFY centerYChanged) |
107 | Q_PROPERTY(qreal centerRadius READ centerRadius WRITE setCenterRadius NOTIFY centerRadiusChanged) |
108 | Q_PROPERTY(qreal focalX READ focalX WRITE setFocalX NOTIFY focalXChanged) |
109 | Q_PROPERTY(qreal focalY READ focalY WRITE setFocalY NOTIFY focalYChanged) |
110 | Q_PROPERTY(qreal focalRadius READ focalRadius WRITE setFocalRadius NOTIFY focalRadiusChanged) |
111 | Q_CLASSINFO("DefaultProperty" , "stops" ) |
112 | QML_NAMED_ELEMENT(RadialGradient) |
113 | QML_ADDED_IN_VERSION(1, 0) |
114 | |
115 | public: |
116 | QQuickShapeRadialGradient(QObject *parent = nullptr); |
117 | |
118 | qreal centerX() const; |
119 | void setCenterX(qreal v); |
120 | |
121 | qreal centerY() const; |
122 | void setCenterY(qreal v); |
123 | |
124 | qreal centerRadius() const; |
125 | void setCenterRadius(qreal v); |
126 | |
127 | qreal focalX() const; |
128 | void setFocalX(qreal v); |
129 | |
130 | qreal focalY() const; |
131 | void setFocalY(qreal v); |
132 | |
133 | qreal focalRadius() const; |
134 | void setFocalRadius(qreal v); |
135 | |
136 | Q_SIGNALS: |
137 | void centerXChanged(); |
138 | void centerYChanged(); |
139 | void focalXChanged(); |
140 | void focalYChanged(); |
141 | void centerRadiusChanged(); |
142 | void focalRadiusChanged(); |
143 | |
144 | private: |
145 | QPointF m_centerPoint; |
146 | QPointF m_focalPoint; |
147 | qreal m_centerRadius = 0; |
148 | qreal m_focalRadius = 0; |
149 | }; |
150 | |
151 | class Q_QUICKSHAPES_EXPORT QQuickShapeConicalGradient : public QQuickShapeGradient |
152 | { |
153 | Q_OBJECT |
154 | Q_PROPERTY(qreal centerX READ centerX WRITE setCenterX NOTIFY centerXChanged) |
155 | Q_PROPERTY(qreal centerY READ centerY WRITE setCenterY NOTIFY centerYChanged) |
156 | Q_PROPERTY(qreal angle READ angle WRITE setAngle NOTIFY angleChanged) |
157 | Q_CLASSINFO("DefaultProperty" , "stops" ) |
158 | QML_NAMED_ELEMENT(ConicalGradient) |
159 | QML_ADDED_IN_VERSION(1, 0) |
160 | |
161 | public: |
162 | QQuickShapeConicalGradient(QObject *parent = nullptr); |
163 | |
164 | qreal centerX() const; |
165 | void setCenterX(qreal v); |
166 | |
167 | qreal centerY() const; |
168 | void setCenterY(qreal v); |
169 | |
170 | qreal angle() const; |
171 | void setAngle(qreal v); |
172 | |
173 | Q_SIGNALS: |
174 | void centerXChanged(); |
175 | void centerYChanged(); |
176 | void angleChanged(); |
177 | |
178 | private: |
179 | QPointF m_centerPoint; |
180 | qreal m_angle = 0; |
181 | }; |
182 | |
183 | class Q_QUICKSHAPES_EXPORT QQuickShapePath : public QQuickPath |
184 | { |
185 | Q_OBJECT |
186 | |
187 | Q_PROPERTY(QColor strokeColor READ strokeColor WRITE setStrokeColor NOTIFY strokeColorChanged) |
188 | Q_PROPERTY(qreal strokeWidth READ strokeWidth WRITE setStrokeWidth NOTIFY strokeWidthChanged) |
189 | Q_PROPERTY(QColor fillColor READ fillColor WRITE setFillColor NOTIFY fillColorChanged) |
190 | Q_PROPERTY(FillRule fillRule READ fillRule WRITE setFillRule NOTIFY fillRuleChanged) |
191 | Q_PROPERTY(JoinStyle joinStyle READ joinStyle WRITE setJoinStyle NOTIFY joinStyleChanged) |
192 | Q_PROPERTY(int miterLimit READ miterLimit WRITE setMiterLimit NOTIFY miterLimitChanged) |
193 | Q_PROPERTY(CapStyle capStyle READ capStyle WRITE setCapStyle NOTIFY capStyleChanged) |
194 | Q_PROPERTY(StrokeStyle strokeStyle READ strokeStyle WRITE setStrokeStyle NOTIFY strokeStyleChanged) |
195 | Q_PROPERTY(qreal dashOffset READ dashOffset WRITE setDashOffset NOTIFY dashOffsetChanged) |
196 | Q_PROPERTY(QVector<qreal> dashPattern READ dashPattern WRITE setDashPattern NOTIFY dashPatternChanged) |
197 | Q_PROPERTY(QQuickShapeGradient *fillGradient READ fillGradient WRITE setFillGradient RESET resetFillGradient) |
198 | Q_PROPERTY(QSizeF scale READ scale WRITE setScale NOTIFY scaleChanged REVISION(1, 14)) |
199 | Q_PROPERTY(PathHints pathHints READ pathHints WRITE setPathHints NOTIFY pathHintsChanged REVISION(6, 7) FINAL) |
200 | Q_PROPERTY(QMatrix4x4 fillTransform READ fillTransform WRITE setFillTransform NOTIFY fillTransformChanged REVISION(6, 8) FINAL) |
201 | Q_PROPERTY(QQuickItem *fillItem READ fillItem WRITE setFillItem NOTIFY fillItemChanged REVISION(6, 8) FINAL) |
202 | QML_NAMED_ELEMENT(ShapePath) |
203 | QML_ADDED_IN_VERSION(1, 0) |
204 | |
205 | public: |
206 | enum FillRule { |
207 | OddEvenFill = Qt::OddEvenFill, |
208 | WindingFill = Qt::WindingFill |
209 | }; |
210 | Q_ENUM(FillRule) |
211 | |
212 | enum JoinStyle { |
213 | MiterJoin = Qt::MiterJoin, |
214 | BevelJoin = Qt::BevelJoin, |
215 | RoundJoin = Qt::RoundJoin |
216 | }; |
217 | Q_ENUM(JoinStyle) |
218 | |
219 | enum CapStyle { |
220 | FlatCap = Qt::FlatCap, |
221 | SquareCap = Qt::SquareCap, |
222 | RoundCap = Qt::RoundCap |
223 | }; |
224 | Q_ENUM(CapStyle) |
225 | |
226 | enum StrokeStyle { |
227 | SolidLine = Qt::SolidLine, |
228 | DashLine = Qt::DashLine |
229 | }; |
230 | Q_ENUM(StrokeStyle) |
231 | |
232 | enum PathHint { |
233 | PathLinear = 0x1, |
234 | PathQuadratic = 0x2, |
235 | PathConvex = 0x4, |
236 | PathFillOnRight = 0x8, |
237 | PathSolid = 0x10, |
238 | PathNonIntersecting = 0x20, |
239 | PathNonOverlappingControlPointTriangles = 0x40 |
240 | }; |
241 | Q_DECLARE_FLAGS(PathHints, PathHint) |
242 | Q_FLAG(PathHints) |
243 | |
244 | QQuickShapePath(QObject *parent = nullptr); |
245 | ~QQuickShapePath(); |
246 | |
247 | QColor strokeColor() const; |
248 | void setStrokeColor(const QColor &color); |
249 | |
250 | qreal strokeWidth() const; |
251 | void setStrokeWidth(qreal w); |
252 | |
253 | QColor fillColor() const; |
254 | void setFillColor(const QColor &color); |
255 | |
256 | FillRule fillRule() const; |
257 | void setFillRule(FillRule fillRule); |
258 | |
259 | JoinStyle joinStyle() const; |
260 | void setJoinStyle(JoinStyle style); |
261 | |
262 | int miterLimit() const; |
263 | void setMiterLimit(int limit); |
264 | |
265 | CapStyle capStyle() const; |
266 | void setCapStyle(CapStyle style); |
267 | |
268 | StrokeStyle strokeStyle() const; |
269 | void setStrokeStyle(StrokeStyle style); |
270 | |
271 | qreal dashOffset() const; |
272 | void setDashOffset(qreal offset); |
273 | |
274 | QVector<qreal> dashPattern() const; |
275 | void setDashPattern(const QVector<qreal> &array); |
276 | |
277 | QQuickShapeGradient *fillGradient() const; |
278 | void setFillGradient(QQuickShapeGradient *gradient); |
279 | void resetFillGradient(); |
280 | |
281 | PathHints pathHints() const; |
282 | void setPathHints(PathHints newPathHints); |
283 | |
284 | QMatrix4x4 fillTransform() const; |
285 | void setFillTransform(const QMatrix4x4 &matrix); |
286 | |
287 | QQuickItem *fillItem() const; |
288 | void setFillItem(QQuickItem *newFillItem); |
289 | |
290 | Q_SIGNALS: |
291 | void shapePathChanged(); |
292 | void strokeColorChanged(); |
293 | void strokeWidthChanged(); |
294 | void fillColorChanged(); |
295 | void fillRuleChanged(); |
296 | void joinStyleChanged(); |
297 | void miterLimitChanged(); |
298 | void capStyleChanged(); |
299 | void strokeStyleChanged(); |
300 | void dashOffsetChanged(); |
301 | void dashPatternChanged(); |
302 | |
303 | Q_REVISION(6, 7) void pathHintsChanged(); |
304 | Q_REVISION(6, 8) void fillTransformChanged(); |
305 | Q_REVISION(6, 8) void fillItemChanged(); |
306 | |
307 | private: |
308 | Q_DISABLE_COPY(QQuickShapePath) |
309 | Q_DECLARE_PRIVATE(QQuickShapePath) |
310 | Q_PRIVATE_SLOT(d_func(), void _q_fillGradientChanged()) |
311 | Q_PRIVATE_SLOT(d_func(), void _q_fillItemDestroyed()) |
312 | }; |
313 | |
314 | Q_DECLARE_OPERATORS_FOR_FLAGS(QQuickShapePath::PathHints) |
315 | |
316 | class Q_QUICKSHAPES_EXPORT QQuickShape : public QQuickItem |
317 | { |
318 | Q_OBJECT |
319 | Q_PROPERTY(RendererType rendererType READ rendererType NOTIFY rendererChanged) |
320 | Q_PROPERTY(bool asynchronous READ asynchronous WRITE setAsynchronous NOTIFY asynchronousChanged) |
321 | Q_PROPERTY(bool vendorExtensionsEnabled READ vendorExtensionsEnabled WRITE setVendorExtensionsEnabled NOTIFY vendorExtensionsEnabledChanged) |
322 | Q_PROPERTY(RendererType preferredRendererType READ preferredRendererType |
323 | WRITE setPreferredRendererType NOTIFY preferredRendererTypeChanged REVISION(6, 6) FINAL) |
324 | Q_PROPERTY(Status status READ status NOTIFY statusChanged) |
325 | Q_PROPERTY(ContainsMode containsMode READ containsMode WRITE setContainsMode NOTIFY containsModeChanged REVISION(1, 11)) |
326 | Q_PROPERTY(QRectF boundingRect READ boundingRect NOTIFY boundingRectChanged REVISION(6, 6) FINAL) |
327 | Q_PROPERTY(FillMode fillMode READ fillMode WRITE setFillMode NOTIFY fillModeChanged REVISION(6, 7) FINAL) |
328 | Q_PROPERTY(HAlignment horizontalAlignment READ horizontalAlignment WRITE setHorizontalAlignment NOTIFY horizontalAlignmentChanged REVISION(6, 7) FINAL) |
329 | Q_PROPERTY(VAlignment verticalAlignment READ verticalAlignment WRITE setVerticalAlignment NOTIFY verticalAlignmentChanged REVISION(6, 7) FINAL) |
330 | |
331 | Q_PROPERTY(QQmlListProperty<QObject> data READ data) |
332 | Q_CLASSINFO("DefaultProperty" , "data" ) |
333 | QML_NAMED_ELEMENT(Shape) |
334 | QML_ADDED_IN_VERSION(1, 0) |
335 | |
336 | public: |
337 | enum RendererType { |
338 | UnknownRenderer, |
339 | GeometryRenderer, |
340 | NvprRenderer, |
341 | SoftwareRenderer, |
342 | CurveRenderer |
343 | }; |
344 | Q_ENUM(RendererType) |
345 | |
346 | enum Status { |
347 | Null, |
348 | Ready, |
349 | Processing |
350 | }; |
351 | Q_ENUM(Status) |
352 | |
353 | enum ContainsMode { |
354 | BoundingRectContains, |
355 | FillContains |
356 | }; |
357 | Q_ENUM(ContainsMode) |
358 | |
359 | enum FillMode { |
360 | NoResize, |
361 | PreserveAspectFit, |
362 | PreserveAspectCrop, |
363 | Stretch |
364 | }; |
365 | Q_ENUM(FillMode) |
366 | |
367 | enum HAlignment { AlignLeft = Qt::AlignLeft, |
368 | AlignRight = Qt::AlignRight, |
369 | AlignHCenter = Qt::AlignHCenter }; |
370 | Q_ENUM(HAlignment) |
371 | enum VAlignment { AlignTop = Qt::AlignTop, |
372 | AlignBottom = Qt::AlignBottom, |
373 | AlignVCenter = Qt::AlignVCenter }; |
374 | Q_ENUM(VAlignment) |
375 | |
376 | QQuickShape(QQuickItem *parent = nullptr); |
377 | ~QQuickShape(); |
378 | |
379 | RendererType rendererType() const; |
380 | |
381 | bool asynchronous() const; |
382 | void setAsynchronous(bool async); |
383 | |
384 | Q_REVISION(6, 6) RendererType preferredRendererType() const; |
385 | Q_REVISION(6, 6) void setPreferredRendererType(RendererType preferredType); |
386 | |
387 | Q_REVISION(6, 6) QRectF boundingRect() const override; |
388 | |
389 | bool vendorExtensionsEnabled() const; |
390 | void setVendorExtensionsEnabled(bool enable); |
391 | |
392 | Status status() const; |
393 | |
394 | ContainsMode containsMode() const; |
395 | void setContainsMode(ContainsMode containsMode); |
396 | |
397 | bool contains(const QPointF &point) const override; |
398 | |
399 | QQmlListProperty<QObject> data(); |
400 | |
401 | Q_REVISION(6, 7) FillMode fillMode() const; |
402 | Q_REVISION(6, 7) void setFillMode(FillMode newFillMode); |
403 | |
404 | Q_REVISION(6, 7) HAlignment horizontalAlignment() const; |
405 | Q_REVISION(6, 7) void setHorizontalAlignment(HAlignment newHorizontalAlignment); |
406 | |
407 | Q_REVISION(6, 7) VAlignment verticalAlignment() const; |
408 | Q_REVISION(6, 7) void setVerticalAlignment(VAlignment newVerticalAlignment); |
409 | |
410 | protected: |
411 | QSGNode *updatePaintNode(QSGNode *node, UpdatePaintNodeData *) override; |
412 | void updatePolish() override; |
413 | void itemChange(ItemChange change, const ItemChangeData &data) override; |
414 | void componentComplete() override; |
415 | void classBegin() override; |
416 | |
417 | Q_SIGNALS: |
418 | void rendererChanged(); |
419 | void asynchronousChanged(); |
420 | void vendorExtensionsEnabledChanged(); |
421 | void statusChanged(); |
422 | Q_REVISION(6, 6) void preferredRendererTypeChanged(); |
423 | Q_REVISION(6, 6) void boundingRectChanged(); |
424 | Q_REVISION(1, 11) void containsModeChanged(); |
425 | |
426 | Q_REVISION(6, 7) void fillModeChanged(); |
427 | Q_REVISION(6, 7) void horizontalAlignmentChanged(); |
428 | Q_REVISION(6, 7) void verticalAlignmentChanged(); |
429 | |
430 | private: |
431 | Q_DISABLE_COPY(QQuickShape) |
432 | Q_DECLARE_PRIVATE(QQuickShape) |
433 | Q_PRIVATE_SLOT(d_func(), void _q_shapePathChanged()) |
434 | }; |
435 | |
436 | QT_END_NAMESPACE |
437 | |
438 | #endif // QQUICKSHAPE_P_H |
439 | |