Added support for QAbstractListModel

This commit is contained in:
Filippo Cucchetto 2017-03-22 21:21:57 +01:00
parent bd8ed05ba2
commit 7bc65bc4f1
7 changed files with 205 additions and 82 deletions

View File

@ -372,6 +372,42 @@ DOS_API void DOS_CALL dos_qmetaobject_delete(DosQMetaObject *vptr);
/// @} /// @}
/// \defgroup QAbstractListModel QAbstractItemModel
/// \brief Functions related to the QAbstractListModel class
/// @{
/// \brief Return QMetaObject associated to the QAbstractListModel class
/// \return The QMetaObject of the QAbstractListModel class
/// \note The returned QMetaObject should be freed using dos_qmetaobject_delete().
DOS_API DosQMetaObject *DOS_CALL dos_qabstractlistmmodel_qmetaobject();
/// \brief Create a new QAbstractListModel
/// \param callbackObject The pointer of QAbstractListModel in the binded language
/// \param metaObject The QMetaObject for this QAbstractListModel
/// \param dObjectCallback The callback for handling the properties read/write and slots execution
/// \param rowCountCallback The callback for handling the QAbstractItemModel::rowCount() execution
/// \param columnCountCallback The callback for handling the QAbstractItemModel::columnCount() execution
/// \param dataCallback The callback for handling the QAbstractItemModel::data() execution
/// \param setDataCallback The callback for handling the QAbstractItemModel::setData() execution
/// \param roleNamesCallback The callback for handling the QAbstractItemModel::roleNames() execution
/// \param flagsCallback The callback for handling the QAbstractItemModel::flags() execution
/// \param headerDataCallback The callback for handling the QAbstractItemModel::headerData() execution
/// \param indexCallback The callback for handling the QAbstractItemModel::index() execution
/// \param parentCallback The callback for handling the QAbstractItemModel::parent() execution
DOS_API DosQAbstractListModel *DOS_CALL dos_qabstractlistmodel_create(void *callbackObject,
DosQMetaObject *metaObject,
DObjectCallback dObjectCallback,
RowCountCallback rowCountCallback,
ColumnCountCallback columnCountCallback,
DataCallback dataCallback,
SetDataCallback setDataCallback,
RoleNamesCallback roleNamesCallback,
FlagsCallback flagsCallback,
HeaderDataCallback headerDataCallback,
IndexCallback indexCallback,
ParentCallback parentCallback);
/// @}
/// \defgroup QAbstractItemModel QAbstractItemModel /// \defgroup QAbstractItemModel QAbstractItemModel
/// \brief Functions related to the QAbstractItemModel class /// \brief Functions related to the QAbstractItemModel class
/// @{ /// @{

View File

@ -34,6 +34,9 @@ typedef void DosQModelIndex;
/// A pointer to a QAbstractItemModel /// A pointer to a QAbstractItemModel
typedef void DosQAbstractItemModel; typedef void DosQAbstractItemModel;
/// A pointer to a QAbstractListModel
typedef void DosQAbstractListModel;
/// A pointer to a QQmlApplicationEngine /// A pointer to a QQmlApplicationEngine
typedef void DosQQmlApplicationEngine; typedef void DosQQmlApplicationEngine;

View File

@ -9,11 +9,12 @@
namespace DOS { namespace DOS {
class DosQAbstractItemModel : public QAbstractItemModel, public DosIQAbstractItemModelImpl template<class T>
class DosQAbstractGenericModel : public T, public DosIQAbstractItemModelImpl
{ {
public: public:
/// Constructor /// Constructor
DosQAbstractItemModel(void *modelObject, DosQAbstractGenericModel(void *modelObject,
DosIQMetaObjectPtr metaObject, DosIQMetaObjectPtr metaObject,
OnSlotExecuted onSlotExecuted, OnSlotExecuted onSlotExecuted,
RowCountCallback rowCountCallback, RowCountCallback rowCountCallback,
@ -117,4 +118,9 @@ private:
ParentCallback m_parentCallback; ParentCallback m_parentCallback;
}; };
using DosQAbstractItemModel = DosQAbstractGenericModel<QAbstractItemModel>;
using DosQAbstractListModel = DosQAbstractGenericModel<QAbstractListModel>;
using DosQAbstractTableModel = DosQAbstractGenericModel<QAbstractTableModel>;
} // namespace DOS } // namespace DOS

View File

@ -9,6 +9,8 @@
#include <QtCore/QString> #include <QtCore/QString>
#include <QtCore/QHash> #include <QtCore/QHash>
#include <QtCore/QMetaMethod> #include <QtCore/QMetaMethod>
#include <QtCore/QAbstractItemModel>
#include <QtCore/QAbstractListModel>
// DOtherSide // DOtherSide
#include "DOtherSide/DOtherSideTypesCpp.h" #include "DOtherSide/DOtherSideTypesCpp.h"
@ -50,12 +52,16 @@ public:
}; };
/// This is the DosQMetaObject for a QAbstractItemModel /// This is the DosQMetaObject for a QAbstractItemModel
class DosQAbstractItemModelMetaObject : public BaseDosQMetaObject template<class T>
class DosQAbstractGenericModelMetaObject : public BaseDosQMetaObject
{ {
public: public:
DosQAbstractItemModelMetaObject(); DosQAbstractGenericModelMetaObject();
}; };
using DosQAbstractItemModelMetaObject = DosQAbstractGenericModelMetaObject<QAbstractItemModel>;
using DosQAbstractListModelMetaObject = DosQAbstractGenericModelMetaObject<QAbstractListModel>;
/// This the generic version used by subclasses of QObject or QAbstractItemModels /// This the generic version used by subclasses of QObject or QAbstractItemModels
class DosQMetaObject : public BaseDosQMetaObject class DosQMetaObject : public BaseDosQMetaObject
{ {

View File

@ -588,6 +588,41 @@ void dos_qmetaobject_delete(::DosQMetaObject *vptr)
delete factory; delete factory;
} }
::DosQMetaObject *dos_qabstractlistmodel_qmetaobject()
{
return new DOS::DosIQMetaObjectHolder(std::make_shared<DOS::DosQAbstractListModelMetaObject>());
}
::DosQAbstractListModel *dos_qabstractlistmodel_create(void *dObjectPointer,
::DosQMetaObject *metaObjectPointer,
::DObjectCallback dObjectCallback,
::RowCountCallback rowCountCallback,
::ColumnCountCallback columnCountCallback,
::DataCallback dataCallback,
::SetDataCallback setDataCallback,
::RoleNamesCallback roleNamesCallaback,
::FlagsCallback flagsCallback,
::HeaderDataCallback headerDataCallback,
::IndexCallback indexCallback,
::ParentCallback parentCallback)
{
auto metaObjectHolder = static_cast<DOS::DosIQMetaObjectHolder *>(metaObjectPointer);
auto model = new DOS::DosQAbstractListModel(dObjectPointer,
metaObjectHolder->data(),
DOS::OnSlotExecutedHandler(dObjectPointer, dObjectCallback),
rowCountCallback,
columnCountCallback,
dataCallback,
setDataCallback,
roleNamesCallaback,
flagsCallback,
headerDataCallback,
indexCallback,
parentCallback);
QQmlEngine::setObjectOwnership(model, QQmlEngine::CppOwnership);
return static_cast<QObject *>(model);
}
::DosQMetaObject *dos_qabstractitemmodel_qmetaobject() ::DosQMetaObject *dos_qabstractitemmodel_qmetaobject()
{ {
return new DOS::DosIQMetaObjectHolder(std::make_shared<DOS::DosQAbstractItemModelMetaObject>()); return new DOS::DosIQMetaObjectHolder(std::make_shared<DOS::DosQAbstractItemModelMetaObject>());

View File

@ -2,17 +2,21 @@
#include "DOtherSide/DosQObjectImpl.h" #include "DOtherSide/DosQObjectImpl.h"
namespace { namespace {
DOS::DosQObjectImpl::ParentMetaCall createParentMetaCall(QAbstractItemModel *parent)
template<class T>
DOS::DosQObjectImpl::ParentMetaCall createParentMetaCall(DOS::DosQAbstractGenericModel<T> *parent)
{ {
return [parent](QMetaObject::Call callType, int index, void **args)->int { return [parent](QMetaObject::Call callType, int index, void **args)->int {
return parent->QAbstractItemModel::qt_metacall(callType, index, args); return parent->T::qt_metacall(callType, index, args);
}; };
} }
} }
namespace DOS { namespace DOS {
DosQAbstractItemModel::DosQAbstractItemModel(void *modelObject, template<class T>
DosQAbstractGenericModel<T>::DosQAbstractGenericModel(void *modelObject,
DosIQMetaObjectPtr metaObject, DosIQMetaObjectPtr metaObject,
OnSlotExecuted onSlotExecuted, OnSlotExecuted onSlotExecuted,
RowCountCallback rowCountCallback, RowCountCallback rowCountCallback,
@ -37,150 +41,179 @@ DosQAbstractItemModel::DosQAbstractItemModel(void *modelObject,
, m_parentCallback(std::move(parentCallback)) , m_parentCallback(std::move(parentCallback))
{} {}
bool DosQAbstractItemModel::emitSignal(QObject *emitter, const QString &name, const std::vector<QVariant> &argumentsValues) template<class T>
bool DosQAbstractGenericModel<T>::emitSignal(QObject *emitter, const QString &name, const std::vector<QVariant> &argumentsValues)
{ {
Q_ASSERT(m_impl); Q_ASSERT(m_impl);
return m_impl->emitSignal(emitter, name, argumentsValues); return m_impl->emitSignal(emitter, name, argumentsValues);
} }
const QMetaObject *DosQAbstractItemModel::metaObject() const template<class T>
const QMetaObject *DosQAbstractGenericModel<T>::metaObject() const
{ {
Q_ASSERT(m_impl); Q_ASSERT(m_impl);
return m_impl->metaObject(); return m_impl->metaObject();
} }
int DosQAbstractItemModel::qt_metacall(QMetaObject::Call call, int index, void **args) template<class T>
int DosQAbstractGenericModel<T>::qt_metacall(QMetaObject::Call call, int index, void **args)
{ {
Q_ASSERT(m_impl); Q_ASSERT(m_impl);
return m_impl->qt_metacall(call, index, args); return m_impl->qt_metacall(call, index, args);
} }
int DosQAbstractItemModel::rowCount(const QModelIndex &parent) const template<class T>
int DosQAbstractGenericModel<T>::rowCount(const QModelIndex &parent) const
{ {
int result; int result;
m_rowCountCallback(m_modelObject, &parent, &result); m_rowCountCallback(m_modelObject, &parent, &result);
return result; return result;
} }
int DosQAbstractItemModel::columnCount(const QModelIndex &parent) const template<class T>
int DosQAbstractGenericModel<T>::columnCount(const QModelIndex &parent) const
{ {
int result; int result;
m_columnCountCallback(m_modelObject, &parent, &result); m_columnCountCallback(m_modelObject, &parent, &result);
return result; return result;
} }
QVariant DosQAbstractItemModel::data(const QModelIndex &index, int role) const template<class T>
QVariant DosQAbstractGenericModel<T>::data(const QModelIndex &index, int role) const
{ {
QVariant result; QVariant result;
m_dataCallback(m_modelObject, &index, role, &result); m_dataCallback(m_modelObject, &index, role, &result);
return result; return result;
} }
bool DosQAbstractItemModel::setData(const QModelIndex &index, const QVariant &value, int role) template<class T>
bool DosQAbstractGenericModel<T>::setData(const QModelIndex &index, const QVariant &value, int role)
{ {
bool result = false; bool result = false;
m_setDataCallback(m_modelObject, &index, &value, role, &result); m_setDataCallback(m_modelObject, &index, &value, role, &result);
return result; return result;
} }
Qt::ItemFlags DosQAbstractItemModel::flags(const QModelIndex &index) const template<class T>
Qt::ItemFlags DosQAbstractGenericModel<T>::flags(const QModelIndex &index) const
{ {
int result; int result;
m_flagsCallback(m_modelObject, &index, &result); m_flagsCallback(m_modelObject, &index, &result);
return Qt::ItemFlags(result); return Qt::ItemFlags(result);
} }
QVariant DosQAbstractItemModel::headerData(int section, Qt::Orientation orientation, int role) const template<class T>
QVariant DosQAbstractGenericModel<T>::headerData(int section, Qt::Orientation orientation, int role) const
{ {
QVariant result; QVariant result;
m_headerDataCallback(m_modelObject, section, orientation, role, &result); m_headerDataCallback(m_modelObject, section, orientation, role, &result);
return result; return result;
} }
QModelIndex DosQAbstractItemModel::index(int row, int column, const QModelIndex &parent) const template<class T>
QModelIndex DosQAbstractGenericModel<T>::index(int row, int column, const QModelIndex &parent) const
{ {
QModelIndex result; QModelIndex result;
m_indexCallback(m_modelObject, row, column, &parent, &result); m_indexCallback(m_modelObject, row, column, &parent, &result);
return result; return result;
} }
QModelIndex DosQAbstractItemModel::parent(const QModelIndex &child) const template<class T>
QModelIndex DosQAbstractGenericModel<T>::parent(const QModelIndex &child) const
{ {
QModelIndex result; QModelIndex result;
m_parentCallback(m_modelObject, &child, &result); m_parentCallback(m_modelObject, &child, &result);
return result; return result;
} }
void *DosQAbstractItemModel::modelObject() template<class T>
void *DosQAbstractGenericModel<T>::modelObject()
{ {
return m_modelObject; return m_modelObject;
} }
QHash<int, QByteArray> DosQAbstractItemModel::roleNames() const template<class T>
QHash<int, QByteArray> DosQAbstractGenericModel<T>::roleNames() const
{ {
QHash<int, QByteArray> result; QHash<int, QByteArray> result;
m_roleNamesCallback(m_modelObject, &result); m_roleNamesCallback(m_modelObject, &result);
return result; return result;
} }
void DOS::DosQAbstractItemModel::publicBeginInsertColumns(const QModelIndex &index, int first, int last) template<class T>
void DosQAbstractGenericModel<T>::publicBeginInsertColumns(const QModelIndex &index, int first, int last)
{ {
beginInsertColumns(index, first, last); T::beginInsertColumns(index, first, last);
} }
void DOS::DosQAbstractItemModel::publicEndInsertColumns() template<class T>
void DosQAbstractGenericModel<T>::publicEndInsertColumns()
{ {
endInsertColumns(); T::endInsertColumns();
} }
void DOS::DosQAbstractItemModel::publicBeginRemoveColumns(const QModelIndex &index, int first, int last) template<class T>
void DosQAbstractGenericModel<T>::publicBeginRemoveColumns(const QModelIndex &index, int first, int last)
{ {
beginRemoveColumns(index, first, last); T::beginRemoveColumns(index, first, last);
} }
void DOS::DosQAbstractItemModel::publicEndRemoveColumns() template<class T>
void DosQAbstractGenericModel<T>::publicEndRemoveColumns()
{ {
endRemoveColumns(); T::endRemoveColumns();
}
template<class T>
void DosQAbstractGenericModel<T>::publicBeginInsertRows(const QModelIndex &index, int first, int last)
{
T::beginInsertRows(index, first, last);
} }
void DOS::DosQAbstractItemModel::publicBeginInsertRows(const QModelIndex &index, int first, int last) template<class T>
void DosQAbstractGenericModel<T>::publicEndInsertRows()
{ {
beginInsertRows(index, first, last); T::endInsertRows();
} }
void DOS::DosQAbstractItemModel::publicEndInsertRows() template<class T>
void DosQAbstractGenericModel<T>::publicBeginRemoveRows(const QModelIndex &index, int first, int last)
{ {
endInsertRows(); T::beginRemoveRows(index, first, last);
} }
void DOS::DosQAbstractItemModel::publicBeginRemoveRows(const QModelIndex &index, int first, int last) template<class T>
void DosQAbstractGenericModel<T>::publicEndRemoveRows()
{ {
beginRemoveRows(index, first, last); T::endRemoveRows();
} }
void DOS::DosQAbstractItemModel::publicEndRemoveRows() template<class T>
void DosQAbstractGenericModel<T>::publicBeginResetModel()
{ {
endRemoveRows(); T::beginResetModel();
} }
void DOS::DosQAbstractItemModel::publicBeginResetModel() template<class T>
void DosQAbstractGenericModel<T>::publicEndResetModel()
{ {
beginResetModel(); T::endResetModel();
} }
void DOS::DosQAbstractItemModel::publicEndResetModel() template<class T>
void DosQAbstractGenericModel<T>::publicDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles)
{ {
endResetModel(); emit T::dataChanged(topLeft, bottomRight, roles);
} }
void DOS::DosQAbstractItemModel::publicDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles) template<class T>
QModelIndex DosQAbstractGenericModel<T>::publicCreateIndex(int row, int column, void *data) const
{ {
emit dataChanged(topLeft, bottomRight, roles); return T::createIndex(row, column, data);
}
QModelIndex DOS::DosQAbstractItemModel::publicCreateIndex(int row, int column, void *data) const
{
return createIndex(row, column, data);
} }
} // namespace DOS } // namespace DOS
// Force instantiation
template class DOS::DosQAbstractGenericModel<QAbstractItemModel>;
template class DOS::DosQAbstractGenericModel<QAbstractListModel>;
template class DOS::DosQAbstractGenericModel<QAbstractTableModel>;

View File

@ -41,19 +41,17 @@ Value valueOrDefault(std::unordered_map<Key, Value> const &map, const Key &k, Va
return it != std::end(map) ? it->second : std::move(value); return it != std::end(map) ? it->second : std::move(value);
} }
QMetaObject *createDynamicQObjectMetaObject() template<class T> const char* className();
{ template<> const char* className<QObject>() { return "DosQObject"; }
QMetaObjectBuilder builder; template<> const char* className<QAbstractItemModel>() { return "DosQAbstractItemModel"; }
builder.setClassName("DosQObject"); template<> const char* className<QAbstractListModel>() { return "DosQAbstractListModel"; }
builder.setSuperClass(&QObject::staticMetaObject);
return builder.toMetaObject();
}
QMetaObject *createDynamicQAbstractItemModelMetaObject() template <class T>
QMetaObject *createDynamicMetaObject()
{ {
QMetaObjectBuilder builder; QMetaObjectBuilder builder;
builder.setClassName("DosQAbstractItemModel"); builder.setClassName(className<T>());
builder.setSuperClass(&QAbstractItemModel::staticMetaObject); builder.setSuperClass(&T::staticMetaObject);
return builder.toMetaObject(); return builder.toMetaObject();
} }
@ -91,13 +89,19 @@ const DosIQMetaObject *BaseDosQMetaObject::superClassDosMetaObject() const
} }
DosQObjectMetaObject::DosQObjectMetaObject() DosQObjectMetaObject::DosQObjectMetaObject()
: BaseDosQMetaObject(::createDynamicQObjectMetaObject()) : BaseDosQMetaObject(::createDynamicMetaObject<QObject>())
{} {}
DosQAbstractItemModelMetaObject::DosQAbstractItemModelMetaObject() template<class T>
: BaseDosQMetaObject(::createDynamicQAbstractItemModelMetaObject()) DosQAbstractGenericModelMetaObject<T>::DosQAbstractGenericModelMetaObject()
: BaseDosQMetaObject(::createDynamicMetaObject<T>())
{} {}
// Force template instantations
template class DosQAbstractGenericModelMetaObject<QAbstractItemModel>;
template class DosQAbstractGenericModelMetaObject<QAbstractListModel>;
DosQMetaObject::DosQMetaObject(DosIQMetaObjectPtr superClassMetaObject, DosQMetaObject::DosQMetaObject(DosIQMetaObjectPtr superClassMetaObject,
const QString &className, const QString &className,
const SignalDefinitions &signalDefinitions, const SignalDefinitions &signalDefinitions,