7#include <QtCore/qmutex.h>
8#include <private/qqmlglobal_p.h>
9#include <QtCore/qdebug.h>
10#include <private/qqmlengine_p.h>
11#include <private/qmetaobjectbuilder_p.h>
15QQmlValueType::~QQmlValueType()
17 ::free(m_dynamicMetaObject);
20QQmlGadgetPtrWrapper *QQmlGadgetPtrWrapper::instance(QQmlEngine *engine, QMetaType type)
22 return engine ? QQmlEnginePrivate::get(engine)->valueTypeInstance(type) :
nullptr;
25QQmlGadgetPtrWrapper::QQmlGadgetPtrWrapper(QQmlValueType *valueType, QObject *parent)
26 : QObject(parent), m_gadgetPtr(valueType->create())
28 QObjectPrivate *d = QObjectPrivate::get(
this);
29 Q_ASSERT(!d->metaObject);
30 d->metaObject = valueType;
33QQmlGadgetPtrWrapper::~QQmlGadgetPtrWrapper()
35 QObjectPrivate *d = QObjectPrivate::get(
this);
36 static_cast<
const QQmlValueType *>(d->metaObject)->destroy(m_gadgetPtr);
37 d->metaObject =
nullptr;
40void QQmlGadgetPtrWrapper::read(QObject *obj,
int idx)
42 Q_ASSERT(m_gadgetPtr);
43 void *a[] = { m_gadgetPtr,
nullptr };
44 QMetaObject::metacall(obj, QMetaObject::ReadProperty, idx, a);
47void QQmlGadgetPtrWrapper::write(
48 QObject *obj,
int idx, QQmlPropertyData::WriteFlags flags,
int internalIndex)
const
50 Q_ASSERT(m_gadgetPtr);
52 void *a[] = { m_gadgetPtr,
nullptr, &status, &flags, &internalIndex };
53 QMetaObject::metacall(obj, QMetaObject::WriteProperty, idx, a);
56QVariant QQmlGadgetPtrWrapper::value()
const
58 Q_ASSERT(m_gadgetPtr);
60 const QMetaType m = metaType();
61 return m == QMetaType::fromType<QVariant>()
62 ? *
static_cast<
const QVariant *>(m_gadgetPtr)
63 : QVariant(m, m_gadgetPtr);
66void QQmlGadgetPtrWrapper::setValue(
const QVariant &value)
68 Q_ASSERT(m_gadgetPtr);
70 const QMetaType m = metaType();
71 m.destruct(m_gadgetPtr);
72 if (m == QMetaType::fromType<QVariant>()) {
73 m.construct(m_gadgetPtr, &value);
75 Q_ASSERT(m == value.metaType());
76 m.construct(m_gadgetPtr, value.constData());
80int QQmlGadgetPtrWrapper::metaCall(QMetaObject::Call type,
int id,
void **argv)
82 Q_ASSERT(m_gadgetPtr);
83 const QMetaObject *metaObject = valueType()->staticMetaObject();
84 QQmlMetaObject::resolveGadgetMethodOrPropertyIndex(type, &metaObject, &id);
85 metaObject->d.static_metacall(
static_cast<QObject *>(m_gadgetPtr), type, id, argv);
89const QQmlValueType *QQmlGadgetPtrWrapper::valueType()
const
91 const QObjectPrivate *d = QObjectPrivate::get(
this);
92 return static_cast<
const QQmlValueType *>(d->metaObject);
95#if QT_VERSION >= QT_VERSION_CHECK(7
, 0
, 0
)
96const QMetaObject *QQmlValueType::toDynamicMetaObject(QObject *)
const
98QMetaObject *QQmlValueType::toDynamicMetaObject(QObject *)
101 if (!m_dynamicMetaObject) {
102 QMetaObjectBuilder builder(m_staticMetaObject);
108 m_dynamicMetaObject = builder.toMetaObject();
110 return m_dynamicMetaObject;
113void QQmlValueType::objectDestroyed(QObject *)
117int QQmlValueType::metaCall(QObject *object, QMetaObject::Call type,
int _id,
void **argv)
119 return static_cast<QQmlGadgetPtrWrapper *>(object)->metaCall(type, _id, argv);
122QString QQmlPointFValueType::toString()
const
124 return QString::asprintf(
"QPointF(%g, %g)", QPointF::x(), QPointF::y());
127qreal QQmlPointFValueType::x()
const
132qreal QQmlPointFValueType::y()
const
137void QQmlPointFValueType::setX(qreal x)
142void QQmlPointFValueType::setY(qreal y)
148QString QQmlPointValueType::toString()
const
150 return QString::asprintf(
"QPoint(%d, %d)", QPoint::x(), QPoint::y());
153int QQmlPointValueType::x()
const
158int QQmlPointValueType::y()
const
163void QQmlPointValueType::setX(
int x)
168void QQmlPointValueType::setY(
int y)
174QString QQmlSizeFValueType::toString()
const
176 return QString::asprintf(
"QSizeF(%g, %g)", QSizeF::width(), QSizeF::height());
179qreal QQmlSizeFValueType::width()
const
181 return QSizeF::width();
184qreal QQmlSizeFValueType::height()
const
186 return QSizeF::height();
189void QQmlSizeFValueType::setWidth(qreal w)
194void QQmlSizeFValueType::setHeight(qreal h)
196 QSizeF::setHeight(h);
200QString QQmlSizeValueType::toString()
const
202 return QString::asprintf(
"QSize(%d, %d)", QSize::width(), QSize::height());
205int QQmlSizeValueType::width()
const
207 return QSize::width();
210int QQmlSizeValueType::height()
const
212 return QSize::height();
215void QQmlSizeValueType::setWidth(
int w)
220void QQmlSizeValueType::setHeight(
int h)
225QString QQmlRectFValueType::toString()
const
227 return QString::asprintf(
228 "QRectF(%g, %g, %g, %g)", QRectF::x(), QRectF::y(), QRectF::width(), QRectF::height());
231qreal QQmlRectFValueType::x()
const
236qreal QQmlRectFValueType::y()
const
241void QQmlRectFValueType::setX(qreal x)
246void QQmlRectFValueType::setY(qreal y)
251qreal QQmlRectFValueType::width()
const
253 return QRectF::width();
256qreal QQmlRectFValueType::height()
const
258 return QRectF::height();
261void QQmlRectFValueType::setWidth(qreal w)
266void QQmlRectFValueType::setHeight(qreal h)
268 QRectF::setHeight(h);
271qreal QQmlRectFValueType::left()
const
273 return QRectF::left();
276qreal QQmlRectFValueType::right()
const
278 return QRectF::right();
281qreal QQmlRectFValueType::top()
const
283 return QRectF::top();
286qreal QQmlRectFValueType::bottom()
const
288 return QRectF::bottom();
292QString QQmlRectValueType::toString()
const
294 return QString::asprintf(
295 "QRect(%d, %d, %d, %d)", QRect::x(), QRect::y(), QRect::width(), QRect::height());
298int QQmlRectValueType::x()
const
303int QQmlRectValueType::y()
const
308void QQmlRectValueType::setX(
int x)
313void QQmlRectValueType::setY(
int y)
318int QQmlRectValueType::width()
const
320 return QRect::width();
323int QQmlRectValueType::height()
const
325 return QRect::height();
328void QQmlRectValueType::setWidth(
int w)
333void QQmlRectValueType::setHeight(
int h)
338int QQmlRectValueType::left()
const
340 return QRect::left();
343int QQmlRectValueType::right()
const
345 return QRect::right();
348int QQmlRectValueType::top()
const
353int QQmlRectValueType::bottom()
const
355 return QRect::bottom();
358QString QQmlMarginsFValueType::toString()
const
360 return QString::asprintf(
361 "QMarginsF(%g, %g, %g, %g)",
362 QMarginsF::left(), QMarginsF::top(), QMarginsF::right(), QMarginsF::bottom());
365qreal QQmlMarginsFValueType::left()
const
367 return QMarginsF::left();
370qreal QQmlMarginsFValueType::top()
const
372 return QMarginsF::top();
375qreal QQmlMarginsFValueType::right()
const
377 return QMarginsF::right();
380qreal QQmlMarginsFValueType::bottom()
const
382 return QMarginsF::bottom();
385void QQmlMarginsFValueType::setLeft(qreal left)
387 QMarginsF::setLeft(left);
390void QQmlMarginsFValueType::setTop(qreal top)
392 QMarginsF::setTop(top);
395void QQmlMarginsFValueType::setRight(qreal right)
397 QMarginsF::setRight(right);
400void QQmlMarginsFValueType::setBottom(qreal bottom)
402 QMarginsF::setBottom(bottom);
405QString QQmlMarginsValueType::toString()
const
407 return QString::asprintf(
408 "QMargins(%d, %d, %d, %d)",
409 QMargins::left(), QMargins::top(), QMargins::right(), QMargins::bottom());
412int QQmlMarginsValueType::left()
const
414 return QMargins::left();
417int QQmlMarginsValueType::top()
const
419 return QMargins::top();
422int QQmlMarginsValueType::right()
const
424 return QMargins::right();
427int QQmlMarginsValueType::bottom()
const
429 return QMargins::bottom();
432void QQmlMarginsValueType::setLeft(
int left)
434 QMargins::setLeft(left);
437void QQmlMarginsValueType::setTop(
int top)
439 QMargins::setTop(top);
442void QQmlMarginsValueType::setRight(
int right)
444 QMargins::setRight(right);
447void QQmlMarginsValueType::setBottom(
int bottom)
449 QMargins::setBottom(bottom);
452#if QT_CONFIG(easingcurve)
453qreal QQmlEasing::valueForProgress(Type type, qreal progress)
const
455 return QEasingCurve(
static_cast<QEasingCurve::Type>(type)).valueForProgress(progress);
458QQmlEasingValueType::QQmlEasingValueType(QQmlEasing::Type type)
459 : QEasingCurve(
static_cast<QEasingCurve::Type>(type))
463qreal QQmlEasingValueType::valueForProgress(qreal progress)
465 return QEasingCurve::valueForProgress(progress);
468QQmlEasing::Type QQmlEasingValueType::type()
const
470 return (QQmlEasing::Type)QEasingCurve::type();
473qreal QQmlEasingValueType::amplitude()
const
475 return QEasingCurve::amplitude();
478qreal QQmlEasingValueType::overshoot()
const
480 return QEasingCurve::overshoot();
483qreal QQmlEasingValueType::period()
const
485 return QEasingCurve::period();
488void QQmlEasingValueType::setType(QQmlEasing::Type type)
490 QEasingCurve::setType((QEasingCurve::Type)type);
493void QQmlEasingValueType::setAmplitude(qreal amplitude)
495 QEasingCurve::setAmplitude(amplitude);
498void QQmlEasingValueType::setOvershoot(qreal overshoot)
500 QEasingCurve::setOvershoot(overshoot);
503void QQmlEasingValueType::setPeriod(qreal period)
505 QEasingCurve::setPeriod(period);
508void QQmlEasingValueType::setBezierCurve(
const QList<qreal> &customCurveVariant)
510 if (customCurveVariant.isEmpty())
513 if ((customCurveVariant.size() % 6) != 0)
516 QEasingCurve newEasingCurve(QEasingCurve::BezierSpline);
517 for (
int i = 0, ei = customCurveVariant.size(); i < ei; i += 6) {
518 const qreal c1x = customCurveVariant.at(i );
519 const qreal c1y = customCurveVariant.at(i + 1);
520 const qreal c2x = customCurveVariant.at(i + 2);
521 const qreal c2y = customCurveVariant.at(i + 3);
522 const qreal c3x = customCurveVariant.at(i + 4);
523 const qreal c3y = customCurveVariant.at(i + 5);
525 const QPointF c1(c1x, c1y);
526 const QPointF c2(c2x, c2y);
527 const QPointF c3(c3x, c3y);
529 newEasingCurve.addCubicBezierSegment(c1, c2, c3);
532 *
this = newEasingCurve;
535QList<qreal> QQmlEasingValueType::bezierCurve()
const
538 const QList<QPointF> points = QEasingCurve::toCubicSpline();
539 rv.reserve(points.size() * 2);
540 for (
const auto &point : points)
541 rv << point.x() << point.y();
549#include "moc_qqmlvaluetype_p.cpp"
Combined button and popup list for selecting options.