From 7bc65bc4f1ca177894796e185a79c42ec8139bc6 Mon Sep 17 00:00:00 2001 From: Filippo Cucchetto Date: Wed, 22 Mar 2017 21:21:57 +0100 Subject: [PATCH] Added support for QAbstractListModel --- lib/include/DOtherSide/DOtherSide.h | 36 +++++ lib/include/DOtherSide/DOtherSideTypes.h | 3 + .../DOtherSide/DosQAbstractItemModel.h | 32 ++-- lib/include/DOtherSide/DosQMetaObject.h | 10 +- lib/src/DOtherSide.cpp | 35 +++++ lib/src/DosQAbstractItemModel.cpp | 141 +++++++++++------- lib/src/DosQMetaObject.cpp | 30 ++-- 7 files changed, 205 insertions(+), 82 deletions(-) diff --git a/lib/include/DOtherSide/DOtherSide.h b/lib/include/DOtherSide/DOtherSide.h index 8e9cd2a..2d671c5 100644 --- a/lib/include/DOtherSide/DOtherSide.h +++ b/lib/include/DOtherSide/DOtherSide.h @@ -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 /// \brief Functions related to the QAbstractItemModel class /// @{ diff --git a/lib/include/DOtherSide/DOtherSideTypes.h b/lib/include/DOtherSide/DOtherSideTypes.h index d08c992..65d2851 100644 --- a/lib/include/DOtherSide/DOtherSideTypes.h +++ b/lib/include/DOtherSide/DOtherSideTypes.h @@ -34,6 +34,9 @@ typedef void DosQModelIndex; /// A pointer to a QAbstractItemModel typedef void DosQAbstractItemModel; +/// A pointer to a QAbstractListModel +typedef void DosQAbstractListModel; + /// A pointer to a QQmlApplicationEngine typedef void DosQQmlApplicationEngine; diff --git a/lib/include/DOtherSide/DosQAbstractItemModel.h b/lib/include/DOtherSide/DosQAbstractItemModel.h index 68f67fb..974db11 100644 --- a/lib/include/DOtherSide/DosQAbstractItemModel.h +++ b/lib/include/DOtherSide/DosQAbstractItemModel.h @@ -9,22 +9,23 @@ namespace DOS { -class DosQAbstractItemModel : public QAbstractItemModel, public DosIQAbstractItemModelImpl +template +class DosQAbstractGenericModel : public T, public DosIQAbstractItemModelImpl { public: /// Constructor - DosQAbstractItemModel(void *modelObject, - DosIQMetaObjectPtr metaObject, - OnSlotExecuted onSlotExecuted, - RowCountCallback rowCountCallback, - ColumnCountCallback columnCountCallback, - DataCallback dataCallback, - SetDataCallback setDataCallback, - RoleNamesCallback roleNamesCallback, - FlagsCallback flagsCallback, - HeaderDataCallback headerDataCallback, - IndexCallback indexCallback, - ParentCallback parentCallback); + DosQAbstractGenericModel(void *modelObject, + DosIQMetaObjectPtr metaObject, + OnSlotExecuted onSlotExecuted, + RowCountCallback rowCountCallback, + ColumnCountCallback columnCountCallback, + DataCallback dataCallback, + SetDataCallback setDataCallback, + RoleNamesCallback roleNamesCallback, + FlagsCallback flagsCallback, + HeaderDataCallback headerDataCallback, + IndexCallback indexCallback, + ParentCallback parentCallback); /// @see IDynamicQObject::emitSignal bool emitSignal(QObject *emitter, const QString &name, const std::vector &argumentsValues) override; @@ -117,4 +118,9 @@ private: ParentCallback m_parentCallback; }; + +using DosQAbstractItemModel = DosQAbstractGenericModel; +using DosQAbstractListModel = DosQAbstractGenericModel; +using DosQAbstractTableModel = DosQAbstractGenericModel; + } // namespace DOS diff --git a/lib/include/DOtherSide/DosQMetaObject.h b/lib/include/DOtherSide/DosQMetaObject.h index 5c290ba..a10aebd 100644 --- a/lib/include/DOtherSide/DosQMetaObject.h +++ b/lib/include/DOtherSide/DosQMetaObject.h @@ -9,6 +9,8 @@ #include #include #include +#include +#include // DOtherSide #include "DOtherSide/DOtherSideTypesCpp.h" @@ -50,12 +52,16 @@ public: }; /// This is the DosQMetaObject for a QAbstractItemModel -class DosQAbstractItemModelMetaObject : public BaseDosQMetaObject +template +class DosQAbstractGenericModelMetaObject : public BaseDosQMetaObject { public: - DosQAbstractItemModelMetaObject(); + DosQAbstractGenericModelMetaObject(); }; +using DosQAbstractItemModelMetaObject = DosQAbstractGenericModelMetaObject; +using DosQAbstractListModelMetaObject = DosQAbstractGenericModelMetaObject; + /// This the generic version used by subclasses of QObject or QAbstractItemModels class DosQMetaObject : public BaseDosQMetaObject { diff --git a/lib/src/DOtherSide.cpp b/lib/src/DOtherSide.cpp index 83eaa66..f3f7a3e 100644 --- a/lib/src/DOtherSide.cpp +++ b/lib/src/DOtherSide.cpp @@ -588,6 +588,41 @@ void dos_qmetaobject_delete(::DosQMetaObject *vptr) delete factory; } +::DosQMetaObject *dos_qabstractlistmodel_qmetaobject() +{ + return new DOS::DosIQMetaObjectHolder(std::make_shared()); +} + +::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(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(model); +} + ::DosQMetaObject *dos_qabstractitemmodel_qmetaobject() { return new DOS::DosIQMetaObjectHolder(std::make_shared()); diff --git a/lib/src/DosQAbstractItemModel.cpp b/lib/src/DosQAbstractItemModel.cpp index 11d2f31..7839ec5 100644 --- a/lib/src/DosQAbstractItemModel.cpp +++ b/lib/src/DosQAbstractItemModel.cpp @@ -2,28 +2,32 @@ #include "DOtherSide/DosQObjectImpl.h" namespace { -DOS::DosQObjectImpl::ParentMetaCall createParentMetaCall(QAbstractItemModel *parent) + +template +DOS::DosQObjectImpl::ParentMetaCall createParentMetaCall(DOS::DosQAbstractGenericModel *parent) { 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 { -DosQAbstractItemModel::DosQAbstractItemModel(void *modelObject, - DosIQMetaObjectPtr metaObject, - OnSlotExecuted onSlotExecuted, - RowCountCallback rowCountCallback, - ColumnCountCallback columnCountCallback, - DataCallback dataCallback, - SetDataCallback setDataCallback, - RoleNamesCallback roleNamesCallback, - FlagsCallback flagsCallback, - HeaderDataCallback headerDataCallback, - IndexCallback indexCallback, - ParentCallback parentCallback) +template +DosQAbstractGenericModel::DosQAbstractGenericModel(void *modelObject, + DosIQMetaObjectPtr metaObject, + OnSlotExecuted onSlotExecuted, + RowCountCallback rowCountCallback, + ColumnCountCallback columnCountCallback, + DataCallback dataCallback, + SetDataCallback setDataCallback, + RoleNamesCallback roleNamesCallback, + FlagsCallback flagsCallback, + HeaderDataCallback headerDataCallback, + IndexCallback indexCallback, + ParentCallback parentCallback) : m_impl(new DosQObjectImpl(this, ::createParentMetaCall(this), std::move(metaObject), std::move(onSlotExecuted))) , m_modelObject(std::move(modelObject)) , m_rowCountCallback(std::move(rowCountCallback)) @@ -37,150 +41,179 @@ DosQAbstractItemModel::DosQAbstractItemModel(void *modelObject, , m_parentCallback(std::move(parentCallback)) {} -bool DosQAbstractItemModel::emitSignal(QObject *emitter, const QString &name, const std::vector &argumentsValues) +template +bool DosQAbstractGenericModel::emitSignal(QObject *emitter, const QString &name, const std::vector &argumentsValues) { Q_ASSERT(m_impl); return m_impl->emitSignal(emitter, name, argumentsValues); } -const QMetaObject *DosQAbstractItemModel::metaObject() const +template +const QMetaObject *DosQAbstractGenericModel::metaObject() const { Q_ASSERT(m_impl); return m_impl->metaObject(); } -int DosQAbstractItemModel::qt_metacall(QMetaObject::Call call, int index, void **args) +template +int DosQAbstractGenericModel::qt_metacall(QMetaObject::Call call, int index, void **args) { Q_ASSERT(m_impl); return m_impl->qt_metacall(call, index, args); } -int DosQAbstractItemModel::rowCount(const QModelIndex &parent) const +template +int DosQAbstractGenericModel::rowCount(const QModelIndex &parent) const { int result; m_rowCountCallback(m_modelObject, &parent, &result); return result; } -int DosQAbstractItemModel::columnCount(const QModelIndex &parent) const +template +int DosQAbstractGenericModel::columnCount(const QModelIndex &parent) const { int result; m_columnCountCallback(m_modelObject, &parent, &result); return result; } -QVariant DosQAbstractItemModel::data(const QModelIndex &index, int role) const +template +QVariant DosQAbstractGenericModel::data(const QModelIndex &index, int role) const { QVariant result; m_dataCallback(m_modelObject, &index, role, &result); return result; } -bool DosQAbstractItemModel::setData(const QModelIndex &index, const QVariant &value, int role) +template +bool DosQAbstractGenericModel::setData(const QModelIndex &index, const QVariant &value, int role) { bool result = false; m_setDataCallback(m_modelObject, &index, &value, role, &result); return result; } -Qt::ItemFlags DosQAbstractItemModel::flags(const QModelIndex &index) const +template +Qt::ItemFlags DosQAbstractGenericModel::flags(const QModelIndex &index) const { int result; m_flagsCallback(m_modelObject, &index, &result); return Qt::ItemFlags(result); } -QVariant DosQAbstractItemModel::headerData(int section, Qt::Orientation orientation, int role) const +template +QVariant DosQAbstractGenericModel::headerData(int section, Qt::Orientation orientation, int role) const { QVariant result; m_headerDataCallback(m_modelObject, section, orientation, role, &result); return result; } -QModelIndex DosQAbstractItemModel::index(int row, int column, const QModelIndex &parent) const +template +QModelIndex DosQAbstractGenericModel::index(int row, int column, const QModelIndex &parent) const { QModelIndex result; m_indexCallback(m_modelObject, row, column, &parent, &result); return result; } -QModelIndex DosQAbstractItemModel::parent(const QModelIndex &child) const +template +QModelIndex DosQAbstractGenericModel::parent(const QModelIndex &child) const { QModelIndex result; m_parentCallback(m_modelObject, &child, &result); return result; } -void *DosQAbstractItemModel::modelObject() +template +void *DosQAbstractGenericModel::modelObject() { return m_modelObject; } -QHash DosQAbstractItemModel::roleNames() const +template +QHash DosQAbstractGenericModel::roleNames() const { QHash result; m_roleNamesCallback(m_modelObject, &result); return result; } -void DOS::DosQAbstractItemModel::publicBeginInsertColumns(const QModelIndex &index, int first, int last) +template +void DosQAbstractGenericModel::publicBeginInsertColumns(const QModelIndex &index, int first, int last) { - beginInsertColumns(index, first, last); + T::beginInsertColumns(index, first, last); } -void DOS::DosQAbstractItemModel::publicEndInsertColumns() +template +void DosQAbstractGenericModel::publicEndInsertColumns() { - endInsertColumns(); + T::endInsertColumns(); } -void DOS::DosQAbstractItemModel::publicBeginRemoveColumns(const QModelIndex &index, int first, int last) +template +void DosQAbstractGenericModel::publicBeginRemoveColumns(const QModelIndex &index, int first, int last) { - beginRemoveColumns(index, first, last); + T::beginRemoveColumns(index, first, last); } -void DOS::DosQAbstractItemModel::publicEndRemoveColumns() +template +void DosQAbstractGenericModel::publicEndRemoveColumns() { - endRemoveColumns(); + T::endRemoveColumns(); +} +template +void DosQAbstractGenericModel::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 +void DosQAbstractGenericModel::publicEndInsertRows() { - beginInsertRows(index, first, last); + T::endInsertRows(); } -void DOS::DosQAbstractItemModel::publicEndInsertRows() +template +void DosQAbstractGenericModel::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 +void DosQAbstractGenericModel::publicEndRemoveRows() { - beginRemoveRows(index, first, last); + T::endRemoveRows(); } -void DOS::DosQAbstractItemModel::publicEndRemoveRows() +template +void DosQAbstractGenericModel::publicBeginResetModel() { - endRemoveRows(); + T::beginResetModel(); } -void DOS::DosQAbstractItemModel::publicBeginResetModel() +template +void DosQAbstractGenericModel::publicEndResetModel() { - beginResetModel(); + T::endResetModel(); } -void DOS::DosQAbstractItemModel::publicEndResetModel() +template +void DosQAbstractGenericModel::publicDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles) { - endResetModel(); + emit T::dataChanged(topLeft, bottomRight, roles); } -void DOS::DosQAbstractItemModel::publicDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles) +template +QModelIndex DosQAbstractGenericModel::publicCreateIndex(int row, int column, void *data) const { - emit dataChanged(topLeft, bottomRight, roles); -} - -QModelIndex DOS::DosQAbstractItemModel::publicCreateIndex(int row, int column, void *data) const -{ - return createIndex(row, column, data); + return T::createIndex(row, column, data); } } // namespace DOS + +// Force instantiation +template class DOS::DosQAbstractGenericModel; +template class DOS::DosQAbstractGenericModel; +template class DOS::DosQAbstractGenericModel; diff --git a/lib/src/DosQMetaObject.cpp b/lib/src/DosQMetaObject.cpp index edf3086..35ba5aa 100644 --- a/lib/src/DosQMetaObject.cpp +++ b/lib/src/DosQMetaObject.cpp @@ -41,19 +41,17 @@ Value valueOrDefault(std::unordered_map const &map, const Key &k, Va return it != std::end(map) ? it->second : std::move(value); } -QMetaObject *createDynamicQObjectMetaObject() -{ - QMetaObjectBuilder builder; - builder.setClassName("DosQObject"); - builder.setSuperClass(&QObject::staticMetaObject); - return builder.toMetaObject(); -} +template const char* className(); +template<> const char* className() { return "DosQObject"; } +template<> const char* className() { return "DosQAbstractItemModel"; } +template<> const char* className() { return "DosQAbstractListModel"; } -QMetaObject *createDynamicQAbstractItemModelMetaObject() +template +QMetaObject *createDynamicMetaObject() { QMetaObjectBuilder builder; - builder.setClassName("DosQAbstractItemModel"); - builder.setSuperClass(&QAbstractItemModel::staticMetaObject); + builder.setClassName(className()); + builder.setSuperClass(&T::staticMetaObject); return builder.toMetaObject(); } @@ -91,13 +89,19 @@ const DosIQMetaObject *BaseDosQMetaObject::superClassDosMetaObject() const } DosQObjectMetaObject::DosQObjectMetaObject() - : BaseDosQMetaObject(::createDynamicQObjectMetaObject()) + : BaseDosQMetaObject(::createDynamicMetaObject()) {} -DosQAbstractItemModelMetaObject::DosQAbstractItemModelMetaObject() - : BaseDosQMetaObject(::createDynamicQAbstractItemModelMetaObject()) +template +DosQAbstractGenericModelMetaObject::DosQAbstractGenericModelMetaObject() + : BaseDosQMetaObject(::createDynamicMetaObject()) {} +// Force template instantations +template class DosQAbstractGenericModelMetaObject; +template class DosQAbstractGenericModelMetaObject; + + DosQMetaObject::DosQMetaObject(DosIQMetaObjectPtr superClassMetaObject, const QString &className, const SignalDefinitions &signalDefinitions,