Merge remote-tracking branch 'origin/Refactor'

This commit is contained in:
Filippo Cucchetto 2018-11-28 22:26:56 +01:00
commit d1a15a133a
10 changed files with 54 additions and 88 deletions

View File

@ -24,7 +24,6 @@ set(HEADERS_LIST
include/DOtherSide/DosQObject.h include/DOtherSide/DosQObject.h
include/DOtherSide/DosQObjectImpl.h include/DOtherSide/DosQObjectImpl.h
include/DOtherSide/DosIQObjectImpl.h include/DOtherSide/DosIQObjectImpl.h
include/DOtherSide/OnSlotExecutedHandler.h
include/DOtherSide/DosQMetaObject.h include/DOtherSide/DosQMetaObject.h
include/DOtherSide/DosIQAbstractItemModelImpl.h include/DOtherSide/DosIQAbstractItemModelImpl.h
include/DOtherSide/DosQAbstractItemModel.h include/DOtherSide/DosQAbstractItemModel.h
@ -33,7 +32,6 @@ set(HEADERS_LIST
set(SRC_LIST set(SRC_LIST
src/DOtherSide.cpp src/DOtherSide.cpp
src/OnSlotExecutedHandler.cpp
src/DosQMetaObject.cpp src/DosQMetaObject.cpp
src/DosQDeclarative.cpp src/DosQDeclarative.cpp
src/DosQObject.cpp src/DosQObject.cpp

View File

@ -7,8 +7,8 @@
// DOtherSide // DOtherSide
#include "DOtherSide/DOtherSideTypes.h" #include "DOtherSide/DOtherSideTypes.h"
#include "DOtherSide/DosQMetaObject.h"
#include "DOtherSide/DosIQAbstractItemModelImpl.h" #include "DOtherSide/DosIQAbstractItemModelImpl.h"
#include "DOtherSide/OnSlotExecutedHandler.h"
namespace DOS { namespace DOS {
@ -19,7 +19,7 @@ public:
/// Constructor /// Constructor
DosQAbstractGenericModel(void *modelObject, DosQAbstractGenericModel(void *modelObject,
DosIQMetaObjectPtr metaObject, DosIQMetaObjectPtr metaObject,
OnSlotExecuted onSlotExecuted, DObjectCallback dObjectCallback,
DosQAbstractItemModelCallbacks callbacks); DosQAbstractItemModelCallbacks callbacks);
/// @see IDynamicQObject::emitSignal /// @see IDynamicQObject::emitSignal

View File

@ -14,8 +14,7 @@ class DosQObject : public QObject, public DosIQObjectImpl
{ {
public: public:
/// Constructor /// Constructor
DosQObject(DosIQMetaObjectPtr metaObject, DosQObject(void *dObjectPointer, DosIQMetaObjectPtr metaObject, DObjectCallback dObjectCallback);
OnSlotExecuted onSlotExecuted);
/// Emit a signal /// Emit a signal
bool emitSignal(QObject *emitter, const QString &name, const std::vector<QVariant> &arguments) override; bool emitSignal(QObject *emitter, const QString &name, const std::vector<QVariant> &arguments) override;

View File

@ -20,10 +20,10 @@ public:
using ParentMetaCall = std::function<int(QMetaObject::Call, int, void **)>; using ParentMetaCall = std::function<int(QMetaObject::Call, int, void **)>;
/// Constructor /// Constructor
DosQObjectImpl(QObject *parent, DosQObjectImpl(ParentMetaCall parentMetaCall,
ParentMetaCall parentMetaCall,
std::shared_ptr<const DosIQMetaObject> metaObject, std::shared_ptr<const DosIQMetaObject> metaObject,
OnSlotExecuted onSlotExecuted); void *dObjectPointer,
DObjectCallback dObjectCallback);
/// @see IDosQObject::emitSignal /// @see IDosQObject::emitSignal
@ -38,13 +38,15 @@ public:
private: private:
bool executeSlot(const QMetaMethod &method, void **args, int argumentsOffset = 1); bool executeSlot(const QMetaMethod &method, void **args, int argumentsOffset = 1);
bool executeSlot(int index, void **args); bool executeSlot(int index, void **args);
QVariant executeSlot(const QString &name, const std::vector<QVariant> &args);
bool readProperty(int index, void **args); bool readProperty(int index, void **args);
bool writeProperty(int index, void **args); bool writeProperty(int index, void **args);
QObject *m_parent;
const ParentMetaCall m_parentMetaCall; const ParentMetaCall m_parentMetaCall;
const OnSlotExecuted m_onSlotExecuted; const std::shared_ptr<const DosIQMetaObject> m_metaObject;
mutable std::shared_ptr<const DosIQMetaObject> m_metaObject; void* const m_dObjectPointer = nullptr;
const DObjectCallback m_dObjectCallback;
}; };
} // namespace DOS } // namespace DOS

View File

@ -1,24 +0,0 @@
#pragma once
// std
#include <vector>
// Qt
#include <QtCore/QVariant>
// DOtherSide
#include "DOtherSide/DOtherSideTypesCpp.h"
namespace DOS {
class OnSlotExecutedHandler
{
public:
OnSlotExecutedHandler(void *dObjectPointer, DObjectCallback dObjectCallback);
QVariant operator()(const QString &name, const std::vector<QVariant> &args);
private:
void *m_dObjectPointer;
DObjectCallback m_dObjectCallback;
};
} // namespace DOS

View File

@ -18,7 +18,6 @@
#include <QtWidgets/QApplication> #include <QtWidgets/QApplication>
#include "DOtherSide/DOtherSideTypesCpp.h" #include "DOtherSide/DOtherSideTypesCpp.h"
#include "DOtherSide/OnSlotExecutedHandler.h"
#include "DOtherSide/DosQMetaObject.h" #include "DOtherSide/DosQMetaObject.h"
#include "DOtherSide/DosQObject.h" #include "DOtherSide/DosQObject.h"
#include "DOtherSide/DosQObjectImpl.h" #include "DOtherSide/DosQObjectImpl.h"
@ -27,10 +26,12 @@
#include "DOtherSide/DosQQuickImageProvider.h" #include "DOtherSide/DosQQuickImageProvider.h"
namespace { namespace {
void register_meta_types() void register_meta_types()
{ {
qRegisterMetaType<QVector<int>>(); qRegisterMetaType<QVector<int>>();
} }
} }
char *convert_to_cstring(const QByteArray &array) char *convert_to_cstring(const QByteArray &array)
@ -477,8 +478,7 @@ void dos_qvariant_setArray(::DosQVariant *vptr, int size, ::DosQVariant **array)
::DosQObject *dos_qobject_create(void *dObjectPointer, ::DosQMetaObject *metaObject, ::DObjectCallback dObjectCallback) ::DosQObject *dos_qobject_create(void *dObjectPointer, ::DosQMetaObject *metaObject, ::DObjectCallback dObjectCallback)
{ {
auto metaObjectHolder = static_cast<DOS::DosIQMetaObjectHolder *>(metaObject); auto metaObjectHolder = static_cast<DOS::DosIQMetaObjectHolder *>(metaObject);
auto dosQObject = new DOS::DosQObject(metaObjectHolder->data(), auto dosQObject = new DOS::DosQObject(dObjectPointer, metaObjectHolder->data(), dObjectCallback);
DOS::OnSlotExecutedHandler(dObjectPointer, dObjectCallback));
QQmlEngine::setObjectOwnership(dosQObject, QQmlEngine::CppOwnership); QQmlEngine::setObjectOwnership(dosQObject, QQmlEngine::CppOwnership);
return static_cast<QObject *>(dosQObject); return static_cast<QObject *>(dosQObject);
} }
@ -718,7 +718,7 @@ void dos_qmetaobject_delete(::DosQMetaObject *vptr)
auto metaObjectHolder = static_cast<DOS::DosIQMetaObjectHolder *>(metaObjectPointer); auto metaObjectHolder = static_cast<DOS::DosIQMetaObjectHolder *>(metaObjectPointer);
auto model = new DOS::DosQAbstractTableModel(dObjectPointer, auto model = new DOS::DosQAbstractTableModel(dObjectPointer,
metaObjectHolder->data(), metaObjectHolder->data(),
DOS::OnSlotExecutedHandler(dObjectPointer, dObjectCallback), dObjectCallback,
*callbacks); *callbacks);
QQmlEngine::setObjectOwnership(model, QQmlEngine::CppOwnership); QQmlEngine::setObjectOwnership(model, QQmlEngine::CppOwnership);
return static_cast<QObject *>(model); return static_cast<QObject *>(model);
@ -755,7 +755,7 @@ DosQModelIndex *dos_qabstracttablemodel_parent(DosQAbstractTableModel *vptr, Dos
auto metaObjectHolder = static_cast<DOS::DosIQMetaObjectHolder *>(metaObjectPointer); auto metaObjectHolder = static_cast<DOS::DosIQMetaObjectHolder *>(metaObjectPointer);
auto model = new DOS::DosQAbstractListModel(dObjectPointer, auto model = new DOS::DosQAbstractListModel(dObjectPointer,
metaObjectHolder->data(), metaObjectHolder->data(),
DOS::OnSlotExecutedHandler(dObjectPointer, dObjectCallback), dObjectCallback,
*callbacks); *callbacks);
QQmlEngine::setObjectOwnership(model, QQmlEngine::CppOwnership); QQmlEngine::setObjectOwnership(model, QQmlEngine::CppOwnership);
return static_cast<QObject *>(model); return static_cast<QObject *>(model);
@ -800,7 +800,7 @@ int dos_qabstractlistmodel_columnCount(DosQAbstractListModel *vptr, DosQModelInd
auto metaObjectHolder = static_cast<DOS::DosIQMetaObjectHolder *>(metaObjectPointer); auto metaObjectHolder = static_cast<DOS::DosIQMetaObjectHolder *>(metaObjectPointer);
auto model = new DOS::DosQAbstractItemModel(dObjectPointer, auto model = new DOS::DosQAbstractItemModel(dObjectPointer,
metaObjectHolder->data(), metaObjectHolder->data(),
DOS::OnSlotExecutedHandler(dObjectPointer, dObjectCallback), dObjectCallback,
*callbacks); *callbacks);
QQmlEngine::setObjectOwnership(model, QQmlEngine::CppOwnership); QQmlEngine::setObjectOwnership(model, QQmlEngine::CppOwnership);
return static_cast<QObject *>(model); return static_cast<QObject *>(model);

View File

@ -18,10 +18,10 @@ namespace DOS {
template<class T> template<class T>
DosQAbstractGenericModel<T>::DosQAbstractGenericModel(void *modelObject, DosQAbstractGenericModel<T>::DosQAbstractGenericModel(void *modelObject,
DosIQMetaObjectPtr metaObject, DosIQMetaObjectPtr metaObject,
OnSlotExecuted onSlotExecuted, DObjectCallback dObjectCallback,
DosQAbstractItemModelCallbacks callbacks) DosQAbstractItemModelCallbacks callbacks)
: m_impl(new DosQObjectImpl(this, ::createParentMetaCall(this), std::move(metaObject), std::move(onSlotExecuted))) : m_impl(new DosQObjectImpl(::createParentMetaCall(this), std::move(metaObject), modelObject, dObjectCallback))
, m_modelObject(std::move(modelObject)) , m_modelObject(modelObject)
, m_callbacks(callbacks) , m_callbacks(callbacks)
{} {}

View File

@ -13,8 +13,8 @@ DOS::DosQObjectImpl::ParentMetaCall createParentMetaCall(QObject *parent)
namespace DOS { namespace DOS {
DosQObject::DosQObject(DosIQMetaObjectPtr metaObject, OnSlotExecuted onSlotExecuted) DosQObject::DosQObject(void *dObjectPointer, DosIQMetaObjectPtr metaObject, DObjectCallback dObjectCallback)
: m_impl(new DosQObjectImpl(this, ::createParentMetaCall(this), std::move(metaObject), std::move(onSlotExecuted))) : m_impl(new DosQObjectImpl(::createParentMetaCall(this), std::move(metaObject), dObjectPointer, dObjectCallback))
{} {}
bool DosQObject::emitSignal(QObject *emitter, const QString &name, const std::vector<QVariant> &args) bool DosQObject::emitSignal(QObject *emitter, const QString &name, const std::vector<QVariant> &args)

View File

@ -1,19 +1,21 @@
#include "DOtherSide/DosQObjectImpl.h" #include "DOtherSide/DosQObjectImpl.h"
#include "DOtherSide/DosQMetaObject.h" #include "DOtherSide/DosQMetaObject.h"
#include <QtCore/QMetaObject> #include <QtCore/QMetaObject>
#include <QtCore/QMetaMethod> #include <QtCore/QMetaMethod>
#include <QtCore/QDebug> #include <QtCore/QDebug>
namespace DOS { namespace DOS {
DosQObjectImpl::DosQObjectImpl(QObject *parent, DosQObjectImpl::DosQObjectImpl(ParentMetaCall parentMetaCall,
ParentMetaCall parentMetaCall,
std::shared_ptr<const DosIQMetaObject> metaObject, std::shared_ptr<const DosIQMetaObject> metaObject,
OnSlotExecuted onSlotExecuted) void *dObjectPointer,
: m_parent(std::move(parent)) DObjectCallback dObjectCallback)
, m_parentMetaCall(std::move(parentMetaCall)) : m_parentMetaCall(std::move(parentMetaCall))
, m_onSlotExecuted(std::move(onSlotExecuted))
, m_metaObject(std::move(metaObject)) , m_metaObject(std::move(metaObject))
, m_dObjectPointer(dObjectPointer)
, m_dObjectCallback(dObjectCallback)
{ {
} }
@ -83,7 +85,7 @@ bool DosQObjectImpl::executeSlot(const QMetaMethod &method, void **args, int arg
arguments.emplace_back(std::move(argument)); arguments.emplace_back(std::move(argument));
} }
const QVariant result = m_onSlotExecuted(method.name(), arguments); // Execute method const QVariant result = executeSlot(method.name(), arguments); // Execute method
if (hasReturnType && result.isValid()) { if (hasReturnType && result.isValid()) {
QMetaType::construct(method.returnType(), args[0], result.constData()); QMetaType::construct(method.returnType(), args[0], result.constData());
@ -92,6 +94,29 @@ bool DosQObjectImpl::executeSlot(const QMetaMethod &method, void **args, int arg
return true; return true;
} }
QVariant DosQObjectImpl::executeSlot(const QString &name, const std::vector<QVariant> &args)
{
QVariant result;
if (!m_dObjectCallback || !m_dObjectPointer)
return result;
// prepare slot name
QVariant slotName(name);
// prepare void* for the QVariants
std::vector<void *> argumentsAsVoidPointers;
argumentsAsVoidPointers.reserve(args.size() + 1);
argumentsAsVoidPointers.emplace_back(&result);
for (size_t i = 0; i < args.size(); ++i)
argumentsAsVoidPointers.emplace_back((void *)(&args[i]));
// send them to the binding handler
m_dObjectCallback(m_dObjectPointer, &slotName, argumentsAsVoidPointers.size(), &argumentsAsVoidPointers[0]);
return result;
}
bool DosQObjectImpl::readProperty(int index, void **args) bool DosQObjectImpl::readProperty(int index, void **args)
{ {
const QMetaObject *const mo = metaObject(); const QMetaObject *const mo = metaObject();

View File

@ -1,34 +0,0 @@
#include "DOtherSide/OnSlotExecutedHandler.h"
namespace DOS {
OnSlotExecutedHandler::OnSlotExecutedHandler(void *dObjectPointer,
DObjectCallback dObjectCallback)
: m_dObjectPointer(dObjectPointer)
, m_dObjectCallback(dObjectCallback)
{}
QVariant OnSlotExecutedHandler::operator()(const QString &name, const std::vector<QVariant> &args)
{
QVariant result;
if (!m_dObjectCallback || !m_dObjectPointer)
return result;
// prepare slot name
QVariant slotName(name);
// prepare void* for the QVariants
std::vector<void *> argumentsAsVoidPointers;
argumentsAsVoidPointers.reserve(args.size() + 1);
argumentsAsVoidPointers.emplace_back(&result);
for (size_t i = 0; i < args.size(); ++i)
argumentsAsVoidPointers.emplace_back((void *)(&args[i]));
// send them to the binding handler
m_dObjectCallback(m_dObjectPointer, &slotName, argumentsAsVoidPointers.size(), &argumentsAsVoidPointers[0]);
return result;
}
} // namespace DOS