6#include <QtCore/qmutex.h>
7#include <private/qqmlglobal_p.h>
8#include <QtCore/qdebug.h>
9#include <private/qqmlengine_p.h>
10#include <private/qmetaobjectbuilder_p.h>
14QQmlValueType::~QQmlValueType()
16 ::free(m_dynamicMetaObject);
19QQmlGadgetPtrWrapper *QQmlGadgetPtrWrapper::instance(QQmlEngine *engine, QMetaType type)
21 return engine ? QQmlEnginePrivate::get(engine)->valueTypeInstance(type) :
nullptr;
24QQmlGadgetPtrWrapper::QQmlGadgetPtrWrapper(QQmlValueType *valueType, QObject *parent)
25 : QObject(parent), m_gadgetPtr(valueType->create())
27 QObjectPrivate *d = QObjectPrivate::get(
this);
28 Q_ASSERT(!d->metaObject);
29 d->metaObject = valueType;
32QQmlGadgetPtrWrapper::~QQmlGadgetPtrWrapper()
34 QObjectPrivate *d = QObjectPrivate::get(
this);
35 static_cast<
const QQmlValueType *>(d->metaObject)->destroy(m_gadgetPtr);
36 d->metaObject =
nullptr;
39void QQmlGadgetPtrWrapper::read(QObject *obj,
int idx)
41 Q_ASSERT(m_gadgetPtr);
42 void *a[] = { m_gadgetPtr,
nullptr };
43 QMetaObject::metacall(obj, QMetaObject::ReadProperty, idx, a);
46void QQmlGadgetPtrWrapper::write(
47 QObject *obj,
int idx, QQmlPropertyData::WriteFlags flags,
int internalIndex)
const
49 Q_ASSERT(m_gadgetPtr);
51 void *a[] = { m_gadgetPtr,
nullptr, &status, &flags, &internalIndex };
52 QMetaObject::metacall(obj, QMetaObject::WriteProperty, idx, a);
55QVariant QQmlGadgetPtrWrapper::value()
const
57 Q_ASSERT(m_gadgetPtr);
59 const QMetaType m = metaType();
60 return m == QMetaType::fromType<QVariant>()
61 ? *
static_cast<
const QVariant *>(m_gadgetPtr)
62 : QVariant(m, m_gadgetPtr);
65void QQmlGadgetPtrWrapper::setValue(
const QVariant &value)
67 Q_ASSERT(m_gadgetPtr);
69 const QMetaType m = metaType();
70 m.destruct(m_gadgetPtr);
71 if (m == QMetaType::fromType<QVariant>()) {
72 m.construct(m_gadgetPtr, &value);
74 Q_ASSERT(m == value.metaType());
75 m.construct(m_gadgetPtr, value.constData());
79int QQmlGadgetPtrWrapper::metaCall(QMetaObject::Call type,
int id,
void **argv)
81 Q_ASSERT(m_gadgetPtr);
82 const QMetaObject *metaObject = valueType()->staticMetaObject();
83 QQmlMetaObject::resolveGadgetMethodOrPropertyIndex(type, &metaObject, &id);
84 metaObject->d.static_metacall(
static_cast<QObject *>(m_gadgetPtr), type, id, argv);
88const QQmlValueType *QQmlGadgetPtrWrapper::valueType()
const
90 const QObjectPrivate *d = QObjectPrivate::get(
this);
91 return static_cast<
const QQmlValueType *>(d->metaObject);
94#if QT_VERSION >= QT_VERSION_CHECK(7
, 0
, 0
)
95const QMetaObject *QQmlValueType::toDynamicMetaObject(QObject *)
const
97QMetaObject *QQmlValueType::toDynamicMetaObject(QObject *)
100 if (!m_dynamicMetaObject) {
101 QMetaObjectBuilder builder(m_staticMetaObject);
107 m_dynamicMetaObject = builder.toMetaObject();
109 return m_dynamicMetaObject;
112void QQmlValueType::objectDestroyed(QObject *)
116int QQmlValueType::metaCall(QObject *object, QMetaObject::Call type,
int _id,
void **argv)
118 return static_cast<QQmlGadgetPtrWrapper *>(object)->metaCall(type, _id, argv);
121QString QQmlPointFValueType::toString()
const
123 return QString::asprintf(
"QPointF(%g, %g)", QPointF::x(), QPointF::y());
126qreal QQmlPointFValueType::x()
const
131qreal QQmlPointFValueType::y()
const
136void QQmlPointFValueType::setX(qreal x)
141void QQmlPointFValueType::setY(qreal y)
147QString QQmlPointValueType::toString()
const
149 return QString::asprintf(
"QPoint(%d, %d)", QPoint::x(), QPoint::y());
152int QQmlPointValueType::x()
const
157int QQmlPointValueType::y()
const
162void QQmlPointValueType::setX(
int x)
167void QQmlPointValueType::setY(
int y)
173QString QQmlSizeFValueType::toString()
const
175 return QString::asprintf(
"QSizeF(%g, %g)", QSizeF::width(), QSizeF::height());
178qreal QQmlSizeFValueType::width()
const
180 return QSizeF::width();
183qreal QQmlSizeFValueType::height()
const
185 return QSizeF::height();
188void QQmlSizeFValueType::setWidth(qreal w)
193void QQmlSizeFValueType::setHeight(qreal h)
195 QSizeF::setHeight(h);
199QString QQmlSizeValueType::toString()
const
201 return QString::asprintf(
"QSize(%d, %d)", QSize::width(), QSize::height());
204int QQmlSizeValueType::width()
const
206 return QSize::width();
209int QQmlSizeValueType::height()
const
211 return QSize::height();
214void QQmlSizeValueType::setWidth(
int w)
219void QQmlSizeValueType::setHeight(
int h)
224QString QQmlRectFValueType::toString()
const
226 return QString::asprintf(
227 "QRectF(%g, %g, %g, %g)", QRectF::x(), QRectF::y(), QRectF::width(), QRectF::height());
230qreal QQmlRectFValueType::x()
const
235qreal QQmlRectFValueType::y()
const
240void QQmlRectFValueType::setX(qreal x)
245void QQmlRectFValueType::setY(qreal y)
250qreal QQmlRectFValueType::width()
const
252 return QRectF::width();
255qreal QQmlRectFValueType::height()
const
257 return QRectF::height();
260void QQmlRectFValueType::setWidth(qreal w)
265void QQmlRectFValueType::setHeight(qreal h)
267 QRectF::setHeight(h);
270qreal QQmlRectFValueType::left()
const
272 return QRectF::left();
275qreal QQmlRectFValueType::right()
const
277 return QRectF::right();
280qreal QQmlRectFValueType::top()
const
282 return QRectF::top();
285qreal QQmlRectFValueType::bottom()
const
287 return QRectF::bottom();
291QString QQmlRectValueType::toString()
const
293 return QString::asprintf(
294 "QRect(%d, %d, %d, %d)", QRect::x(), QRect::y(), QRect::width(), QRect::height());
297int QQmlRectValueType::x()
const
302int QQmlRectValueType::y()
const
307void QQmlRectValueType::setX(
int x)
312void QQmlRectValueType::setY(
int y)
317int QQmlRectValueType::width()
const
319 return QRect::width();
322int QQmlRectValueType::height()
const
324 return QRect::height();
327void QQmlRectValueType::setWidth(
int w)
332void QQmlRectValueType::setHeight(
int h)
337int QQmlRectValueType::left()
const
339 return QRect::left();
342int QQmlRectValueType::right()
const
344 return QRect::right();
347int QQmlRectValueType::top()
const
352int QQmlRectValueType::bottom()
const
354 return QRect::bottom();
357QString QQmlMarginsFValueType::toString()
const
359 return QString::asprintf(
360 "QMarginsF(%g, %g, %g, %g)",
361 QMarginsF::left(), QMarginsF::top(), QMarginsF::right(), QMarginsF::bottom());
364qreal QQmlMarginsFValueType::left()
const
366 return QMarginsF::left();
369qreal QQmlMarginsFValueType::top()
const
371 return QMarginsF::top();
374qreal QQmlMarginsFValueType::right()
const
376 return QMarginsF::right();
379qreal QQmlMarginsFValueType::bottom()
const
381 return QMarginsF::bottom();
384void QQmlMarginsFValueType::setLeft(qreal left)
386 QMarginsF::setLeft(left);
389void QQmlMarginsFValueType::setTop(qreal top)
391 QMarginsF::setTop(top);
394void QQmlMarginsFValueType::setRight(qreal right)
396 QMarginsF::setRight(right);
399void QQmlMarginsFValueType::setBottom(qreal bottom)
401 QMarginsF::setBottom(bottom);
404QString QQmlMarginsValueType::toString()
const
406 return QString::asprintf(
407 "QMargins(%d, %d, %d, %d)",
408 QMargins::left(), QMargins::top(), QMargins::right(), QMargins::bottom());
411int QQmlMarginsValueType::left()
const
413 return QMargins::left();
416int QQmlMarginsValueType::top()
const
418 return QMargins::top();
421int QQmlMarginsValueType::right()
const
423 return QMargins::right();
426int QQmlMarginsValueType::bottom()
const
428 return QMargins::bottom();
431void QQmlMarginsValueType::setLeft(
int left)
433 QMargins::setLeft(left);
436void QQmlMarginsValueType::setTop(
int top)
438 QMargins::setTop(top);
441void QQmlMarginsValueType::setRight(
int right)
443 QMargins::setRight(right);
446void QQmlMarginsValueType::setBottom(
int bottom)
448 QMargins::setBottom(bottom);
451#if QT_CONFIG(easingcurve)
452qreal QQmlEasing::valueForProgress(Type type, qreal progress)
const
454 return QEasingCurve(
static_cast<QEasingCurve::Type>(type)).valueForProgress(progress);
457QQmlEasingValueType::QQmlEasingValueType(QQmlEasing::Type type)
458 : QEasingCurve(
static_cast<QEasingCurve::Type>(type))
462qreal QQmlEasingValueType::valueForProgress(qreal progress)
464 return QEasingCurve::valueForProgress(progress);
467QQmlEasing::Type QQmlEasingValueType::type()
const
469 return (QQmlEasing::Type)QEasingCurve::type();
472qreal QQmlEasingValueType::amplitude()
const
474 return QEasingCurve::amplitude();
477qreal QQmlEasingValueType::overshoot()
const
479 return QEasingCurve::overshoot();
482qreal QQmlEasingValueType::period()
const
484 return QEasingCurve::period();
487void QQmlEasingValueType::setType(QQmlEasing::Type type)
489 QEasingCurve::setType((QEasingCurve::Type)type);
492void QQmlEasingValueType::setAmplitude(qreal amplitude)
494 QEasingCurve::setAmplitude(amplitude);
497void QQmlEasingValueType::setOvershoot(qreal overshoot)
499 QEasingCurve::setOvershoot(overshoot);
502void QQmlEasingValueType::setPeriod(qreal period)
504 QEasingCurve::setPeriod(period);
507void QQmlEasingValueType::setBezierCurve(
const QList<qreal> &customCurveVariant)
509 if (customCurveVariant.isEmpty())
512 if ((customCurveVariant.size() % 6) != 0)
515 QEasingCurve newEasingCurve(QEasingCurve::BezierSpline);
516 for (
int i = 0, ei = customCurveVariant.size(); i < ei; i += 6) {
517 const qreal c1x = customCurveVariant.at(i );
518 const qreal c1y = customCurveVariant.at(i + 1);
519 const qreal c2x = customCurveVariant.at(i + 2);
520 const qreal c2y = customCurveVariant.at(i + 3);
521 const qreal c3x = customCurveVariant.at(i + 4);
522 const qreal c3y = customCurveVariant.at(i + 5);
524 const QPointF c1(c1x, c1y);
525 const QPointF c2(c2x, c2y);
526 const QPointF c3(c3x, c3y);
528 newEasingCurve.addCubicBezierSegment(c1, c2, c3);
531 *
this = newEasingCurve;
534QList<qreal> QQmlEasingValueType::bezierCurve()
const
537 const QVector<QPointF> points = QEasingCurve::toCubicSpline();
538 rv.reserve(points.size() * 2);
539 for (
const auto &point : points)
540 rv << point.x() << point.y();
548#include "moc_qqmlvaluetype_p.cpp"