173 lines
5.9 KiB
C++
Executable File
173 lines
5.9 KiB
C++
Executable File
/**
|
|
* @RDE_HEADER@
|
|
*
|
|
* Tree model for the TopicSortModel
|
|
*
|
|
* $Id$
|
|
* $HeadURL$
|
|
* $Author$
|
|
*/
|
|
#pragma once
|
|
|
|
#include <QSortFilterProxyModel>
|
|
#include <QModelIndex>
|
|
#include "logger.h"
|
|
#include "nglsettings.h"
|
|
|
|
#include <dds/core/xtypes/DynamicData.hpp>
|
|
|
|
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<dds::core::xtypes::DynamicData> &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<dds::core::xtypes::DynamicData> parentFromPath(int pathIdx, const QVector<int> &path,
|
|
const std::shared_ptr<dds::core::xtypes::DynamicData> &ddParent) const;
|
|
static QString positionFromStruct(const dds::core::xtypes::DynamicData &data);
|
|
static dds::core::xtypes::TypeKind childTypeKind(const std::shared_ptr<dds::core::xtypes::DynamicData> &ddParent,
|
|
int typeRow);
|
|
private:
|
|
std::shared_ptr<dds::core::xtypes::DynamicData> 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<PathInformationKey, QModelIndex> m_pathInformations;
|
|
struct IndexData
|
|
{
|
|
QVector<int> path;
|
|
QModelIndex index;
|
|
QModelIndex parent;
|
|
QVariant displayRole[4];
|
|
};
|
|
NGL::INGLLogger &m_logger;
|
|
};
|
|
inline uint qHash(const TopicDataModel::PathInformationKey &k)
|
|
{
|
|
const quint64 p = reinterpret_cast<quint64>(k.parentIndex.internalPointer());
|
|
uint ret = static_cast<uint>(k.row);
|
|
ret ^= static_cast<uint>(k.column);
|
|
ret ^= static_cast<uint>(p & 0xffffffff);
|
|
ret ^= static_cast<uint>((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<TreeItem *> 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;
|
|
};
|