ImagingTools Core SDK
TSdlAbstractListModel.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// ImtCore includes
11#include <imtsdl/TElementList.h>
12
13
14namespace imtsdl
15{
16
17
18template <class ModelDataType, class ModelObjectDataType>
19class TSdlAbstractListModel: public QAbstractListModel
20{
21public:
22 TSdlAbstractListModel(QObject* parent = nullptr);
23
24 void ClearCache();
25 virtual QVariant GetOrCreateCachedObject(int index) const = 0;
26 virtual QVariantMap get(int row) const;
27 virtual void remove(int index);
28 virtual void clear();
29 virtual QVariant getData(const QString& nameId, int index);
30
31protected:
32 // reimplemented (QAbstractListModel)
33 virtual int rowCount(const QModelIndex& parent = QModelIndex()) const override;
34 virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
35 virtual bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole) override;
36 virtual QHash<int, QByteArray> roleNames() const override;
37
38public:
39 // available version members
40 istd::TSharedNullable<imtsdl::TElementList<ModelDataType>> Version_1_0;
41 mutable QMap<int, QVariant> m_objectDataTypeMap;
42};
43
44
45// reimplemented (TSdlAbstractListModel)
46
47template <class ModelDataType, class ModelObjectDataType>
48TSdlAbstractListModel<ModelDataType, ModelObjectDataType>::
49 TSdlAbstractListModel(QObject *parent): QAbstractListModel(parent)
50{
51 Version_1_0.emplace();
52}
53
54
55template <class ModelDataType, class ModelObjectDataType>
56void TSdlAbstractListModel<ModelDataType, ModelObjectDataType>::ClearCache()
57{
58 // for (auto it = m_objectDataTypeMap.begin(); it != m_objectDataTypeMap.end(); ++it){
59 // QObject* itemPtr = dynamic_cast<QObject*>(it.value());
60 // if (itemPtr){
61 // itemPtr->deleteLater();
62 // }
63 // }
64
65 m_objectDataTypeMap.clear();
66}
67
68
69template <class ModelDataType, class ModelObjectDataType>
70QVariantMap TSdlAbstractListModel<ModelDataType, ModelObjectDataType>::get(int row) const
71{
72 QVariantMap data;
73 QModelIndex idx = index(row, 0);
74 if (!idx.isValid()){
75 return data;
76 }
77 QHash<int, QByteArray> roles = roleNames();
78 for (auto it = roles.begin(); it != roles.end(); ++it){
79 data[it.value()] = idx.data(it.key());
80 }
81 return data;
82}
83
84
85template <class ModelDataType, class ModelObjectDataType>
86void TSdlAbstractListModel<ModelDataType, ModelObjectDataType>::remove(int index)
87{
88 if (index < 0 || index >= Version_1_0->size()){
89 return;
90 }
91 beginRemoveRows(QModelIndex(), index, index);
92 Version_1_0->removeAt(index);
93 ClearCache();
94 endRemoveRows();
95}
96
97
98template <class ModelDataType, class ModelObjectDataType>
99void TSdlAbstractListModel<ModelDataType, ModelObjectDataType>::clear()
100{
101 beginResetModel();
102 ClearCache();
103 Version_1_0->clear();
104 endResetModel();
105}
106
107
108template <class ModelDataType, class ModelObjectDataType>
109QVariant TSdlAbstractListModel<ModelDataType, ModelObjectDataType>::getData(const QString& nameId, int index)
110{
111 if (nameId == "item" && Version_1_0.has_value() && index >= 0 && index < Version_1_0->count()){
112 QVariant retVal = GetOrCreateCachedObject(index);
113 return retVal;
114 }
115 return QVariant();
116}
117
118
119// reimplemented (QAbstractListModel)
120
121template <class ModelDataType, class ModelObjectDataType>
122int TSdlAbstractListModel<ModelDataType, ModelObjectDataType>::
123 rowCount(const QModelIndex& /*parent*/) const
124{
125 if (Version_1_0.has_value()){
126 return Version_1_0->count();
127 }
128
129 return 0;
130}
131
132
133template <class ModelDataType, class ModelObjectDataType>
134QVariant TSdlAbstractListModel<ModelDataType, ModelObjectDataType>::
135 data(const QModelIndex& index, int role) const
136{
137 Q_UNUSED(role);
138
139 int row = index.row();
140 if (!Version_1_0.has_value() || row < 0 || row > Version_1_0->count() - 1){
141 return QVariant();
142 }
143
144 QVariant retVal = GetOrCreateCachedObject(row);
145 return retVal;
146}
147
148
149template <class ModelDataType, class ModelObjectDataType>
150bool TSdlAbstractListModel<ModelDataType, ModelObjectDataType>::
151 setData(const QModelIndex& index, const QVariant& value, int role)
152{
153 Q_UNUSED(role);
154
155 int row = index.row();
156
157 if (!Version_1_0.has_value() || row < 0 || row > Version_1_0->count() - 1){
158 return false;
159 }
160
161 ModelDataType* newItemPtr = value.value<ModelDataType*>();
162 istd::TSharedNullable<ModelDataType> newItem = *newItemPtr;
163 Version_1_0->insert(row, newItem);
164
165 return true;
166}
167
168
169template <class ModelDataType, class ModelObjectDataType>
170QHash<int, QByteArray> TSdlAbstractListModel<ModelDataType, ModelObjectDataType>::roleNames() const
171{
172 QHash<int, QByteArray> hash;
173 hash.insert(0,"item");
174
175 return hash;
176}
177
178
179} // namespace imtsdl
180
181