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/DosQObjectImpl.h
include/DOtherSide/DosIQObjectImpl.h
include/DOtherSide/OnSlotExecutedHandler.h
include/DOtherSide/DosQMetaObject.h
include/DOtherSide/DosIQAbstractItemModelImpl.h
include/DOtherSide/DosQAbstractItemModel.h
@ -33,7 +32,6 @@ set(HEADERS_LIST
set(SRC_LIST
src/DOtherSide.cpp
src/OnSlotExecutedHandler.cpp
src/DosQMetaObject.cpp
src/DosQDeclarative.cpp
src/DosQObject.cpp

View File

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

View File

@ -14,8 +14,7 @@ class DosQObject : public QObject, public DosIQObjectImpl
{
public:
/// Constructor
DosQObject(DosIQMetaObjectPtr metaObject,
OnSlotExecuted onSlotExecuted);
DosQObject(void *dObjectPointer, DosIQMetaObjectPtr metaObject, DObjectCallback dObjectCallback);
/// Emit a signal
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 **)>;
/// Constructor
DosQObjectImpl(QObject *parent,
ParentMetaCall parentMetaCall,
DosQObjectImpl(ParentMetaCall parentMetaCall,
std::shared_ptr<const DosIQMetaObject> metaObject,
OnSlotExecuted onSlotExecuted);
void *dObjectPointer,
DObjectCallback dObjectCallback);
/// @see IDosQObject::emitSignal
@ -38,13 +38,15 @@ public:
private:
bool executeSlot(const QMetaMethod &method, void **args, int argumentsOffset = 1);
bool executeSlot(int index, void **args);
QVariant executeSlot(const QString &name, const std::vector<QVariant> &args);
bool readProperty(int index, void **args);
bool writeProperty(int index, void **args);
QObject *m_parent;
const ParentMetaCall m_parentMetaCall;
const OnSlotExecuted m_onSlotExecuted;
mutable std::shared_ptr<const DosIQMetaObject> m_metaObject;
const std::shared_ptr<const DosIQMetaObject> m_metaObject;
void* const m_dObjectPointer = nullptr;
const DObjectCallback m_dObjectCallback;
};
} // 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 "DOtherSide/DOtherSideTypesCpp.h"
#include "DOtherSide/OnSlotExecutedHandler.h"
#include "DOtherSide/DosQMetaObject.h"
#include "DOtherSide/DosQObject.h"
#include "DOtherSide/DosQObjectImpl.h"
@ -27,10 +26,12 @@
#include "DOtherSide/DosQQuickImageProvider.h"
namespace {
void register_meta_types()
{
qRegisterMetaType<QVector<int>>();
}
}
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)
{
auto metaObjectHolder = static_cast<DOS::DosIQMetaObjectHolder *>(metaObject);
auto dosQObject = new DOS::DosQObject(metaObjectHolder->data(),
DOS::OnSlotExecutedHandler(dObjectPointer, dObjectCallback));
auto dosQObject = new DOS::DosQObject(dObjectPointer, metaObjectHolder->data(), dObjectCallback);
QQmlEngine::setObjectOwnership(dosQObject, QQmlEngine::CppOwnership);
return static_cast<QObject *>(dosQObject);
}
@ -718,7 +718,7 @@ void dos_qmetaobject_delete(::DosQMetaObject *vptr)
auto metaObjectHolder = static_cast<DOS::DosIQMetaObjectHolder *>(metaObjectPointer);
auto model = new DOS::DosQAbstractTableModel(dObjectPointer,
metaObjectHolder->data(),
DOS::OnSlotExecutedHandler(dObjectPointer, dObjectCallback),
dObjectCallback,
*callbacks);
QQmlEngine::setObjectOwnership(model, QQmlEngine::CppOwnership);
return static_cast<QObject *>(model);
@ -755,7 +755,7 @@ DosQModelIndex *dos_qabstracttablemodel_parent(DosQAbstractTableModel *vptr, Dos
auto metaObjectHolder = static_cast<DOS::DosIQMetaObjectHolder *>(metaObjectPointer);
auto model = new DOS::DosQAbstractListModel(dObjectPointer,
metaObjectHolder->data(),
DOS::OnSlotExecutedHandler(dObjectPointer, dObjectCallback),
dObjectCallback,
*callbacks);
QQmlEngine::setObjectOwnership(model, QQmlEngine::CppOwnership);
return static_cast<QObject *>(model);
@ -800,7 +800,7 @@ int dos_qabstractlistmodel_columnCount(DosQAbstractListModel *vptr, DosQModelInd
auto metaObjectHolder = static_cast<DOS::DosIQMetaObjectHolder *>(metaObjectPointer);
auto model = new DOS::DosQAbstractItemModel(dObjectPointer,
metaObjectHolder->data(),
DOS::OnSlotExecutedHandler(dObjectPointer, dObjectCallback),
dObjectCallback,
*callbacks);
QQmlEngine::setObjectOwnership(model, QQmlEngine::CppOwnership);
return static_cast<QObject *>(model);

View File

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

View File

@ -13,8 +13,8 @@ DOS::DosQObjectImpl::ParentMetaCall createParentMetaCall(QObject *parent)
namespace DOS {
DosQObject::DosQObject(DosIQMetaObjectPtr metaObject, OnSlotExecuted onSlotExecuted)
: m_impl(new DosQObjectImpl(this, ::createParentMetaCall(this), std::move(metaObject), std::move(onSlotExecuted)))
DosQObject::DosQObject(void *dObjectPointer, DosIQMetaObjectPtr metaObject, DObjectCallback dObjectCallback)
: m_impl(new DosQObjectImpl(::createParentMetaCall(this), std::move(metaObject), dObjectPointer, dObjectCallback))
{}
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/DosQMetaObject.h"
#include <QtCore/QMetaObject>
#include <QtCore/QMetaMethod>
#include <QtCore/QDebug>
namespace DOS {
DosQObjectImpl::DosQObjectImpl(QObject *parent,
ParentMetaCall parentMetaCall,
DosQObjectImpl::DosQObjectImpl(ParentMetaCall parentMetaCall,
std::shared_ptr<const DosIQMetaObject> metaObject,
OnSlotExecuted onSlotExecuted)
: m_parent(std::move(parent))
, m_parentMetaCall(std::move(parentMetaCall))
, m_onSlotExecuted(std::move(onSlotExecuted))
void *dObjectPointer,
DObjectCallback dObjectCallback)
: m_parentMetaCall(std::move(parentMetaCall))
, 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));
}
const QVariant result = m_onSlotExecuted(method.name(), arguments); // Execute method
const QVariant result = executeSlot(method.name(), arguments); // Execute method
if (hasReturnType && result.isValid()) {
QMetaType::construct(method.returnType(), args[0], result.constData());
@ -92,6 +94,29 @@ bool DosQObjectImpl::executeSlot(const QMetaMethod &method, void **args, int arg
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)
{
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