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);
39 Q_ASSERT(
dynamic_cast<
const QQmlValueType *>(d->metaObject));
41 static_cast<
const QQmlValueType *>(d->metaObject)->destroy(m_gadgetPtr);
42 d->metaObject =
nullptr;
45void QQmlGadgetPtrWrapper::read(QObject *obj,
int idx)
47 Q_ASSERT(m_gadgetPtr);
48 void *a[] = { m_gadgetPtr,
nullptr };
49 QMetaObject::metacall(obj, QMetaObject::ReadProperty, idx, a);
52void QQmlGadgetPtrWrapper::write(
53 QObject *obj,
int idx, QQmlPropertyData::WriteFlags flags,
int internalIndex)
const
55 Q_ASSERT(m_gadgetPtr);
57 void *a[] = { m_gadgetPtr,
nullptr, &status, &flags, &internalIndex };
58 QMetaObject::metacall(obj, QMetaObject::WriteProperty, idx, a);
61QVariant QQmlGadgetPtrWrapper::value()
const
63 Q_ASSERT(m_gadgetPtr);
65 const QMetaType m = metaType();
66 return m == QMetaType::fromType<QVariant>()
67 ? *
static_cast<
const QVariant *>(m_gadgetPtr)
68 : QVariant(m, m_gadgetPtr);
71void QQmlGadgetPtrWrapper::setValue(
const QVariant &value)
73 Q_ASSERT(m_gadgetPtr);
75 const QMetaType m = metaType();
76 m.destruct(m_gadgetPtr);
77 if (m == QMetaType::fromType<QVariant>()) {
78 m.construct(m_gadgetPtr, &value);
80 Q_ASSERT(m == value.metaType());
81 m.construct(m_gadgetPtr, value.constData());
85int QQmlGadgetPtrWrapper::metaCall(QMetaObject::Call type,
int id,
void **argv)
87 Q_ASSERT(m_gadgetPtr);
88 const QMetaObject *metaObject = valueType()->staticMetaObject();
89 QQmlMetaObject::resolveGadgetMethodOrPropertyIndex(type, &metaObject, &id);
90 metaObject->d.static_metacall(
static_cast<QObject *>(m_gadgetPtr), type, id, argv);
94const QQmlValueType *QQmlGadgetPtrWrapper::valueType()
const
96 const QObjectPrivate *d = QObjectPrivate::get(
this);
97 return static_cast<
const QQmlValueType *>(d->metaObject);
100#if QT_VERSION >= QT_VERSION_CHECK(7
, 0
, 0
)
101const QMetaObject *QQmlValueType::toDynamicMetaObject(QObject *)
const
103QMetaObject *QQmlValueType::toDynamicMetaObject(QObject *)
106 if (!m_dynamicMetaObject) {
107 QMetaObjectBuilder builder(m_staticMetaObject);
113 m_dynamicMetaObject = builder.toMetaObject();
115 return m_dynamicMetaObject;
118void QQmlValueType::objectDestroyed(QObject *)
122int QQmlValueType::metaCall(QObject *object, QMetaObject::Call type,
int _id,
void **argv)
124 return static_cast<QQmlGadgetPtrWrapper *>(object)->metaCall(type, _id, argv);
127QString QQmlPointFValueType::toString()
const
129 return QString::asprintf(
"QPointF(%g, %g)", QPointF::x(), QPointF::y());
132qreal QQmlPointFValueType::x()
const
137qreal QQmlPointFValueType::y()
const
142void QQmlPointFValueType::setX(qreal x)
147void QQmlPointFValueType::setY(qreal y)
153QString QQmlPointValueType::toString()
const
155 return QString::asprintf(
"QPoint(%d, %d)", QPoint::x(), QPoint::y());
158int QQmlPointValueType::x()
const
163int QQmlPointValueType::y()
const
168void QQmlPointValueType::setX(
int x)
173void QQmlPointValueType::setY(
int y)
179QString QQmlSizeFValueType::toString()
const
181 return QString::asprintf(
"QSizeF(%g, %g)", QSizeF::width(), QSizeF::height());
184qreal QQmlSizeFValueType::width()
const
186 return QSizeF::width();
189qreal QQmlSizeFValueType::height()
const
191 return QSizeF::height();
194void QQmlSizeFValueType::setWidth(qreal w)
199void QQmlSizeFValueType::setHeight(qreal h)
201 QSizeF::setHeight(h);
205QString QQmlSizeValueType::toString()
const
207 return QString::asprintf(
"QSize(%d, %d)", QSize::width(), QSize::height());
210int QQmlSizeValueType::width()
const
212 return QSize::width();
215int QQmlSizeValueType::height()
const
217 return QSize::height();
220void QQmlSizeValueType::setWidth(
int w)
225void QQmlSizeValueType::setHeight(
int h)
230QString QQmlRectFValueType::toString()
const
232 return QString::asprintf(
233 "QRectF(%g, %g, %g, %g)", QRectF::x(), QRectF::y(), QRectF::width(), QRectF::height());
236qreal QQmlRectFValueType::x()
const
241qreal QQmlRectFValueType::y()
const
246void QQmlRectFValueType::setX(qreal x)
251void QQmlRectFValueType::setY(qreal y)
256qreal QQmlRectFValueType::width()
const
258 return QRectF::width();
261qreal QQmlRectFValueType::height()
const
263 return QRectF::height();
266void QQmlRectFValueType::setWidth(qreal w)
271void QQmlRectFValueType::setHeight(qreal h)
273 QRectF::setHeight(h);
276qreal QQmlRectFValueType::left()
const
278 return QRectF::left();
281qreal QQmlRectFValueType::right()
const
283 return QRectF::right();
286qreal QQmlRectFValueType::top()
const
288 return QRectF::top();
291qreal QQmlRectFValueType::bottom()
const
293 return QRectF::bottom();
297QString QQmlRectValueType::toString()
const
299 return QString::asprintf(
300 "QRect(%d, %d, %d, %d)", QRect::x(), QRect::y(), QRect::width(), QRect::height());
303int QQmlRectValueType::x()
const
308int QQmlRectValueType::y()
const
313void QQmlRectValueType::setX(
int x)
318void QQmlRectValueType::setY(
int y)
323int QQmlRectValueType::width()
const
325 return QRect::width();
328int QQmlRectValueType::height()
const
330 return QRect::height();
333void QQmlRectValueType::setWidth(
int w)
338void QQmlRectValueType::setHeight(
int h)
343int QQmlRectValueType::left()
const
345 return QRect::left();
348int QQmlRectValueType::right()
const
350 return QRect::right();
353int QQmlRectValueType::top()
const
358int QQmlRectValueType::bottom()
const
360 return QRect::bottom();
363QString QQmlMarginsFValueType::toString()
const
365 return QString::asprintf(
366 "QMarginsF(%g, %g, %g, %g)",
367 QMarginsF::left(), QMarginsF::top(), QMarginsF::right(), QMarginsF::bottom());
370qreal QQmlMarginsFValueType::left()
const
372 return QMarginsF::left();
375qreal QQmlMarginsFValueType::top()
const
377 return QMarginsF::top();
380qreal QQmlMarginsFValueType::right()
const
382 return QMarginsF::right();
385qreal QQmlMarginsFValueType::bottom()
const
387 return QMarginsF::bottom();
390void QQmlMarginsFValueType::setLeft(qreal left)
392 QMarginsF::setLeft(left);
395void QQmlMarginsFValueType::setTop(qreal top)
397 QMarginsF::setTop(top);
400void QQmlMarginsFValueType::setRight(qreal right)
402 QMarginsF::setRight(right);
405void QQmlMarginsFValueType::setBottom(qreal bottom)
407 QMarginsF::setBottom(bottom);
410QString QQmlMarginsValueType::toString()
const
412 return QString::asprintf(
413 "QMargins(%d, %d, %d, %d)",
414 QMargins::left(), QMargins::top(), QMargins::right(), QMargins::bottom());
417int QQmlMarginsValueType::left()
const
419 return QMargins::left();
422int QQmlMarginsValueType::top()
const
424 return QMargins::top();
427int QQmlMarginsValueType::right()
const
429 return QMargins::right();
432int QQmlMarginsValueType::bottom()
const
434 return QMargins::bottom();
437void QQmlMarginsValueType::setLeft(
int left)
439 QMargins::setLeft(left);
442void QQmlMarginsValueType::setTop(
int top)
444 QMargins::setTop(top);
447void QQmlMarginsValueType::setRight(
int right)
449 QMargins::setRight(right);
452void QQmlMarginsValueType::setBottom(
int bottom)
454 QMargins::setBottom(bottom);
457#if QT_CONFIG(easingcurve)
458qreal QQmlEasing::valueForProgress(Type type, qreal progress)
const
460 return QEasingCurve(
static_cast<QEasingCurve::Type>(type)).valueForProgress(progress);
463QQmlEasingValueType::QQmlEasingValueType(QQmlEasing::Type type)
464 : QEasingCurve(
static_cast<QEasingCurve::Type>(type))
468qreal QQmlEasingValueType::valueForProgress(qreal progress)
470 return QEasingCurve::valueForProgress(progress);
473QQmlEasing::Type QQmlEasingValueType::type()
const
475 return (QQmlEasing::Type)QEasingCurve::type();
478qreal QQmlEasingValueType::amplitude()
const
480 return QEasingCurve::amplitude();
483qreal QQmlEasingValueType::overshoot()
const
485 return QEasingCurve::overshoot();
488qreal QQmlEasingValueType::period()
const
490 return QEasingCurve::period();
493void QQmlEasingValueType::setType(QQmlEasing::Type type)
495 QEasingCurve::setType((QEasingCurve::Type)type);
498void QQmlEasingValueType::setAmplitude(qreal amplitude)
500 QEasingCurve::setAmplitude(amplitude);
503void QQmlEasingValueType::setOvershoot(qreal overshoot)
505 QEasingCurve::setOvershoot(overshoot);
508void QQmlEasingValueType::setPeriod(qreal period)
510 QEasingCurve::setPeriod(period);
513void QQmlEasingValueType::setBezierCurve(
const QList<qreal> &customCurveVariant)
515 if (customCurveVariant.isEmpty())
518 if ((customCurveVariant.size() % 6) != 0)
521 QEasingCurve newEasingCurve(QEasingCurve::BezierSpline);
522 for (
int i = 0, ei = customCurveVariant.size(); i < ei; i += 6) {
523 const qreal c1x = customCurveVariant.at(i );
524 const qreal c1y = customCurveVariant.at(i + 1);
525 const qreal c2x = customCurveVariant.at(i + 2);
526 const qreal c2y = customCurveVariant.at(i + 3);
527 const qreal c3x = customCurveVariant.at(i + 4);
528 const qreal c3y = customCurveVariant.at(i + 5);
530 const QPointF c1(c1x, c1y);
531 const QPointF c2(c2x, c2y);
532 const QPointF c3(c3x, c3y);
534 newEasingCurve.addCubicBezierSegment(c1, c2, c3);
537 *
this = newEasingCurve;
540QList<qreal> QQmlEasingValueType::bezierCurve()
const
543 const QList<QPointF> points = QEasingCurve::toCubicSpline();
544 rv.reserve(points.size() * 2);
545 for (
const auto &point : points)
546 rv << point.x() << point.y();
554#include "moc_qqmlvaluetype_p.cpp"
Combined button and popup list for selecting options.