Add a battery of 20 qml registration slots

This commit is contained in:
Filippo Cucchetto 2016-01-26 00:10:31 +01:00
parent 8d62c449be
commit 0506920c4b
3 changed files with 106 additions and 49 deletions

View File

@ -5,30 +5,9 @@
#include <QtCore/QObject>
namespace DOS {
class DosIQObjectImpl;
class DosQObject;
class DosQObjectWrapper : public QObject
{
public:
static const QMetaObject staticMetaObject;
DosQObjectWrapper(QObject *parent = nullptr);
~DosQObjectWrapper();
const QMetaObject* metaObject() const override;
int qt_metacall(QMetaObject::Call, int, void **) override;
static CreateDObject createDObject();
static DeleteDObject deleteDObject();
static void setCreateDObject(CreateDObject createDObject);
static void setDeleteDObject(DeleteDObject deleteDObject);
static void setStaticMetaObject(const QMetaObject& metaObject);
private:
void* m_dObject;
DosQObject* m_impl;
static CreateDObject m_createDObject;
static DeleteDObject m_deleteDObject;
};
int dosQmlRegisterType(const char* uri, int major, int minor,
const char* qmlName,
const QMetaObject& staticMetaObject,
CreateDObject createDObject,
DeleteDObject deleteDObject);
}

View File

@ -654,16 +654,6 @@ void dos_qdeclarative_qmlregistertype(const char *uri, int major, int minor,
CreateDObject createDObject,
DeleteDObject deleteDObject)
{
static int i = 0;
auto holder = static_cast<DosIQMetaObjectHolder*>(staticMetaObject);
if (i == 0) {
DosQObjectWrapper::setCreateDObject(createDObject);
DosQObjectWrapper::setDeleteDObject(deleteDObject);
DosQObjectWrapper::setStaticMetaObject(*(holder->data()->metaObject()));
*result = qmlRegisterType<DosQObjectWrapper>(uri, major, minor, qml);
}
++i;
dosQmlRegisterType(uri, major, minor, qml, *(holder->data()->metaObject()), createDObject, deleteDObject);
}

View File

@ -2,14 +2,46 @@
#include "DOtherSide/DosIQObjectImpl.h"
#include "DOtherSide/DosQObject.h"
#include <QDebug>
#include <QtQml>
namespace DOS {
const QMetaObject DosQObjectWrapper::staticMetaObject = QObject::staticMetaObject;
CreateDObject DosQObjectWrapper::m_createDObject;
DeleteDObject DosQObjectWrapper::m_deleteDObject;
template<int>
class DosQObjectWrapper : public QObject
{
public:
static const QMetaObject staticMetaObject;
DosQObjectWrapper::DosQObjectWrapper(QObject *parent)
DosQObjectWrapper(QObject *parent = nullptr);
~DosQObjectWrapper();
const QMetaObject* metaObject() const override;
int qt_metacall(QMetaObject::Call, int, void **) override;
static CreateDObject createDObject();
static DeleteDObject deleteDObject();
static void setCreateDObject(CreateDObject createDObject);
static void setDeleteDObject(DeleteDObject deleteDObject);
static void setStaticMetaObject(const QMetaObject& metaObject);
private:
void* m_dObject;
DosQObject* m_impl;
static CreateDObject m_createDObject;
static DeleteDObject m_deleteDObject;
};
template<int N>
const QMetaObject DosQObjectWrapper<N>::staticMetaObject = QObject::staticMetaObject;
template<int N>
CreateDObject DosQObjectWrapper<N>::m_createDObject;
template<int N>
DeleteDObject DosQObjectWrapper<N>::m_deleteDObject;
template<int N>
DosQObjectWrapper<N>::DosQObjectWrapper(QObject *parent)
: QObject(parent)
, m_dObject(nullptr)
, m_impl(nullptr)
@ -21,36 +53,92 @@ DosQObjectWrapper::DosQObjectWrapper(QObject *parent)
Q_ASSERT(m_impl);
}
DosQObjectWrapper::~DosQObjectWrapper()
template<int N>
DosQObjectWrapper<N>::~DosQObjectWrapper()
{
m_deleteDObject(m_dObject);
m_dObject = nullptr;
m_impl = nullptr;
}
const QMetaObject *DosQObjectWrapper::metaObject() const
template<int N>
const QMetaObject *DosQObjectWrapper<N>::metaObject() const
{
Q_ASSERT(m_impl);
return m_impl->metaObject();
}
int DosQObjectWrapper::qt_metacall(QMetaObject::Call call, int index, void **args)
template<int N>
int DosQObjectWrapper<N>::qt_metacall(QMetaObject::Call call, int index, void **args)
{
Q_ASSERT(m_impl);
return m_impl->qt_metacall(call, index, args);
}
CreateDObject DosQObjectWrapper::createDObject() { return m_createDObject; }
template<int N>
CreateDObject DosQObjectWrapper<N>::createDObject() { return m_createDObject; }
DeleteDObject DosQObjectWrapper::deleteDObject() { return m_deleteDObject; }
template<int N>
DeleteDObject DosQObjectWrapper<N>::deleteDObject() { return m_deleteDObject; }
void DosQObjectWrapper::setCreateDObject(CreateDObject createDObject) { m_createDObject = createDObject; }
template<int N>
void DosQObjectWrapper<N>::setCreateDObject(CreateDObject createDObject) { m_createDObject = createDObject; }
void DosQObjectWrapper::setDeleteDObject(DeleteDObject deleteDObject) { m_deleteDObject = deleteDObject; }
template<int N>
void DosQObjectWrapper<N>::setDeleteDObject(DeleteDObject deleteDObject) { m_deleteDObject = deleteDObject; }
void DosQObjectWrapper::setStaticMetaObject(const QMetaObject &metaObject)
template<int N>
void DosQObjectWrapper<N>::setStaticMetaObject(const QMetaObject &metaObject)
{
*(const_cast<QMetaObject*>(&staticMetaObject)) = metaObject;
}
template<int N>
int dosQmlRegisterType(const char *uri, int major, int minor,
const char *qmlName, const QMetaObject& staticMetaObject,
CreateDObject createDObject,
DeleteDObject deleteDObject)
{
DosQObjectWrapper<N>::setCreateDObject(std::move(createDObject));
DosQObjectWrapper<N>::setDeleteDObject(std::move(deleteDObject));
DosQObjectWrapper<N>::setStaticMetaObject(staticMetaObject);
return qmlRegisterType<DosQObjectWrapper<N>>(uri, major, minor, qmlName);
}
int dosQmlRegisterType(const char *uri, int major, int minor,
const char *qmlName, const QMetaObject& staticMetaObject,
CreateDObject createDObject,
DeleteDObject deleteDObject)
{
static int i = 0;
switch (i++)
{
case 0: return dosQmlRegisterType<0>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 1: return dosQmlRegisterType<1>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 2: return dosQmlRegisterType<2>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 3: return dosQmlRegisterType<3>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 4: return dosQmlRegisterType<4>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 5: return dosQmlRegisterType<5>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 6: return dosQmlRegisterType<6>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 7: return dosQmlRegisterType<7>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 8: return dosQmlRegisterType<8>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 9: return dosQmlRegisterType<9>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 10: return dosQmlRegisterType<10>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 11: return dosQmlRegisterType<11>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 12: return dosQmlRegisterType<12>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 13: return dosQmlRegisterType<13>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 14: return dosQmlRegisterType<14>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 15: return dosQmlRegisterType<15>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 16: return dosQmlRegisterType<16>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 17: return dosQmlRegisterType<17>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 18: return dosQmlRegisterType<18>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 19: return dosQmlRegisterType<19>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
case 20: return dosQmlRegisterType<20>(uri, major, minor, qmlName, staticMetaObject, createDObject, deleteDObject);
default: return -1;
}
}
}