#pragma once #include #include #include #include #include #include #include "modelsyncedcontainer.h" class QQmlEngine; namespace qtmt { class ObjectProxyModel : public QIdentityProxyModel { Q_OBJECT Q_PROPERTY(QQmlComponent* delegate READ delegate WRITE setDelegate NOTIFY delegateChanged) Q_PROPERTY(QStringList expectedRoles READ expectedRoles WRITE setExpectedRoles NOTIFY expectedRolesChanged) Q_PROPERTY(QStringList exposedRoles READ exposedRoles WRITE setExposedRoles NOTIFY exposedRolesChanged) public: explicit ObjectProxyModel(QObject* parent = nullptr); QVariant data(const QModelIndex& index, int role) const override; void setSourceModel(QAbstractItemModel* sourceModel) override; QHash roleNames() const override; QQmlComponent* delegate() const; void setDelegate(QQmlComponent* delegate); void setExpectedRoles(const QStringList& expectedRoles); const QStringList& expectedRoles() const; void setExposedRoles(const QStringList& exposedRoles); const QStringList& exposedRoles() const; Q_INVOKABLE QObject* proxyObject(int index) const; signals: void delegateChanged(); void expectedRolesChanged(); void exposedRolesChanged(); protected slots: #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) void resetInternalData() override; #else void resetInternalData(); #endif private slots: void onCustomRoleChanged(); void emitAllDataChanged(); private: struct Entry { std::unique_ptr proxy; QQmlPropertyMap* rowData = nullptr; QQmlContext* context = nullptr; }; void initRoles(); void updateRoleNames(); void updateIndexes(int from, int to); QHash findExpectedRoles(const QHash &roleNames, const QStringList &expectedRoles); QPointer m_delegate; QHash m_expectedRoleNames; bool m_dataChangedQueued = false; QStringList m_expectedRoles; QStringList m_exposedRoles; QHash m_roleNames; QSet m_exposedRolesSet; mutable ModelSyncedContainer m_container; }; } // namespace qtmt