ImagingTools Core SDK
TListModelBase.h
1// SPDX-License-Identifier: LGPL-2.1-or-later OR GPL-2.0-or-later OR GPL-3.0-or-later OR LicenseRef-ImtCore-Commercial
2#pragma once
3
4// Qt includes
5#include <QtCore/QAbstractListModel>
6
7// ACF includes
8#include <istd/TSharedNullable.h>
9
10
11namespace imtbase
12{
13
14
15template <class ModelDataType, class ModelObjectDataType>
16class TListModelBase: public QAbstractListModel
17{
18public:
19 explicit TListModelBase(QObject* parent = nullptr);
20protected:
21 // reimplemented (QAbstractListModel)
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;
26
27 void ClearCache();
28 ModelObjectDataType* GetOrCreateCachedObject(int index) const;
29
30public:
31 // std::optional<QList<ModelDataType>>& m_modelData;
32 // available version members
33 istd::TSharedNullable<QList<ModelDataType>> Version_1_0;
34 mutable QMap<int, ModelObjectDataType*> m_objectDataTypeMap;
35};
36
37
38template <class ModelDataType, class ModelObjectDataType>
39void TListModelBase<ModelDataType, ModelObjectDataType>::ClearCache()
40{
41 for (auto it = m_objectDataTypeMap.begin(); it != m_objectDataTypeMap.end(); ++it){
42 it.value()->deleteLater();
43 }
44
45 m_objectDataTypeMap.clear();
46}
47
48
49template <class ModelDataType, class ModelObjectDataType>
50ModelObjectDataType* TListModelBase<ModelDataType, ModelObjectDataType>::GetOrCreateCachedObject(int index) const
51{
52 ModelObjectDataType* retVal = nullptr;
53 if (m_objectDataTypeMap.contains(index)){
54 retVal = m_objectDataTypeMap[index];
55 }
56 else{
57 retVal = new ModelObjectDataType();
58 retVal->Version_1_0 = Version_1_0->at(index);
59 m_objectDataTypeMap.insert(index, retVal);
60 }
61
62 return retVal;
63}
64
65
66// reimplemented (TListModelBase)
67
68template <class ModelDataType, class ModelObjectDataType>
69TListModelBase<ModelDataType, ModelObjectDataType>::
70 TListModelBase(QObject *parent): QAbstractListModel(parent)
71{
72 Version_1_0.emplace();
73}
74
75
76// reimplemented (QAbstractListModel)
77
78template <class ModelDataType, class ModelObjectDataType>
79int TListModelBase<ModelDataType, ModelObjectDataType>::
80 rowCount(const QModelIndex& /*parent*/) const
81{
82 if (Version_1_0.has_value()){
83 return Version_1_0->count();
84 }
85
86 return 0;
87}
88
89
90template <class ModelDataType, class ModelObjectDataType>
91QVariant TListModelBase<ModelDataType, ModelObjectDataType>::
92 data(const QModelIndex& index, int role) const
93{
94 Q_UNUSED(role);
95
96 int row = index.row();
97 if (!Version_1_0.has_value() || row < 0 || row > Version_1_0->count() - 1){
98 return QVariant();
99 }
100
101 ModelObjectDataType* retVal = GetOrCreateCachedObject(row);
102 return QVariant::fromValue(retVal);
103}
104
105
106template <class ModelDataType, class ModelObjectDataType>
107bool TListModelBase<ModelDataType, ModelObjectDataType>::
108 setData(const QModelIndex& index, const QVariant& value, int role)
109{
110 Q_UNUSED(role);
111
112 int row = index.row();
113
114 if (!Version_1_0.has_value() || row < 0 || row > Version_1_0->count() - 1){
115 return false;
116 }
117
118 Version_1_0->insert(row, value.value<ModelDataType>());
119
120 return true;
121}
122
123
124template <class ModelDataType, class ModelObjectDataType>
125QHash<int, QByteArray> TListModelBase<ModelDataType, ModelObjectDataType>::roleNames() const
126{
127 QHash<int, QByteArray> hash;
128 hash.insert(0,"item");
129
130 return hash;
131}
132
133
134} // namespace imtbase
135
136