diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2020-11-06 15:13:27 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2020-11-11 11:37:49 +0100 |
commit | f0908255c9921371d886eff0b8ce245929b50d88 (patch) | |
tree | b246bca2fcdae9ee906acc6e2b54a874b36734ea /src/qml/jsruntime | |
parent | 40c0cbda771e9888999d8b78179e9600de4e7795 (diff) |
QtQml: Integrate sequences with registration macros
You get to write QML_SEQUENTIAL_CONTAINER(value_type) now, and
qmltyperegistrar will generate a sensible registration call from that.
A registration might look like this:
struct MyStringListForeign
{
Q_GADGET
QML_ANONYMOUS
QML_SEQUENTIAL_CONTAINER(QString)
QML_FOREIGN(MyStringList)
QML_ADDED_IN_VERSION(3, 1)
};
It's unfortunate that we need to use a metaobject to transfer all of
this information, but there is no other sensible way.
Transform the containers defined in qv4sequenceobject.cpp to use the new
style, and move them out of the builtins, into QtQml. Recognize that
only one of them was ever tested, and add tests for the rest.
Task-number: QTBUG-82443
Change-Id: I3a30f9e27266bb575eea26c5daf5dad1ec461cc5
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qml/jsruntime')
-rw-r--r-- | src/qml/jsruntime/qv4engine.cpp | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4sequenceobject.cpp | 33 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4sequenceobject_p.h | 46 |
3 files changed, 45 insertions, 36 deletions
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp index fe34207ddc..b09f874ef3 100644 --- a/src/qml/jsruntime/qv4engine.cpp +++ b/src/qml/jsruntime/qv4engine.cpp @@ -709,8 +709,6 @@ ExecutionEngine::ExecutionEngine(QJSEngine *jsEngine) static_cast<VariantPrototype *>(variantPrototype())->init(); #if QT_CONFIG(qml_sequence_object) - static const bool registered = QV4::SequencePrototype::registerDefaultTypes(); - Q_UNUSED(registered); sequencePrototype()->cast<SequencePrototype>()->init(); #endif diff --git a/src/qml/jsruntime/qv4sequenceobject.cpp b/src/qml/jsruntime/qv4sequenceobject.cpp index 5c7f8289f2..73fa2385fd 100644 --- a/src/qml/jsruntime/qv4sequenceobject.cpp +++ b/src/qml/jsruntime/qv4sequenceobject.cpp @@ -37,7 +37,6 @@ ** ****************************************************************************/ -#include <QtQml/qqml.h> #include <QtCore/qsequentialiterable.h> #include "qv4sequenceobject_p.h" @@ -51,10 +50,6 @@ #include "qv4objectiterator_p.h" #include <private/qqmlmetatype_p.h> #include <private/qqmltype_p_p.h> -#if QT_CONFIG(qml_itemmodel) -#include <private/qqmlmodelindexvaluetype_p.h> -#include <QtCore/qabstractitemmodel.h> -#endif #include <algorithm> @@ -581,34 +576,6 @@ namespace QV4 { DEFINE_OBJECT_VTABLE(QV4Sequence); } - -template<typename SequenceType> -void registerSequenceType() -{ - qRegisterMetaType<SequenceType>(); - qmlRegisterAnonymousSequentialContainer<SequenceType>("QML", 1); -} - -bool SequencePrototype::registerDefaultTypes() -{ - registerSequenceType<std::vector<int>>(); - registerSequenceType<std::vector<qreal>>(); - registerSequenceType<std::vector<bool>>(); - registerSequenceType<QList<int>>(); - registerSequenceType<QList<qreal>>(); - registerSequenceType<QList<bool>>(); - registerSequenceType<QStringList>(); - registerSequenceType<std::vector<QString>>(); - registerSequenceType<QList<QUrl>>(); - registerSequenceType<std::vector<QUrl>>(); -#if QT_CONFIG(qml_itemmodel) - registerSequenceType<QModelIndexList>(); - registerSequenceType<std::vector<QModelIndex>>(); - registerSequenceType<QItemSelection>(); -#endif - return true; -} - void SequencePrototype::init() { defineDefaultProperty(QStringLiteral("sort"), method_sort, 1); diff --git a/src/qml/jsruntime/qv4sequenceobject_p.h b/src/qml/jsruntime/qv4sequenceobject_p.h index 6229a4b5ec..9143430872 100644 --- a/src/qml/jsruntime/qv4sequenceobject_p.h +++ b/src/qml/jsruntime/qv4sequenceobject_p.h @@ -53,12 +53,18 @@ #include <QtCore/qglobal.h> #include <QtCore/qvariant.h> +#include <QtQml/qqml.h> #include "qv4value_p.h" #include "qv4object_p.h" #include "qv4context_p.h" #include "qv4string_p.h" +#if QT_CONFIG(qml_itemmodel) +#include <private/qqmlmodelindexvaluetype_p.h> +#include <QtCore/qabstractitemmodel.h> +#endif + QT_REQUIRE_CONFIG(qml_sequence_object); QT_BEGIN_NAMESPACE @@ -68,7 +74,6 @@ namespace QV4 { struct Q_QML_PRIVATE_EXPORT SequencePrototype : public QV4::Object { V4_PROTOTYPE(arrayPrototype) - static bool registerDefaultTypes(); void init(); static ReturnedValue method_valueOf(const FunctionObject *, const Value *thisObject, const Value *argv, int argc); @@ -84,6 +89,45 @@ struct Q_QML_PRIVATE_EXPORT SequencePrototype : public QV4::Object } +#define QT_DECLARE_SEQUENTIAL_CONTAINER(LOCAL, FOREIGN, VALUE) \ + struct LOCAL \ + { \ + Q_GADGET \ + QML_ANONYMOUS \ + QML_SEQUENTIAL_CONTAINER(VALUE) \ + QML_FOREIGN(FOREIGN) \ + QML_ADDED_IN_VERSION(2, 0) \ + } + +// We use the original QT_COORD_TYPE name because that will match up with relevant other +// types in plugins.qmltypes (if you use either float or double, that is; otherwise you're +// on your own). +#ifdef QT_COORD_TYPE +QT_DECLARE_SEQUENTIAL_CONTAINER(QStdRealVectorForeign, std::vector<qreal>, QT_COORD_TYPE); +QT_DECLARE_SEQUENTIAL_CONTAINER(QRealListForeign, QList<qreal>, QT_COORD_TYPE); +#else +QT_DECLARE_SEQUENTIAL_CONTAINER(QRealStdVectorForeign, std::vector<qreal>, double); +QT_DECLARE_SEQUENTIAL_CONTAINER(QRealListForeign, QList<qreal>, double); +#endif + +QT_DECLARE_SEQUENTIAL_CONTAINER(QIntStdVectorForeign, std::vector<int>, int); +QT_DECLARE_SEQUENTIAL_CONTAINER(QBoolStdVectorForeign, std::vector<bool>, bool); +QT_DECLARE_SEQUENTIAL_CONTAINER(QStringStdVectorForeign, std::vector<QString>, QString); +QT_DECLARE_SEQUENTIAL_CONTAINER(QUrlStdVectorForeign, std::vector<QUrl>, QUrl); + +QT_DECLARE_SEQUENTIAL_CONTAINER(QIntListForeign, QList<int>, int); +QT_DECLARE_SEQUENTIAL_CONTAINER(QBoolListForeign, QList<bool>, bool); +QT_DECLARE_SEQUENTIAL_CONTAINER(QStringListForeign, QStringList, QString); +QT_DECLARE_SEQUENTIAL_CONTAINER(QUrlListForeign, QList<QUrl>, QUrl); + +#if QT_CONFIG(qml_itemmodel) +QT_DECLARE_SEQUENTIAL_CONTAINER(QModelIndexListForeign, QModelIndexList, QModelIndex); +QT_DECLARE_SEQUENTIAL_CONTAINER(QModelIndexStdVectorForeign, std::vector<QModelIndex>, QModelIndex); +QT_DECLARE_SEQUENTIAL_CONTAINER(QItemSelectionForeign, QItemSelection, QItemSelectionRange); +#endif + +#undef QT_DECLARE_SEQUENTIAL_CONTAINER + QT_END_NAMESPACE #endif // QV4SEQUENCEWRAPPER_P_H |