mirror of
https://github.com/status-im/dotherside.git
synced 2025-02-11 20:16:47 +00:00
Possible Fix 2 by swapping the qobject
This commit is contained in:
parent
7f1f91a71e
commit
c271423009
@ -25,7 +25,7 @@ typedef void(*SetDataCallback) (void *model, const void *index, const void *valu
|
||||
typedef void(*RoleNamesCallback)(void *model, QHashIntQByteArrayVoidPtr result);
|
||||
typedef void(*FlagsCallback) (void *model, const void *index, int *result);
|
||||
typedef void(*HeaderDataCallback) (void *model, int section, int orientation, int role, QVariantVoidPtr result);
|
||||
typedef void(*CreateDObject)(int, void **, void **);
|
||||
typedef void(*CreateDObject)(int, void*, void **, void **);
|
||||
typedef void(*DeleteDObject)(int, void *);
|
||||
|
||||
struct QmlRegisterType {
|
||||
|
@ -11,7 +11,7 @@ public:
|
||||
virtual ~DosIQObjectImpl() = default;
|
||||
|
||||
/// Emit the signal with the given name and arguments
|
||||
virtual bool emitSignal(const QString &name, const std::vector<QVariant> &argumentsValues) = 0;
|
||||
virtual bool emitSignal(QObject* emitter, const QString &name, const std::vector<QVariant> &argumentsValues) = 0;
|
||||
|
||||
/// Return the metaObject
|
||||
virtual const QMetaObject *metaObject() const = 0;
|
||||
|
@ -25,7 +25,7 @@ public:
|
||||
HeaderDataCallback headerDataCallback);
|
||||
|
||||
/// @see IDynamicQObject::emitSignal
|
||||
bool emitSignal(const QString &name, const std::vector<QVariant> &argumentsValues) override;
|
||||
bool emitSignal(QObject* emitter, const QString &name, const std::vector<QVariant> &argumentsValues) override;
|
||||
|
||||
/// @see QAbstractListModel::metaObject()
|
||||
const QMetaObject *metaObject() const override;
|
||||
|
@ -18,7 +18,7 @@ public:
|
||||
OnSlotExecuted onSlotExecuted);
|
||||
|
||||
/// Emit a signal
|
||||
bool emitSignal(const QString &name, const std::vector<QVariant> &arguments) override;
|
||||
bool emitSignal(QObject* emitter, const QString &name, const std::vector<QVariant> &arguments) override;
|
||||
|
||||
/// Return the metaObject
|
||||
const QMetaObject *metaObject() const override;
|
||||
|
@ -27,7 +27,7 @@ public:
|
||||
|
||||
|
||||
/// @see IDosQObject::emitSignal
|
||||
bool emitSignal(const QString &name, const std::vector<QVariant> &arguments) override;
|
||||
bool emitSignal(QObject* emitter, const QString &name, const std::vector<QVariant> &arguments) override;
|
||||
|
||||
/// @see IDosQObject::metaObject()
|
||||
const QMetaObject *metaObject() const override;
|
||||
|
@ -359,7 +359,7 @@ void dos_qobject_signal_emit(void *vptr, const char *name, int parametersCount,
|
||||
|
||||
auto transformation = [](void *vptr)->QVariant{return *(static_cast<QVariant *>(vptr));};
|
||||
const std::vector<QVariant> variants = toVector(parameters, parametersCount, transformation);
|
||||
dynamicQObject->emitSignal(QString::fromStdString(name), variants);
|
||||
dynamicQObject->emitSignal(qobject, QString::fromStdString(name), variants);
|
||||
}
|
||||
|
||||
void dos_qobject_signal_connect(void *senderVPtr,
|
||||
|
@ -34,10 +34,10 @@ DosQAbstractListModel::DosQAbstractListModel(void *modelObject,
|
||||
{
|
||||
}
|
||||
|
||||
bool DosQAbstractListModel::emitSignal(const QString &name, const std::vector<QVariant> &argumentsValues)
|
||||
bool DosQAbstractListModel::emitSignal(QObject *emitter, const QString &name, const std::vector<QVariant> &argumentsValues)
|
||||
{
|
||||
Q_ASSERT(m_impl);
|
||||
return m_impl->emitSignal(name, argumentsValues);
|
||||
return m_impl->emitSignal(emitter, name, argumentsValues);
|
||||
}
|
||||
|
||||
const QMetaObject *DosQAbstractListModel::metaObject() const
|
||||
|
@ -17,10 +17,10 @@ DosQObject::DosQObject(DosIQMetaObjectPtr metaObject, OnSlotExecuted onSlotExecu
|
||||
: m_impl(new DosQObjectImpl(this, ::createParentMetaCall(this), std::move(metaObject), std::move(onSlotExecuted)))
|
||||
{}
|
||||
|
||||
bool DosQObject::emitSignal(const QString &name, const std::vector<QVariant> &args)
|
||||
bool DosQObject::emitSignal(QObject *emitter, const QString &name, const std::vector<QVariant> &args)
|
||||
{
|
||||
Q_ASSERT(m_impl);
|
||||
return m_impl->emitSignal(name, args);
|
||||
return m_impl->emitSignal(emitter, name, args);
|
||||
}
|
||||
|
||||
const QMetaObject *DosQObject::metaObject() const
|
||||
|
@ -17,7 +17,7 @@ DosQObjectImpl::DosQObjectImpl(QObject *parent,
|
||||
{
|
||||
}
|
||||
|
||||
bool DosQObjectImpl::emitSignal(const QString &name, const std::vector<QVariant> &args)
|
||||
bool DosQObjectImpl::emitSignal(QObject *emitter, const QString &name, const std::vector<QVariant> &args)
|
||||
{
|
||||
const QMetaMethod method = m_metaObject->signal(name);
|
||||
if (!method.isValid())
|
||||
@ -28,7 +28,7 @@ bool DosQObjectImpl::emitSignal(const QString &name, const std::vector<QVariant>
|
||||
std::vector<void *> arguments(args.size(), nullptr);
|
||||
auto func = [](const QVariant & arg) -> void * { return (void *)(&arg); };
|
||||
std::transform(args.begin(), args.end(), arguments.begin(), func);
|
||||
QMetaObject::activate(m_parent, method.methodIndex(), arguments.data());
|
||||
QMetaObject::activate(emitter, method.methodIndex(), arguments.data());
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -8,17 +8,26 @@
|
||||
namespace DOS {
|
||||
|
||||
template<int, int>
|
||||
class DosQObjectWrapper : public QObject
|
||||
class DosQObjectWrapper : public QObject, public DosIQObjectImpl
|
||||
{
|
||||
public:
|
||||
static const QMetaObject staticMetaObject;
|
||||
|
||||
/// Constructor
|
||||
DosQObjectWrapper(QObject *parent = nullptr);
|
||||
|
||||
/// Destructor
|
||||
~DosQObjectWrapper();
|
||||
|
||||
/// @see DosIQObjectImpl::metaObject
|
||||
const QMetaObject *metaObject() const override;
|
||||
|
||||
/// @see DosIQObjectImpl::qt_metacall
|
||||
int qt_metacall(QMetaObject::Call, int, void **) override;
|
||||
|
||||
/// @see DosIQObjectImpl::emitSignal
|
||||
bool emitSignal(QObject* emitter, const QString &name, const std::vector<QVariant> &argumentsValues);
|
||||
|
||||
static const QmlRegisterType &qmlRegisterType();
|
||||
static void setQmlRegisterType(QmlRegisterType data);
|
||||
static void setStaticMetaObject(const QMetaObject &metaObject);
|
||||
@ -26,7 +35,7 @@ public:
|
||||
|
||||
private:
|
||||
void *m_dObject;
|
||||
DosQObject *m_impl;
|
||||
DosIQObjectImpl *m_impl;
|
||||
static int m_id;
|
||||
static QmlRegisterType m_data;
|
||||
};
|
||||
@ -47,8 +56,8 @@ DosQObjectWrapper<N, M>::DosQObjectWrapper(QObject *parent)
|
||||
, m_impl(nullptr)
|
||||
{
|
||||
void *impl = nullptr;
|
||||
m_data.createDObject(m_id, &m_dObject, &impl);
|
||||
m_impl = static_cast<DosQObject *>(impl);
|
||||
m_data.createDObject(m_id, static_cast<QObject*>(this), &m_dObject, &impl);
|
||||
m_impl = dynamic_cast<DosIQObjectImpl *>(static_cast<QObject*>(impl));
|
||||
Q_ASSERT(m_dObject);
|
||||
Q_ASSERT(m_impl);
|
||||
}
|
||||
@ -58,6 +67,7 @@ DosQObjectWrapper<N, M>::~DosQObjectWrapper()
|
||||
{
|
||||
m_data.deleteDObject(m_id, m_dObject);
|
||||
m_dObject = nullptr;
|
||||
delete dynamic_cast<QObject*>(m_impl);
|
||||
m_impl = nullptr;
|
||||
}
|
||||
|
||||
@ -75,6 +85,13 @@ int DosQObjectWrapper<N, M>::qt_metacall(QMetaObject::Call call, int index, void
|
||||
return m_impl->qt_metacall(call, index, args);
|
||||
}
|
||||
|
||||
template<int N, int M>
|
||||
bool DosQObjectWrapper<N, M>::emitSignal(QObject* emitter, const QString &name, const std::vector<QVariant> &argumentsValues)
|
||||
{
|
||||
Q_ASSERT(m_impl);
|
||||
return m_impl->emitSignal(this, name, argumentsValues);
|
||||
}
|
||||
|
||||
template<int N, int M>
|
||||
void DosQObjectWrapper<N, M>::setQmlRegisterType(QmlRegisterType data)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user