5#include <QtCore/QAbstractListModel>
8#include <istd/TSharedNullable.h>
15template <
class ModelDataType,
class ModelObjectDataType>
16class TListModelBase:
public QAbstractListModel
19 explicit TListModelBase(QObject* parent =
nullptr);
22 virtual int rowCount(
const QModelIndex& parent = QModelIndex())
const override;
23 virtual QVariant data(
const QModelIndex& index,
int role = Qt::DisplayRole)
const override;
24 virtual bool setData(
const QModelIndex& index,
const QVariant& value,
int role = Qt::EditRole)
override;
25 virtual QHash<int, QByteArray> roleNames()
const override;
28 ModelObjectDataType* GetOrCreateCachedObject(
int index)
const;
33 istd::TSharedNullable<QList<ModelDataType>> Version_1_0;
34 mutable QMap<int, ModelObjectDataType*> m_objectDataTypeMap;
38template <
class ModelDataType,
class ModelObjectDataType>
39void TListModelBase<ModelDataType, ModelObjectDataType>::ClearCache()
41 for (
auto it = m_objectDataTypeMap.begin(); it != m_objectDataTypeMap.end(); ++it){
42 it.value()->deleteLater();
45 m_objectDataTypeMap.clear();
49template <
class ModelDataType,
class ModelObjectDataType>
50ModelObjectDataType* TListModelBase<ModelDataType, ModelObjectDataType>::GetOrCreateCachedObject(
int index)
const
52 ModelObjectDataType* retVal =
nullptr;
53 if (m_objectDataTypeMap.contains(index)){
54 retVal = m_objectDataTypeMap[index];
57 retVal =
new ModelObjectDataType();
58 retVal->Version_1_0 = Version_1_0->at(index);
59 m_objectDataTypeMap.insert(index, retVal);
68template <
class ModelDataType,
class ModelObjectDataType>
69TListModelBase<ModelDataType, ModelObjectDataType>::
70 TListModelBase(QObject *parent): QAbstractListModel(parent)
72 Version_1_0.emplace();
78template <
class ModelDataType,
class ModelObjectDataType>
79int TListModelBase<ModelDataType, ModelObjectDataType>::
80 rowCount(
const QModelIndex& )
const
82 if (Version_1_0.has_value()){
83 return Version_1_0->count();
90template <
class ModelDataType,
class ModelObjectDataType>
91QVariant TListModelBase<ModelDataType, ModelObjectDataType>::
92 data(
const QModelIndex& index,
int role)
const
96 int row = index.row();
97 if (!Version_1_0.has_value() || row < 0 || row > Version_1_0->count() - 1){
101 ModelObjectDataType* retVal = GetOrCreateCachedObject(row);
102 return QVariant::fromValue(retVal);
106template <
class ModelDataType,
class ModelObjectDataType>
107bool TListModelBase<ModelDataType, ModelObjectDataType>::
108 setData(
const QModelIndex& index,
const QVariant& value,
int role)
112 int row = index.row();
114 if (!Version_1_0.has_value() || row < 0 || row > Version_1_0->count() - 1){
118 Version_1_0->insert(row, value.value<ModelDataType>());
124template <
class ModelDataType,
class ModelObjectDataType>
125QHash<int, QByteArray> TListModelBase<ModelDataType, ModelObjectDataType>::roleNames()
const
127 QHash<int, QByteArray> hash;
128 hash.insert(0,
"item");