1 /****************************************************************************
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
7 ** This file is part of the QtDeclarative module of the Qt Toolkit.
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** No Commercial Usage
11 ** This file contains pre-release code and may not be distributed.
12 ** You may use this file in accordance with the terms and conditions
13 ** contained in the Technology Preview License Agreement accompanying
16 ** GNU Lesser General Public License Usage
17 ** Alternatively, this file may be used under the terms of the GNU Lesser
18 ** General Public License version 2.1 as published by the Free Software
19 ** Foundation and appearing in the file LICENSE.LGPL included in the
20 ** packaging of this file. Please review the following information to
21 ** ensure the GNU Lesser General Public License version 2.1 requirements
22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24 ** In addition, as a special exception, Nokia gives you certain additional
25 ** rights. These rights are described in the Nokia Qt LGPL Exception
26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28 ** If you have questions regarding the use of this file, please contact
29 ** Nokia at qt-info@nokia.com.
40 ****************************************************************************/
42 #include "private/qdeclarativevaluetype_p.h"
44 #include "private/qdeclarativemetatype_p.h"
45 #include "private/qfont_p.h"
47 #include <QtCore/qdebug.h>
52 int qmlRegisterValueTypeEnums(const char *uri, int versionMajor, int versionMinor, const char *qmlName)
54 QByteArray name(T::staticMetaObject.className());
56 QByteArray pointerName(name + '*');
58 QDeclarativePrivate::RegisterType type = {
61 qRegisterMetaType<T *>(pointerName.constData()), 0, 0, 0,
65 uri, versionMajor, versionMinor, qmlName, &T::staticMetaObject,
77 return QDeclarativePrivate::qmlregister(QDeclarativePrivate::TypeRegistration, &type);
80 QDeclarativeValueTypeFactory::QDeclarativeValueTypeFactory()
83 for (unsigned int ii = 0; ii < (QVariant::UserType - 1); ++ii)
84 valueTypes[ii] = valueType(ii);
87 QDeclarativeValueTypeFactory::~QDeclarativeValueTypeFactory()
89 for (unsigned int ii = 0; ii < (QVariant::UserType - 1); ++ii)
90 delete valueTypes[ii];
93 bool QDeclarativeValueTypeFactory::isValueType(int idx)
95 if ((uint)idx < QVariant::UserType)
100 void QDeclarativeValueTypeFactory::registerValueTypes()
102 qmlRegisterValueTypeEnums<QDeclarativeEasingValueType>("QtQuick",1,0,"Easing");
103 qmlRegisterValueTypeEnums<QDeclarativeFontValueType>("QtQuick",1,0,"Font");
104 #ifndef QT_NO_IMPORT_QT47_QML
105 qmlRegisterValueTypeEnums<QDeclarativeEasingValueType>("Qt",4,7,"Easing");
106 qmlRegisterValueTypeEnums<QDeclarativeFontValueType>("Qt",4,7,"Font");
110 QDeclarativeValueType *QDeclarativeValueTypeFactory::valueType(int t)
112 QDeclarativeValueType *rv = 0;
115 case QVariant::Point:
116 rv = new QDeclarativePointValueType;
118 case QVariant::PointF:
119 rv = new QDeclarativePointFValueType;
122 rv = new QDeclarativeSizeValueType;
124 case QVariant::SizeF:
125 rv = new QDeclarativeSizeFValueType;
128 rv = new QDeclarativeRectValueType;
130 case QVariant::RectF:
131 rv = new QDeclarativeRectFValueType;
133 case QVariant::Vector2D:
134 rv = new QDeclarativeVector2DValueType;
136 case QVariant::Vector3D:
137 rv = new QDeclarativeVector3DValueType;
139 case QVariant::Vector4D:
140 rv = new QDeclarativeVector4DValueType;
142 case QVariant::Quaternion:
143 rv = new QDeclarativeQuaternionValueType;
145 case QVariant::Matrix4x4:
146 rv = new QDeclarativeMatrix4x4ValueType;
148 case QVariant::EasingCurve:
149 rv = new QDeclarativeEasingValueType;
152 rv = new QDeclarativeFontValueType;
158 Q_ASSERT(!rv || rv->metaObject()->propertyCount() < 32);
162 QDeclarativeValueType::QDeclarativeValueType(QObject *parent)
167 QDeclarativePointFValueType::QDeclarativePointFValueType(QObject *parent)
168 : QDeclarativeValueType(parent)
172 void QDeclarativePointFValueType::read(QObject *obj, int idx)
174 void *a[] = { &point, 0 };
175 QMetaObject::metacall(obj, QMetaObject::ReadProperty, idx, a);
178 void QDeclarativePointFValueType::write(QObject *obj, int idx, QDeclarativePropertyPrivate::WriteFlags flags)
181 void *a[] = { &point, 0, &status, &flags };
182 QMetaObject::metacall(obj, QMetaObject::WriteProperty, idx, a);
185 QVariant QDeclarativePointFValueType::value()
187 return QVariant(point);
190 void QDeclarativePointFValueType::setValue(QVariant value)
192 point = qvariant_cast<QPointF>(value);
195 qreal QDeclarativePointFValueType::x() const
200 qreal QDeclarativePointFValueType::y() const
205 void QDeclarativePointFValueType::setX(qreal x)
210 void QDeclarativePointFValueType::setY(qreal y)
215 QDeclarativePointValueType::QDeclarativePointValueType(QObject *parent)
216 : QDeclarativeValueType(parent)
220 void QDeclarativePointValueType::read(QObject *obj, int idx)
222 void *a[] = { &point, 0 };
223 QMetaObject::metacall(obj, QMetaObject::ReadProperty, idx, a);
226 void QDeclarativePointValueType::write(QObject *obj, int idx, QDeclarativePropertyPrivate::WriteFlags flags)
229 void *a[] = { &point, 0, &status, &flags };
230 QMetaObject::metacall(obj, QMetaObject::WriteProperty, idx, a);
233 QVariant QDeclarativePointValueType::value()
235 return QVariant(point);
238 void QDeclarativePointValueType::setValue(QVariant value)
240 point = qvariant_cast<QPoint>(value);
243 int QDeclarativePointValueType::x() const
248 int QDeclarativePointValueType::y() const
253 void QDeclarativePointValueType::setX(int x)
258 void QDeclarativePointValueType::setY(int y)
263 QDeclarativeSizeFValueType::QDeclarativeSizeFValueType(QObject *parent)
264 : QDeclarativeValueType(parent)
268 void QDeclarativeSizeFValueType::read(QObject *obj, int idx)
270 void *a[] = { &size, 0 };
271 QMetaObject::metacall(obj, QMetaObject::ReadProperty, idx, a);
274 void QDeclarativeSizeFValueType::write(QObject *obj, int idx, QDeclarativePropertyPrivate::WriteFlags flags)
277 void *a[] = { &size, 0, &status, &flags };
278 QMetaObject::metacall(obj, QMetaObject::WriteProperty, idx, a);
281 QVariant QDeclarativeSizeFValueType::value()
283 return QVariant(size);
286 void QDeclarativeSizeFValueType::setValue(QVariant value)
288 size = qvariant_cast<QSizeF>(value);
291 qreal QDeclarativeSizeFValueType::width() const
296 qreal QDeclarativeSizeFValueType::height() const
298 return size.height();
301 void QDeclarativeSizeFValueType::setWidth(qreal w)
306 void QDeclarativeSizeFValueType::setHeight(qreal h)
311 QDeclarativeSizeValueType::QDeclarativeSizeValueType(QObject *parent)
312 : QDeclarativeValueType(parent)
316 void QDeclarativeSizeValueType::read(QObject *obj, int idx)
318 void *a[] = { &size, 0 };
319 QMetaObject::metacall(obj, QMetaObject::ReadProperty, idx, a);
322 void QDeclarativeSizeValueType::write(QObject *obj, int idx, QDeclarativePropertyPrivate::WriteFlags flags)
325 void *a[] = { &size, 0, &status, &flags };
326 QMetaObject::metacall(obj, QMetaObject::WriteProperty, idx, a);
329 QVariant QDeclarativeSizeValueType::value()
331 return QVariant(size);
334 void QDeclarativeSizeValueType::setValue(QVariant value)
336 size = qvariant_cast<QSize>(value);
339 int QDeclarativeSizeValueType::width() const
344 int QDeclarativeSizeValueType::height() const
346 return size.height();
349 void QDeclarativeSizeValueType::setWidth(int w)
354 void QDeclarativeSizeValueType::setHeight(int h)
359 QDeclarativeRectFValueType::QDeclarativeRectFValueType(QObject *parent)
360 : QDeclarativeValueType(parent)
364 void QDeclarativeRectFValueType::read(QObject *obj, int idx)
366 void *a[] = { &rect, 0 };
367 QMetaObject::metacall(obj, QMetaObject::ReadProperty, idx, a);
370 void QDeclarativeRectFValueType::write(QObject *obj, int idx, QDeclarativePropertyPrivate::WriteFlags flags)
373 void *a[] = { &rect, 0, &status, &flags };
374 QMetaObject::metacall(obj, QMetaObject::WriteProperty, idx, a);
377 QVariant QDeclarativeRectFValueType::value()
379 return QVariant(rect);
382 void QDeclarativeRectFValueType::setValue(QVariant value)
384 rect = qvariant_cast<QRectF>(value);
387 qreal QDeclarativeRectFValueType::x() const
392 qreal QDeclarativeRectFValueType::y() const
397 void QDeclarativeRectFValueType::setX(qreal x)
402 void QDeclarativeRectFValueType::setY(qreal y)
407 qreal QDeclarativeRectFValueType::width() const
412 qreal QDeclarativeRectFValueType::height() const
414 return rect.height();
417 void QDeclarativeRectFValueType::setWidth(qreal w)
422 void QDeclarativeRectFValueType::setHeight(qreal h)
427 QDeclarativeRectValueType::QDeclarativeRectValueType(QObject *parent)
428 : QDeclarativeValueType(parent)
432 void QDeclarativeRectValueType::read(QObject *obj, int idx)
434 void *a[] = { &rect, 0 };
435 QMetaObject::metacall(obj, QMetaObject::ReadProperty, idx, a);
438 void QDeclarativeRectValueType::write(QObject *obj, int idx, QDeclarativePropertyPrivate::WriteFlags flags)
441 void *a[] = { &rect, 0, &status, &flags };
442 QMetaObject::metacall(obj, QMetaObject::WriteProperty, idx, a);
445 QVariant QDeclarativeRectValueType::value()
447 return QVariant(rect);
450 void QDeclarativeRectValueType::setValue(QVariant value)
452 rect = qvariant_cast<QRect>(value);
455 int QDeclarativeRectValueType::x() const
460 int QDeclarativeRectValueType::y() const
465 void QDeclarativeRectValueType::setX(int x)
470 void QDeclarativeRectValueType::setY(int y)
475 int QDeclarativeRectValueType::width() const
480 int QDeclarativeRectValueType::height() const
482 return rect.height();
485 void QDeclarativeRectValueType::setWidth(int w)
490 void QDeclarativeRectValueType::setHeight(int h)
495 QDeclarativeVector2DValueType::QDeclarativeVector2DValueType(QObject *parent)
496 : QDeclarativeValueType(parent)
500 void QDeclarativeVector2DValueType::read(QObject *obj, int idx)
502 void *a[] = { &vector, 0 };
503 QMetaObject::metacall(obj, QMetaObject::ReadProperty, idx, a);
506 void QDeclarativeVector2DValueType::write(QObject *obj, int idx, QDeclarativePropertyPrivate::WriteFlags flags)
509 void *a[] = { &vector, 0, &status, &flags };
510 QMetaObject::metacall(obj, QMetaObject::WriteProperty, idx, a);
513 QVariant QDeclarativeVector2DValueType::value()
515 return QVariant(vector);
518 void QDeclarativeVector2DValueType::setValue(QVariant value)
520 vector = qvariant_cast<QVector2D>(value);
523 qreal QDeclarativeVector2DValueType::x() const
528 qreal QDeclarativeVector2DValueType::y() const
533 void QDeclarativeVector2DValueType::setX(qreal x)
538 void QDeclarativeVector2DValueType::setY(qreal y)
543 QDeclarativeVector3DValueType::QDeclarativeVector3DValueType(QObject *parent)
544 : QDeclarativeValueType(parent)
548 void QDeclarativeVector3DValueType::read(QObject *obj, int idx)
550 void *a[] = { &vector, 0 };
551 QMetaObject::metacall(obj, QMetaObject::ReadProperty, idx, a);
554 void QDeclarativeVector3DValueType::write(QObject *obj, int idx, QDeclarativePropertyPrivate::WriteFlags flags)
557 void *a[] = { &vector, 0, &status, &flags };
558 QMetaObject::metacall(obj, QMetaObject::WriteProperty, idx, a);
561 QVariant QDeclarativeVector3DValueType::value()
563 return QVariant(vector);
566 void QDeclarativeVector3DValueType::setValue(QVariant value)
568 vector = qvariant_cast<QVector3D>(value);
571 qreal QDeclarativeVector3DValueType::x() const
576 qreal QDeclarativeVector3DValueType::y() const
581 qreal QDeclarativeVector3DValueType::z() const
586 void QDeclarativeVector3DValueType::setX(qreal x)
591 void QDeclarativeVector3DValueType::setY(qreal y)
596 void QDeclarativeVector3DValueType::setZ(qreal z)
601 QDeclarativeVector4DValueType::QDeclarativeVector4DValueType(QObject *parent)
602 : QDeclarativeValueType(parent)
606 void QDeclarativeVector4DValueType::read(QObject *obj, int idx)
608 void *a[] = { &vector, 0 };
609 QMetaObject::metacall(obj, QMetaObject::ReadProperty, idx, a);
612 void QDeclarativeVector4DValueType::write(QObject *obj, int idx, QDeclarativePropertyPrivate::WriteFlags flags)
615 void *a[] = { &vector, 0, &status, &flags };
616 QMetaObject::metacall(obj, QMetaObject::WriteProperty, idx, a);
619 QVariant QDeclarativeVector4DValueType::value()
621 return QVariant(vector);
624 void QDeclarativeVector4DValueType::setValue(QVariant value)
626 vector = qvariant_cast<QVector4D>(value);
629 qreal QDeclarativeVector4DValueType::x() const
634 qreal QDeclarativeVector4DValueType::y() const
639 qreal QDeclarativeVector4DValueType::z() const
644 qreal QDeclarativeVector4DValueType::w() const
649 void QDeclarativeVector4DValueType::setX(qreal x)
654 void QDeclarativeVector4DValueType::setY(qreal y)
659 void QDeclarativeVector4DValueType::setZ(qreal z)
664 void QDeclarativeVector4DValueType::setW(qreal w)
669 QDeclarativeQuaternionValueType::QDeclarativeQuaternionValueType(QObject *parent)
670 : QDeclarativeValueType(parent)
674 void QDeclarativeQuaternionValueType::read(QObject *obj, int idx)
676 void *a[] = { &quaternion, 0 };
677 QMetaObject::metacall(obj, QMetaObject::ReadProperty, idx, a);
680 void QDeclarativeQuaternionValueType::write(QObject *obj, int idx, QDeclarativePropertyPrivate::WriteFlags flags)
683 void *a[] = { &quaternion, 0, &status, &flags };
684 QMetaObject::metacall(obj, QMetaObject::WriteProperty, idx, a);
687 QVariant QDeclarativeQuaternionValueType::value()
689 return QVariant(quaternion);
692 void QDeclarativeQuaternionValueType::setValue(QVariant value)
694 quaternion = qvariant_cast<QQuaternion>(value);
697 qreal QDeclarativeQuaternionValueType::scalar() const
699 return quaternion.scalar();
702 qreal QDeclarativeQuaternionValueType::x() const
704 return quaternion.x();
707 qreal QDeclarativeQuaternionValueType::y() const
709 return quaternion.y();
712 qreal QDeclarativeQuaternionValueType::z() const
714 return quaternion.z();
717 void QDeclarativeQuaternionValueType::setScalar(qreal scalar)
719 quaternion.setScalar(scalar);
722 void QDeclarativeQuaternionValueType::setX(qreal x)
727 void QDeclarativeQuaternionValueType::setY(qreal y)
732 void QDeclarativeQuaternionValueType::setZ(qreal z)
737 QDeclarativeMatrix4x4ValueType::QDeclarativeMatrix4x4ValueType(QObject *parent)
738 : QDeclarativeValueType(parent)
742 void QDeclarativeMatrix4x4ValueType::read(QObject *obj, int idx)
744 void *a[] = { &matrix, 0 };
745 QMetaObject::metacall(obj, QMetaObject::ReadProperty, idx, a);
748 void QDeclarativeMatrix4x4ValueType::write(QObject *obj, int idx, QDeclarativePropertyPrivate::WriteFlags flags)
751 void *a[] = { &matrix, 0, &status, &flags };
752 QMetaObject::metacall(obj, QMetaObject::WriteProperty, idx, a);
755 QVariant QDeclarativeMatrix4x4ValueType::value()
757 return QVariant(matrix);
760 void QDeclarativeMatrix4x4ValueType::setValue(QVariant value)
762 matrix = qvariant_cast<QMatrix4x4>(value);
765 QDeclarativeEasingValueType::QDeclarativeEasingValueType(QObject *parent)
766 : QDeclarativeValueType(parent)
770 void QDeclarativeEasingValueType::read(QObject *obj, int idx)
772 void *a[] = { &easing, 0 };
773 QMetaObject::metacall(obj, QMetaObject::ReadProperty, idx, a);
776 void QDeclarativeEasingValueType::write(QObject *obj, int idx, QDeclarativePropertyPrivate::WriteFlags flags)
779 void *a[] = { &easing, 0, &status, &flags };
780 QMetaObject::metacall(obj, QMetaObject::WriteProperty, idx, a);
783 QVariant QDeclarativeEasingValueType::value()
785 return QVariant(easing);
788 void QDeclarativeEasingValueType::setValue(QVariant value)
790 easing = qvariant_cast<QEasingCurve>(value);
793 QDeclarativeEasingValueType::Type QDeclarativeEasingValueType::type() const
795 return (QDeclarativeEasingValueType::Type)easing.type();
798 qreal QDeclarativeEasingValueType::amplitude() const
800 return easing.amplitude();
803 qreal QDeclarativeEasingValueType::overshoot() const
805 return easing.overshoot();
808 qreal QDeclarativeEasingValueType::period() const
810 return easing.period();
813 void QDeclarativeEasingValueType::setType(QDeclarativeEasingValueType::Type type)
815 easing.setType((QEasingCurve::Type)type);
818 void QDeclarativeEasingValueType::setAmplitude(qreal amplitude)
820 easing.setAmplitude(amplitude);
823 void QDeclarativeEasingValueType::setOvershoot(qreal overshoot)
825 easing.setOvershoot(overshoot);
828 void QDeclarativeEasingValueType::setPeriod(qreal period)
830 easing.setPeriod(period);
833 QDeclarativeFontValueType::QDeclarativeFontValueType(QObject *parent)
834 : QDeclarativeValueType(parent), pixelSizeSet(false), pointSizeSet(false)
838 void QDeclarativeFontValueType::read(QObject *obj, int idx)
840 void *a[] = { &font, 0 };
841 QMetaObject::metacall(obj, QMetaObject::ReadProperty, idx, a);
842 pixelSizeSet = false;
843 pointSizeSet = false;
846 void QDeclarativeFontValueType::write(QObject *obj, int idx, QDeclarativePropertyPrivate::WriteFlags flags)
849 void *a[] = { &font, 0, &status, &flags };
850 QMetaObject::metacall(obj, QMetaObject::WriteProperty, idx, a);
853 QVariant QDeclarativeFontValueType::value()
855 return QVariant(font);
858 void QDeclarativeFontValueType::setValue(QVariant value)
860 font = qvariant_cast<QFont>(value);
864 QString QDeclarativeFontValueType::family() const
866 return font.family();
869 void QDeclarativeFontValueType::setFamily(const QString &family)
871 font.setFamily(family);
874 bool QDeclarativeFontValueType::bold() const
879 void QDeclarativeFontValueType::setBold(bool b)
884 QDeclarativeFontValueType::FontWeight QDeclarativeFontValueType::weight() const
886 return (QDeclarativeFontValueType::FontWeight)font.weight();
889 void QDeclarativeFontValueType::setWeight(QDeclarativeFontValueType::FontWeight w)
891 font.setWeight((QFont::Weight)w);
894 bool QDeclarativeFontValueType::italic() const
896 return font.italic();
899 void QDeclarativeFontValueType::setItalic(bool b)
904 bool QDeclarativeFontValueType::underline() const
906 return font.underline();
909 void QDeclarativeFontValueType::setUnderline(bool b)
911 font.setUnderline(b);
914 bool QDeclarativeFontValueType::overline() const
916 return font.overline();
919 void QDeclarativeFontValueType::setOverline(bool b)
924 bool QDeclarativeFontValueType::strikeout() const
926 return font.strikeOut();
929 void QDeclarativeFontValueType::setStrikeout(bool b)
931 font.setStrikeOut(b);
934 qreal QDeclarativeFontValueType::pointSize() const
936 if (font.pointSizeF() == -1) {
938 dpi = qt_defaultDpi();
939 return font.pixelSize() * qreal(72.) / qreal(dpi);
941 return font.pointSizeF();
944 void QDeclarativeFontValueType::setPointSize(qreal size)
947 qWarning() << "Both point size and pixel size set. Using pixel size.";
953 font.setPointSizeF(size);
955 pointSizeSet = false;
959 int QDeclarativeFontValueType::pixelSize() const
961 if (font.pixelSize() == -1) {
963 dpi = qt_defaultDpi();
964 return (font.pointSizeF() * dpi) / qreal(72.);
966 return font.pixelSize();
969 void QDeclarativeFontValueType::setPixelSize(int size)
973 qWarning() << "Both point size and pixel size set. Using pixel size.";
974 font.setPixelSize(size);
977 pixelSizeSet = false;
981 QDeclarativeFontValueType::Capitalization QDeclarativeFontValueType::capitalization() const
983 return (QDeclarativeFontValueType::Capitalization)font.capitalization();
986 void QDeclarativeFontValueType::setCapitalization(QDeclarativeFontValueType::Capitalization c)
988 font.setCapitalization((QFont::Capitalization)c);
991 qreal QDeclarativeFontValueType::letterSpacing() const
993 return font.letterSpacing();
996 void QDeclarativeFontValueType::setLetterSpacing(qreal size)
998 font.setLetterSpacing(QFont::AbsoluteSpacing, size);
1001 qreal QDeclarativeFontValueType::wordSpacing() const
1003 return font.wordSpacing();
1006 void QDeclarativeFontValueType::setWordSpacing(qreal size)
1008 font.setWordSpacing(size);