/** * @RDE_HEADER@ * * Tree model for the TopicSortModel * * $Id$ * $HeadURL$ * $Author$ */ #pragma once #include #include #include "logger.h" #include "nglsettings.h" #include class TreeItem; class TreeModel; class TopicDataModel final : public QAbstractItemModel { Q_OBJECT public: explicit TopicDataModel(QObject *parent = nullptr); ~TopicDataModel(); QVariant data(const QModelIndex &index, int role) const override; QVariant headerData(int section, Qt::Orientation orientation, int role) const override; QModelIndex index(int row, int column, const QModelIndex &parent) const override; int rowCount(const QModelIndex &parent) const override; int columnCount(const QModelIndex &parent) const override; QModelIndex parent(const QModelIndex &child) const override; static dds::core::xtypes::TypeKind typeKindFromData(const std::shared_ptr &ddParent, int row); static const dds::core::xtypes::Member &memberFromType(const dds::core::xtypes::StructType &parent, dds::core::xtypes::StructType &stCopy, int row); public Q_SLOTS: void setTopicData(const dds::core::xtypes::DynamicData &data); void reset(); private: QVariant dataInternal(const QModelIndex &index, int role) const; void cleanupModelIndexes(); std::shared_ptr parentFromPath(int pathIdx, const QVector &path, const std::shared_ptr &ddParent) const; static QString positionFromStruct(const dds::core::xtypes::DynamicData &data); static dds::core::xtypes::TypeKind childTypeKind(const std::shared_ptr &ddParent, int typeRow); private: std::shared_ptr m_data; struct PathInformationKey { int row = 0; int column = 0; QModelIndex parentIndex; PathInformationKey(int r, int c, const QModelIndex &parent) : row(r) , column(c) , parentIndex(parent) {} bool operator==(const PathInformationKey &o) const { if (row != o.row) return false; if (column != o.column) return false; if (parentIndex != o.parentIndex) return false; return true; } }; friend uint qHash(const TopicDataModel::PathInformationKey &k); mutable QHash m_pathInformations; struct IndexData { QVector path; QModelIndex index; QModelIndex parent; QVariant displayRole[4]; }; NGL::INGLLogger &m_logger; }; inline uint qHash(const TopicDataModel::PathInformationKey &k) { const quint64 p = reinterpret_cast(k.parentIndex.internalPointer()); uint ret = static_cast(k.row); ret ^= static_cast(k.column); ret ^= static_cast(p & 0xffffffff); ret ^= static_cast((p >> 32) & 0xffffffff); return ret; } // -------------------------------------------------------------------------------- // | Class TopicSortModel | // -------------------------------------------------------------------------------- class TopicSortModel final : public QSortFilterProxyModel { Q_OBJECT public: using QSortFilterProxyModel::QSortFilterProxyModel; TreeItem *addData(const TopicDescriptionEx &data, TreeItem *parent); TopicDescriptionEx getData(const QModelIndex &idx) const; void setSourceModel(QAbstractItemModel *sourceModel) override; protected: bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override; private: TreeModel *m_sourceModel = nullptr; }; // -------------------------------------------------------------------------------- // | Class TreeItem | // -------------------------------------------------------------------------------- class TreeItem final { public: explicit TreeItem(const TopicDescriptionEx &description, TreeItem *parent); ~TreeItem(); void appendChild(TreeItem *child); TreeItem *child(int row); int childCount() const; QVariant itemData(int column) const; int row() const; TreeItem *parentItem(); TopicDescriptionEx data() const { return m_data; } private: TopicDescriptionEx m_data; QVector m_childItems; TreeItem *m_parentItem; }; // -------------------------------------------------------------------------------- // | Class TreeModel | // -------------------------------------------------------------------------------- class TreeModel final : public QAbstractItemModel { Q_OBJECT public: explicit TreeModel(QObject *parent = nullptr); ~TreeModel(); QVariant data(const QModelIndex &index, int role) const override; Qt::ItemFlags flags(const QModelIndex &index) const override; QVariant headerData(int section, Qt::Orientation orientation, int role) const override; QModelIndex index(int row, int column, const QModelIndex &parent) const override; QModelIndex parent(const QModelIndex &index) const override; int rowCount(const QModelIndex &parent) const override; int columnCount(const QModelIndex &parent) const override; QMimeData *mimeData(const QModelIndexList &indexes) const override; QStringList mimeTypes() const override; Qt::DropActions supportedDragActions() const override; TreeItem *addData(const TopicDescriptionEx &data, TreeItem *parent); TreeItem *rootItem() const { return m_rootItem; } TopicDescriptionEx getData(const QModelIndex &idx) const; void setWithTypeCode(bool bWith) { m_bWithTypeCode = bWith; } private: TreeItem *m_rootItem; bool m_bWithTypeCode; };