#pragma once #include "DOtherSide/DosQAbstractItemModel.h" #include "DOtherSide/DosQMetaObject.h" namespace DOS { template class DosQAbstractItemModelWrapper : public QAbstractItemModel, public DosIQAbstractItemModelImpl { public: static const QMetaObject staticMetaObject; /// Constructor DosQAbstractItemModelWrapper(QObject *parent = nullptr); /// Destructor ~DosQAbstractItemModelWrapper(); /// @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 &argumentsValues); /// Return the qml registration type static const QmlRegisterType &qmlRegisterType(); /// Sets the qml registration type static void setQmlRegisterType(QmlRegisterType data); /// Sets the static metaobject static void setStaticMetaObject(const QMetaObject &metaObject); /// Sets the qmlRegisterType id static void setId(int id); /// @see QAbstractItemModel::rowCount int rowCount(const QModelIndex &parent = QModelIndex()) const override; /// @see QAbstractItemModel::columnCount int columnCount(const QModelIndex &parent = QModelIndex()) const override; /// @see QAbstractItemModel::data QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; /// @see QAbstractItemModel::setData bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; /// @see QAbstractItemModel::flags Qt::ItemFlags flags(const QModelIndex &index) const override; /// @see QAbstractItemModel::headerData QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; /// @see QAbstractItemModel::roleNames QHash roleNames() const override; /// @see QAbstractItemModel::index QModelIndex index(int row, int column, const QModelIndex &parent) const override; /// @see QAbstractItemModel::parent QModelIndex parent(const QModelIndex &child) const override; /// @see DosIQAbstractItemModelImpl::publicBeginInsertRows void publicBeginInsertRows(const QModelIndex &index, int first, int last) override; /// @see DosIQAbstractItemModelImpl::publicEndInsertRows void publicEndInsertRows() override; /// @see DosIQAbstractItemModelImpl::publicBeginRemoveRows void publicBeginRemoveRows(const QModelIndex &index, int first, int last) override; /// @see DosIQAbstractItemModelImpl::publicEndRemoveRows void publicEndRemoveRows() override; /// @see DosIQAbstractItemModelImpl::publicBeginInsertColumns void publicBeginInsertColumns(const QModelIndex &index, int first, int last) override; /// @see DosIQAbstractItemModelImpl::publicEndInsertColumns void publicEndInsertColumns() override; /// @see DosIQAbstractItemModelImpl::publicBeginRemoveColumns void publicBeginRemoveColumns(const QModelIndex &index, int first, int last) override; /// @see DosIQAbstractItemModelImpl::publicEndRemoveColumns void publicEndRemoveColumns() override; /// @see DosIQAbstractItemModelImpl::publicBeginResetModel void publicBeginResetModel() override; /// @see DosIQAbstractItemModelImpl::publicEndResetModel void publicEndResetModel() override; /// @see DosIQAbstractItemModelImpl::publicDataChanged void publicDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles = QVector()) override; /// @see DosIQAbstractItemModelImpl::createIndex QModelIndex publicCreateIndex(int row, int column, void *data) const override; /// @see DosIQAbstractItemModelImpl::defaultRowCount int defaultRowCount(const QModelIndex &parent) const override; /// @see DosIQAbstractItemModelImpl::defaultColumnCount int defaultColumnCount(const QModelIndex &parent) const override; /// @see DosIQAbstractItemModelImpl::defaultData QVariant defaultData(const QModelIndex &index, int role) const override; /// @see DosIQAbstractItemModelImpl::defaultSetData bool defaultSetData(const QModelIndex &index, const QVariant &value, int role) override; /// @see DosIQAbstractItemModelImpl::defaultFlags Qt::ItemFlags defaultFlags(const QModelIndex &index) const override; /// @see DosIQAbstractItemModelImpl::defaultHeaderData QVariant defaultHeaderData(int section, Qt::Orientation orientation, int role) const override; /// @see DosIQAbstractItemModelImpl::defaultRoleNames QHash defaultRoleNames() const override; private: void *m_dObject; DosQAbstractItemModel *m_impl; static int m_id; static QmlRegisterType m_data; }; template const QMetaObject DosQAbstractItemModelWrapper::staticMetaObject = QAbstractItemModel::staticMetaObject; template QmlRegisterType DosQAbstractItemModelWrapper::m_data; template int DosQAbstractItemModelWrapper::m_id = -1; template DosQAbstractItemModelWrapper::DosQAbstractItemModelWrapper(QObject *parent) : QAbstractItemModel(parent) , m_dObject(nullptr) , m_impl(nullptr) { void *impl = nullptr; m_data.createDObject(m_id, static_cast(this), &m_dObject, &impl); beginResetModel(); m_impl = dynamic_cast(static_cast(impl)); QObject::connect(m_impl, &DosQAbstractItemModel::rowsAboutToBeInserted, this, &DosQAbstractItemModelWrapper::beginInsertRows); QObject::connect(m_impl, &DosQAbstractItemModel::rowsInserted, this, &DosQAbstractItemModelWrapper::endInsertRows); QObject::connect(m_impl, &DosQAbstractItemModel::rowsAboutToBeRemoved, this, &DosQAbstractItemModelWrapper::beginRemoveRows); QObject::connect(m_impl, &DosQAbstractItemModel::rowsRemoved, this, &DosQAbstractItemModelWrapper::endRemoveRows); QObject::connect(m_impl, &DosQAbstractItemModel::rowsAboutToBeMoved, this, &DosQAbstractItemModelWrapper::beginMoveRows); QObject::connect(m_impl, &DosQAbstractItemModel::rowsMoved, this, &DosQAbstractItemModelWrapper::endMoveRows); QObject::connect(m_impl, &DosQAbstractItemModel::columnsAboutToBeInserted, this, &DosQAbstractItemModelWrapper::beginInsertColumns); QObject::connect(m_impl, &DosQAbstractItemModel::columnsInserted, this, &DosQAbstractItemModelWrapper::endInsertColumns); QObject::connect(m_impl, &DosQAbstractItemModel::columnsAboutToBeRemoved, this, &DosQAbstractItemModelWrapper::beginRemoveColumns); QObject::connect(m_impl, &DosQAbstractItemModel::columnsRemoved, this, &DosQAbstractItemModelWrapper::endRemoveColumns); QObject::connect(m_impl, &DosQAbstractItemModel::columnsAboutToBeMoved, this, &DosQAbstractItemModelWrapper::beginMoveColumns); QObject::connect(m_impl, &DosQAbstractItemModel::columnsMoved, this, &DosQAbstractItemModelWrapper::endMoveColumns); QObject::connect(m_impl, &DosQAbstractItemModel::modelAboutToBeReset, this, &DosQAbstractItemModelWrapper::beginResetModel); QObject::connect(m_impl, &DosQAbstractItemModel::modelReset, this, &DosQAbstractItemModelWrapper::endResetModel); QObject::connect(m_impl, &DosQAbstractItemModel::dataChanged, this, &DosQAbstractItemModelWrapper::dataChanged); QObject::connect(m_impl, &DosQAbstractItemModel::layoutAboutToBeChanged, this, &DosQAbstractItemModelWrapper::layoutAboutToBeChanged); QObject::connect(m_impl, &DosQAbstractItemModel::layoutChanged, this, &DosQAbstractItemModelWrapper::layoutChanged); endResetModel(); Q_ASSERT(m_dObject); Q_ASSERT(m_impl); } template DosQAbstractItemModelWrapper::~DosQAbstractItemModelWrapper() { m_data.deleteDObject(m_id, m_dObject); m_dObject = nullptr; delete m_impl; m_impl = nullptr; } template const QMetaObject *DosQAbstractItemModelWrapper::metaObject() const { Q_ASSERT(m_impl); return m_impl->metaObject(); } template int DosQAbstractItemModelWrapper::qt_metacall(QMetaObject::Call call, int index, void **args) { Q_ASSERT(m_impl); return m_impl->qt_metacall(call, index, args); } template bool DosQAbstractItemModelWrapper::emitSignal(QObject *emitter, const QString &name, const std::vector &argumentsValues) { Q_ASSERT(m_impl); return m_impl->emitSignal(this, name, argumentsValues); } template void DosQAbstractItemModelWrapper::setQmlRegisterType(QmlRegisterType data) { m_data = std::move(data); } template void DosQAbstractItemModelWrapper::setStaticMetaObject(const QMetaObject &metaObject) { *(const_cast(&staticMetaObject)) = metaObject; } template void DosQAbstractItemModelWrapper::setId(int id) { m_id = id; } template int DosQAbstractItemModelWrapper::rowCount(const QModelIndex &parent) const { Q_ASSERT(m_impl); return m_impl->rowCount(parent); } template int DosQAbstractItemModelWrapper::columnCount(const QModelIndex &parent) const { Q_ASSERT(m_impl); return m_impl->columnCount(parent); } template QVariant DosQAbstractItemModelWrapper::data(const QModelIndex &index, int role) const { Q_ASSERT(m_impl); return m_impl->data(index, role); } template bool DosQAbstractItemModelWrapper::setData(const QModelIndex &index, const QVariant &value, int role) { Q_ASSERT(m_impl); return m_impl->setData(index, value, role); } template Qt::ItemFlags DosQAbstractItemModelWrapper::flags(const QModelIndex &index) const { Q_ASSERT(m_impl); return m_impl->flags(index); } template QVariant DosQAbstractItemModelWrapper::headerData(int section, Qt::Orientation orientation, int role) const { Q_ASSERT(m_impl); return m_impl->headerData(section, orientation, role); } template QHash DosQAbstractItemModelWrapper::roleNames() const { Q_ASSERT(m_impl); return m_impl->roleNames(); } template QModelIndex DosQAbstractItemModelWrapper::index(int row, int column, const QModelIndex &parent) const { Q_ASSERT(m_impl); return m_impl->index(row, column, parent); } template QModelIndex DosQAbstractItemModelWrapper::parent(const QModelIndex &child) const { Q_ASSERT(m_impl); return m_impl->parent(child); } template void DosQAbstractItemModelWrapper::publicBeginInsertRows(const QModelIndex &index, int first, int last) { m_impl->publicBeginInsertRows(index, first, last); } template void DosQAbstractItemModelWrapper::publicEndInsertRows() { m_impl->publicEndInsertRows(); } template void DosQAbstractItemModelWrapper::publicBeginRemoveRows(const QModelIndex &index, int first, int last) { m_impl->publicBeginRemoveRows(index, first, last); } template void DosQAbstractItemModelWrapper::publicEndRemoveRows() { m_impl->publicEndRemoveRows(); } template void DosQAbstractItemModelWrapper::publicBeginInsertColumns(const QModelIndex &index, int first, int last) { m_impl->publicBeginInsertColumns(index, first, last); } template void DosQAbstractItemModelWrapper::publicEndInsertColumns() { m_impl->publicEndInsertColumns(); } template void DosQAbstractItemModelWrapper::publicBeginRemoveColumns(const QModelIndex &index, int first, int last) { m_impl->publicBeginRemoveColumns(index, first, last); } template void DosQAbstractItemModelWrapper::publicEndRemoveColumns() { m_impl->publicEndRemoveColumns(); } template void DosQAbstractItemModelWrapper::publicBeginResetModel() { m_impl->publicBeginResetModel(); } template void DosQAbstractItemModelWrapper::publicEndResetModel() { m_impl->publicEndResetModel(); } template void DosQAbstractItemModelWrapper::publicDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles) { m_impl->publicDataChanged(topLeft, bottomRight, roles); } template QModelIndex DosQAbstractItemModelWrapper::publicCreateIndex(int row, int column, void *data) const { return m_impl->publicCreateIndex(row, column, data); } template int DosQAbstractItemModelWrapper::defaultRowCount(const QModelIndex &parent) const { return m_impl->defaultRowCount(parent); } template int DosQAbstractItemModelWrapper::defaultColumnCount(const QModelIndex &parent) const { return m_impl->defaultColumnCount(parent); } template QVariant DosQAbstractItemModelWrapper::defaultData(const QModelIndex &index, int role) const { return m_impl->defaultData(index, role); } template bool DosQAbstractItemModelWrapper::defaultSetData(const QModelIndex &index, const QVariant &value, int role) { return m_impl->defaultSetData(index, value, role); } template Qt::ItemFlags DosQAbstractItemModelWrapper::defaultFlags(const QModelIndex &index) const { return m_impl->defaultFlags(index); } template QVariant DosQAbstractItemModelWrapper::defaultHeaderData(int section, Qt::Orientation orientation, int role) const { return m_impl->defaultHeaderData(section, orientation, role); } template QHash DosQAbstractItemModelWrapper::defaultRoleNames() const { return m_impl->defaultRoleNames(); } template const QmlRegisterType &DosQAbstractItemModelWrapper::qmlRegisterType() { return m_data; } namespace DQAIMW { template using RegisterTypeQObject = DosQAbstractItemModelWrapper; template int dosQmlRegisterType(QmlRegisterType args) { RegisterTypeQObject::setQmlRegisterType(std::move(args)); const QmlRegisterType &type = RegisterTypeQObject::qmlRegisterType(); RegisterTypeQObject::setStaticMetaObject(*(type.staticMetaObject->metaObject())); int result = qmlRegisterType>(type.uri.c_str(), type.major, type.minor, type.qml.c_str()); RegisterTypeQObject::setId(result); return result; } template struct DosQmlRegisterHelper { static int Register(int i, QmlRegisterType args) { if (i > N) return -1; else if (i == N) return dosQmlRegisterType(std::move(args)); else return DosQmlRegisterHelper < N - 1 >::Register(i, std::move(args)); } }; template<> struct DosQmlRegisterHelper<0> { static int Register(int i, QmlRegisterType args) { return i == 0 ? dosQmlRegisterType<0>(std::move(args)) : -1; } }; int dosQmlRegisterType(QmlRegisterType args) { static int i = 0; return DosQmlRegisterHelper<35>::Register(i++, std::move(args)); } template using RegisterSingletonTypeQObject = DosQAbstractItemModelWrapper; template QObject *singletontype_provider(QQmlEngine *engine, QJSEngine *scriptEngine) { return new RegisterSingletonTypeQObject(); } template int dosQmlRegisterSingletonType(QmlRegisterType args) { using Func = QObject * (*)(QQmlEngine *, QJSEngine *); Func f = singletontype_provider; RegisterSingletonTypeQObject::setQmlRegisterType(std::move(args)); const QmlRegisterType &type = RegisterSingletonTypeQObject::qmlRegisterType(); RegisterSingletonTypeQObject::setStaticMetaObject(*(type.staticMetaObject->metaObject())); int result = qmlRegisterSingletonType>(type.uri.c_str(), type.major, type.minor, type.qml.c_str(), f); RegisterSingletonTypeQObject::setId(result); return result; } template struct DosQmlRegisterSingletonHelper { static int Register(int i, QmlRegisterType args) { if (i > N) return -1; else if (i == N) return dosQmlRegisterSingletonType(std::move(args)); else return DosQmlRegisterSingletonHelper < N - 1 >::Register(i, std::move(args)); } }; template<> struct DosQmlRegisterSingletonHelper<0> { static int Register(int i, QmlRegisterType args) { return i == 0 ? dosQmlRegisterSingletonType<0>(std::move(args)) : -1; } }; int dosQmlRegisterSingletonType(QmlRegisterType args) { static int i = 0; return DosQmlRegisterSingletonHelper<35>::Register(i++, std::move(args)); } } }