90 Q_PROPERTY(qreal x READ x WRITE setX NOTIFY xChanged)
91 Q_PROPERTY(qreal y READ y WRITE setY NOTIFY yChanged)
92 Q_PROPERTY(qreal relativeX READ relativeX WRITE setRelativeX NOTIFY relativeXChanged)
93 Q_PROPERTY(qreal relativeY READ relativeY WRITE setRelativeY NOTIFY relativeYChanged)
95 QML_ADDED_IN_VERSION(2, 0)
97 QQuickCurve(QObject *parent=
nullptr) : QQuickPathElement(parent) {}
107 qreal relativeX()
const;
108 void setRelativeX(qreal x);
111 qreal relativeY()
const;
112 void setRelativeY(qreal y);
115 virtual void addToPath(QPainterPath &,
const QQuickPathData &) {}
120 void relativeXChanged();
121 void relativeYChanged();
124#ifndef QT_NO_DEBUG_STREAM
125 friend Q_QUICK_EXPORT QDebug operator<<(QDebug debug,
const QQuickCurve *curve);
128 QQmlNullableValue<qreal> _x;
129 QQmlNullableValue<qreal> _y;
130 QQmlNullableValue<qreal> _relativeX;
131 QQmlNullableValue<qreal> _relativeY;
160 Q_PROPERTY(qreal controlX READ controlX WRITE setControlX NOTIFY controlXChanged)
161 Q_PROPERTY(qreal controlY READ controlY WRITE setControlY NOTIFY controlYChanged)
162 Q_PROPERTY(qreal relativeControlX READ relativeControlX WRITE setRelativeControlX NOTIFY relativeControlXChanged)
163 Q_PROPERTY(qreal relativeControlY READ relativeControlY WRITE setRelativeControlY NOTIFY relativeControlYChanged)
165 QML_NAMED_ELEMENT(PathQuad)
166 QML_ADDED_IN_VERSION(2, 0)
168 QQuickPathQuad(QObject *parent=
nullptr) : QQuickCurve(parent) {}
170 qreal controlX()
const;
171 void setControlX(qreal x);
173 qreal controlY()
const;
174 void setControlY(qreal y);
176 qreal relativeControlX()
const;
177 void setRelativeControlX(qreal x);
178 bool hasRelativeControlX();
180 qreal relativeControlY()
const;
181 void setRelativeControlY(qreal y);
182 bool hasRelativeControlY();
184 void addToPath(QPainterPath &path,
const QQuickPathData &) override;
187 void controlXChanged();
188 void controlYChanged();
189 void relativeControlXChanged();
190 void relativeControlYChanged();
195 QQmlNullableValue<qreal> _relativeControlX;
196 QQmlNullableValue<qreal> _relativeControlY;
203 Q_PROPERTY(qreal control1X READ control1X WRITE setControl1X NOTIFY control1XChanged)
204 Q_PROPERTY(qreal control1Y READ control1Y WRITE setControl1Y NOTIFY control1YChanged)
205 Q_PROPERTY(qreal control2X READ control2X WRITE setControl2X NOTIFY control2XChanged)
206 Q_PROPERTY(qreal control2Y READ control2Y WRITE setControl2Y NOTIFY control2YChanged)
207 Q_PROPERTY(qreal relativeControl1X READ relativeControl1X WRITE setRelativeControl1X NOTIFY relativeControl1XChanged)
208 Q_PROPERTY(qreal relativeControl1Y READ relativeControl1Y WRITE setRelativeControl1Y NOTIFY relativeControl1YChanged)
209 Q_PROPERTY(qreal relativeControl2X READ relativeControl2X WRITE setRelativeControl2X NOTIFY relativeControl2XChanged)
210 Q_PROPERTY(qreal relativeControl2Y READ relativeControl2Y WRITE setRelativeControl2Y NOTIFY relativeControl2YChanged)
211 QML_NAMED_ELEMENT(PathCubic)
212 QML_ADDED_IN_VERSION(2, 0)
214 QQuickPathCubic(QObject *parent=
nullptr) : QQuickCurve(parent) {}
216 qreal control1X()
const;
217 void setControl1X(qreal x);
219 qreal control1Y()
const;
220 void setControl1Y(qreal y);
222 qreal control2X()
const;
223 void setControl2X(qreal x);
225 qreal control2Y()
const;
226 void setControl2Y(qreal y);
228 qreal relativeControl1X()
const;
229 void setRelativeControl1X(qreal x);
230 bool hasRelativeControl1X();
232 qreal relativeControl1Y()
const;
233 void setRelativeControl1Y(qreal y);
234 bool hasRelativeControl1Y();
236 qreal relativeControl2X()
const;
237 void setRelativeControl2X(qreal x);
238 bool hasRelativeControl2X();
240 qreal relativeControl2Y()
const;
241 void setRelativeControl2Y(qreal y);
242 bool hasRelativeControl2Y();
244 void addToPath(QPainterPath &path,
const QQuickPathData &) override;
247 void control1XChanged();
248 void control1YChanged();
249 void control2XChanged();
250 void control2YChanged();
251 void relativeControl1XChanged();
252 void relativeControl1YChanged();
253 void relativeControl2XChanged();
254 void relativeControl2YChanged();
257 qreal _control1X = 0;
258 qreal _control1Y = 0;
259 qreal _control2X = 0;
260 qreal _control2Y = 0;
261 QQmlNullableValue<qreal> _relativeControl1X;
262 QQmlNullableValue<qreal> _relativeControl1Y;
263 QQmlNullableValue<qreal> _relativeControl2X;
264 QQmlNullableValue<qreal> _relativeControl2Y;
281 Q_PROPERTY(qreal radiusX READ radiusX WRITE setRadiusX NOTIFY radiusXChanged)
282 Q_PROPERTY(qreal radiusY READ radiusY WRITE setRadiusY NOTIFY radiusYChanged)
283 Q_PROPERTY(
bool useLargeArc READ useLargeArc WRITE setUseLargeArc NOTIFY useLargeArcChanged)
284 Q_PROPERTY(ArcDirection direction READ direction WRITE setDirection NOTIFY directionChanged)
285 Q_PROPERTY(qreal xAxisRotation READ xAxisRotation WRITE setXAxisRotation NOTIFY xAxisRotationChanged REVISION(2, 9))
286 QML_NAMED_ELEMENT(PathArc)
287 QML_ADDED_IN_VERSION(2, 0)
290 QQuickPathArc(QObject *parent=
nullptr)
291 : QQuickCurve(parent) {}
293 enum ArcDirection { Clockwise, Counterclockwise };
296 qreal radiusX()
const;
297 void setRadiusX(qreal);
299 qreal radiusY()
const;
300 void setRadiusY(qreal);
302 bool useLargeArc()
const;
303 void setUseLargeArc(
bool);
305 ArcDirection direction()
const;
306 void setDirection(ArcDirection direction);
308 qreal xAxisRotation()
const;
309 void setXAxisRotation(qreal rotation);
311 void addToPath(QPainterPath &path,
const QQuickPathData &) override;
314 void radiusXChanged();
315 void radiusYChanged();
316 void useLargeArcChanged();
317 void directionChanged();
318 Q_REVISION(2, 9)
void xAxisRotationChanged();
323 bool _useLargeArc =
false;
324 ArcDirection _direction = Clockwise;
325 qreal _xAxisRotation = 0;
331 Q_PROPERTY(qreal centerX READ centerX WRITE setCenterX NOTIFY centerXChanged)
332 Q_PROPERTY(qreal centerY READ centerY WRITE setCenterY NOTIFY centerYChanged)
333 Q_PROPERTY(qreal radiusX READ radiusX WRITE setRadiusX NOTIFY radiusXChanged)
334 Q_PROPERTY(qreal radiusY READ radiusY WRITE setRadiusY NOTIFY radiusYChanged)
335 Q_PROPERTY(qreal startAngle READ startAngle WRITE setStartAngle NOTIFY startAngleChanged)
336 Q_PROPERTY(qreal sweepAngle READ sweepAngle WRITE setSweepAngle NOTIFY sweepAngleChanged)
337 Q_PROPERTY(
bool moveToStart READ moveToStart WRITE setMoveToStart NOTIFY moveToStartChanged)
339 QML_NAMED_ELEMENT(PathAngleArc)
340 QML_ADDED_IN_VERSION(2, 11)
343 QQuickPathAngleArc(QObject *parent=
nullptr)
344 : QQuickCurve(parent) {}
346 qreal centerX()
const;
347 void setCenterX(qreal);
349 qreal centerY()
const;
350 void setCenterY(qreal);
352 qreal radiusX()
const;
353 void setRadiusX(qreal);
355 qreal radiusY()
const;
356 void setRadiusY(qreal);
358 qreal startAngle()
const;
359 void setStartAngle(qreal);
361 qreal sweepAngle()
const;
362 void setSweepAngle(qreal);
364 bool moveToStart()
const;
365 void setMoveToStart(
bool);
367 void addToPath(QPainterPath &path,
const QQuickPathData &) override;
370 void centerXChanged();
371 void centerYChanged();
372 void radiusXChanged();
373 void radiusYChanged();
374 void startAngleChanged();
375 void sweepAngleChanged();
376 void moveToStartChanged();
383 qreal _startAngle = 0;
384 qreal _sweepAngle = 0;
385 bool _moveToStart =
true;
413 Q_PROPERTY(qreal width READ width WRITE setWidth NOTIFY widthChanged FINAL)
414 Q_PROPERTY(qreal height READ height WRITE setHeight NOTIFY heightChanged FINAL)
415 Q_PROPERTY(qreal strokeAdjustment READ strokeAdjustment WRITE setStrokeAdjustment NOTIFY strokeAdjustmentChanged FINAL)
416 Q_PROPERTY(qreal radius READ radius WRITE setRadius NOTIFY radiusChanged FINAL)
417 Q_PROPERTY(qreal topLeftRadius READ topLeftRadius WRITE setTopLeftRadius RESET resetTopLeftRadius NOTIFY topLeftRadiusChanged FINAL)
418 Q_PROPERTY(qreal topRightRadius READ topRightRadius WRITE setTopRightRadius NOTIFY topRightRadiusChanged RESET resetTopRightRadius FINAL)
419 Q_PROPERTY(qreal bottomLeftRadius READ bottomLeftRadius WRITE setBottomLeftRadius NOTIFY bottomLeftRadiusChanged RESET resetBottomLeftRadius FINAL)
420 Q_PROPERTY(qreal bottomRightRadius READ bottomRightRadius WRITE setBottomRightRadius NOTIFY bottomRightRadiusChanged RESET resetBottomRightRadius FINAL)
421 Q_PROPERTY(
bool bevel READ hasBevel WRITE setBevel NOTIFY bevelChanged FINAL REVISION(6, 10))
422 Q_PROPERTY(
bool topLeftBevel READ hasTopLeftBevel WRITE setTopLeftBevel NOTIFY topLeftBevelChanged RESET resetTopLeftBevel FINAL REVISION(6, 10))
423 Q_PROPERTY(
bool topRightBevel READ hasTopRightBevel WRITE setTopRightBevel NOTIFY topRightBevelChanged RESET resetTopRightBevel FINAL REVISION(6, 10))
424 Q_PROPERTY(
bool bottomLeftBevel READ hasBottomLeftBevel WRITE setBottomLeftBevel NOTIFY bottomLeftBevelChanged RESET resetBottomLeftBevel FINAL REVISION(6, 10))
425 Q_PROPERTY(
bool bottomRightBevel READ hasBottomRightBevel WRITE setBottomRightBevel NOTIFY bottomRightBevelChanged RESET resetBottomRightBevel FINAL REVISION(6, 10))
427 QML_NAMED_ELEMENT(PathRectangle)
428 QML_ADDED_IN_VERSION(6, 8)
430 QQuickPathRectangle(QObject *parent =
nullptr) : QQuickCurve(parent) {}
433 void setWidth(qreal width);
435 qreal height()
const;
436 void setHeight(qreal height);
438 qreal strokeAdjustment()
const;
439 void setStrokeAdjustment(qreal newStrokeAdjustment);
441 qreal radius()
const;
442 void setRadius(qreal newRadius);
444 qreal topLeftRadius()
const {
return cornerRadius(Qt::TopLeftCorner); }
445 void setTopLeftRadius(qreal radius) { setCornerRadius(Qt::TopLeftCorner, radius); }
446 void resetTopLeftRadius() { resetCornerRadius(Qt::TopLeftCorner); }
448 qreal topRightRadius()
const {
return cornerRadius(Qt::TopRightCorner); }
449 void setTopRightRadius(qreal radius) { setCornerRadius(Qt::TopRightCorner, radius); }
450 void resetTopRightRadius() { resetCornerRadius(Qt::TopRightCorner); }
452 qreal bottomLeftRadius()
const {
return cornerRadius(Qt::BottomLeftCorner); }
453 void setBottomLeftRadius(qreal radius) { setCornerRadius(Qt::BottomLeftCorner, radius); }
454 void resetBottomLeftRadius() { resetCornerRadius(Qt::BottomLeftCorner); }
456 qreal bottomRightRadius()
const {
return cornerRadius(Qt::BottomRightCorner); }
457 void setBottomRightRadius(qreal radius) { setCornerRadius(Qt::BottomRightCorner, radius); }
458 void resetBottomRightRadius() { resetCornerRadius(Qt::BottomRightCorner); }
460 qreal cornerRadius(Qt::Corner corner)
const;
461 void setCornerRadius(Qt::Corner corner, qreal newCornerRadius);
462 void resetCornerRadius(Qt::Corner corner);
464 bool hasBevel()
const;
465 void setBevel(
bool bevel);
467 bool hasTopLeftBevel()
const {
return cornerBevel(Qt::TopLeftCorner); }
468 void setTopLeftBevel(
bool bevel) { setCornerBevel(Qt::TopLeftCorner, bevel); }
469 void resetTopLeftBevel() { resetCornerBevel(Qt::TopLeftCorner); }
471 bool hasTopRightBevel()
const {
return cornerBevel(Qt::TopRightCorner); }
472 void setTopRightBevel(
bool bevel) { setCornerBevel(Qt::TopRightCorner, bevel); }
473 void resetTopRightBevel() { resetCornerBevel(Qt::TopRightCorner); }
475 bool hasBottomLeftBevel()
const {
return cornerBevel(Qt::BottomLeftCorner); }
476 void setBottomLeftBevel(
bool bevel) { setCornerBevel(Qt::BottomLeftCorner, bevel); }
477 void resetBottomLeftBevel() { resetCornerBevel(Qt::BottomLeftCorner); }
479 bool hasBottomRightBevel()
const {
return cornerBevel(Qt::BottomRightCorner); }
480 void setBottomRightBevel(
bool bevel) { setCornerBevel(Qt::BottomRightCorner, bevel); }
481 void resetBottomRightBevel() { resetCornerBevel(Qt::BottomRightCorner); }
483 bool cornerBevel(Qt::Corner corner)
const;
484 void setCornerBevel(Qt::Corner corner,
bool newCornerBevel);
485 void resetCornerBevel(Qt::Corner corner);
487 void addToPath(QPainterPath &path,
const QQuickPathData &) override;
491 void heightChanged();
492 void strokeAdjustmentChanged();
493 void radiusChanged();
494 void topLeftRadiusChanged();
495 void topRightRadiusChanged();
496 void bottomLeftRadiusChanged();
497 void bottomRightRadiusChanged();
498 Q_REVISION(6, 10)
void bevelChanged();
499 Q_REVISION(6, 10)
void topLeftBevelChanged();
500 Q_REVISION(6, 10)
void topRightBevelChanged();
501 Q_REVISION(6, 10)
void bottomLeftBevelChanged();
502 Q_REVISION(6, 10)
void bottomRightBevelChanged();
505 void emitCornerRadiusChanged(Qt::Corner corner);
506 void emitCornerBevelChanged(Qt::Corner corner);
510 qreal _strokeAdjustment = 0;
514 std::fill_n(cornerRadii, 4, 0);
515 cornerProperties = 0;
518 qreal cornerRadii[4];
519 unsigned cornerProperties :9;
520 inline bool isRadiusSet(Qt::Corner corner) {
521 return cornerProperties & (1 << corner);
523 inline bool isBevelSet(Qt::Corner corner) {
524 return cornerProperties & (1 << (corner + 4));
527 QLazilyAllocated<ExtraData> _extra;
611class Q_QUICK_EXPORT
QQuickPath :
public QObject,
public QQmlParserStatus
615 Q_INTERFACES(QQmlParserStatus)
616 Q_PROPERTY(QQmlListProperty<QQuickPathElement> pathElements READ pathElements)
617 Q_PROPERTY(qreal startX READ startX WRITE setStartX NOTIFY startXChanged)
618 Q_PROPERTY(qreal startY READ startY WRITE setStartY NOTIFY startYChanged)
619 Q_PROPERTY(
bool closed READ isClosed NOTIFY changed)
620 Q_PROPERTY(
bool simplify READ simplify WRITE setSimplify NOTIFY simplifyChanged REVISION(6, 6) FINAL)
621 Q_PROPERTY(QSizeF scale READ scale WRITE setScale NOTIFY scaleChanged REVISION(2, 14))
622 Q_PROPERTY(
bool asynchronous READ isAsynchronous WRITE setAsynchronous NOTIFY asynchronousChanged REVISION(6, 9))
623 Q_CLASSINFO(
"DefaultProperty",
"pathElements")
624 QML_NAMED_ELEMENT(Path)
625 QML_ADDED_IN_VERSION(2, 0)
627 QQuickPath(QObject *parent=
nullptr);
628 ~QQuickPath() override;
630 QQmlListProperty<QQuickPathElement> pathElements();
632 qreal startX()
const;
633 void setStartX(qreal x);
634 bool hasStartX()
const;
636 qreal startY()
const;
637 void setStartY(qreal y);
638 bool hasStartY()
const;
640 bool isClosed()
const;
642 QPainterPath path()
const;
643 void setPath(
const QPainterPath &path);
645 QStringList attributes()
const;
646 qreal attributeAt(
const QString &, qreal)
const;
647 Q_REVISION(2, 14) Q_INVOKABLE QPointF pointAtPercent(qreal t)
const;
648 QPointF sequentialPointAt(qreal p, qreal *angle =
nullptr)
const;
649 void invalidateSequentialHistory()
const;
651 QSizeF scale()
const;
652 void setScale(
const QSizeF &scale);
654 bool simplify()
const;
655 void setSimplify(
bool s);
657 bool isAsynchronous()
const;
658 void setAsynchronous(
bool a);
667 void startXChanged();
668 void startYChanged();
669 Q_REVISION(6, 6)
void simplifyChanged();
670 Q_REVISION(2, 14)
void scaleChanged();
671 Q_REVISION(6, 9)
void asynchronousChanged();
674 QQuickPath(QQuickPathPrivate &dd, QObject *parent =
nullptr);
675 void componentComplete() override;
676 void classBegin() override;
677 void disconnectPathElements();
678 void connectPathElements();
679 void gatherAttributes();
682 static QQuickPathElement *pathElements_at(QQmlListProperty<QQuickPathElement> *, qsizetype);
683 static void pathElements_append(QQmlListProperty<QQuickPathElement> *, QQuickPathElement *);
684 static qsizetype pathElements_count(QQmlListProperty<QQuickPathElement> *);
685 static void pathElements_clear(QQmlListProperty<QQuickPathElement> *);
686 static void pathElements_replace(
687 QQmlListProperty<QQuickPathElement> *, qsizetype, QQuickPathElement *);
688 static void pathElements_removeLast(QQmlListProperty<QQuickPathElement> *);
691 struct AttributePoint {
693 AttributePoint(
const AttributePoint &other)
694 : percent(other.percent), scale(other.scale), origpercent(other.origpercent), values(other.values) {}
695 AttributePoint &operator=(
const AttributePoint &other) {
696 percent = other.percent; scale = other.scale; origpercent = other.origpercent; values = other.values;
return *
this;
700 qreal origpercent = 0;
701 QHash<QString, qreal> values;
704 void doProcessPath();
705 void interpolate(
int idx,
const QString &name, qreal value);
706 void endpoint(
const QString &name);
707 void createPointCache()
const;
709 static void interpolate(QList<AttributePoint> &points,
int idx,
const QString &name, qreal value);
710 static void endpoint(QList<AttributePoint> &attributePoints,
const QString &name);
711 static QPointF forwardsPointAt(
const QPainterPath &path,
const qreal &pathLength,
const QList<AttributePoint> &attributePoints, QQuickCachedBezier &prevBez, qreal p, qreal *angle =
nullptr);
712 static QPointF backwardsPointAt(
const QPainterPath &path,
const qreal &pathLength,
const QList<AttributePoint> &attributePoints, QQuickCachedBezier &prevBez, qreal p, qreal *angle =
nullptr);
715 Q_DISABLE_COPY(QQuickPath)
716 Q_DECLARE_PRIVATE(QQuickPath)
717 friend class QQuickPathAnimationUpdater;
720 QPainterPath createPath(
const QPointF &startPoint,
const QPointF &endPoint,
const QStringList &attributes, qreal &pathLength, QList<AttributePoint> &attributePoints,
bool *closed =
nullptr);
721 QPainterPath createShapePath(
const QPointF &startPoint,
const QPointF &endPoint, qreal &pathLength,
bool *closed =
nullptr);
722 static QPointF sequentialPointAt(
const QPainterPath &path,
const qreal &pathLength,
const QList<AttributePoint> &attributePoints, QQuickCachedBezier &prevBez, qreal p, qreal *angle =
nullptr);