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
5// ImtCore includes
6#include <imtsdl/TSdlAbstractListModel.h>
7
8
9namespace imtsdl
10{
11
12
13template <class ModelDataType, class ModelObjectDataType>
14class TListModelBase: public TSdlAbstractListModel<ModelDataType, ModelObjectDataType>
15{
16public:
17 TListModelBase(QObject* parent = nullptr);
18protected:
19 void append(ModelObjectDataType* item);
20 void fromMe(TListModelBase<ModelDataType, ModelObjectDataType>* objectListPtr);
21 QString toJson();
22 QString toGraphQL();
23 bool isEqualWithModel(TListModelBase<ModelDataType, ModelObjectDataType>* otherModelPtr);
24 void insert(int index, ModelObjectDataType* item);
25
26 // reimplemented (TSdlAbstractListModel)
27 virtual QVariant GetOrCreateCachedObject(int index) const override;
28};
29
30
31template <class ModelDataType, class ModelObjectDataType>
32TListModelBase<ModelDataType, ModelObjectDataType>::TListModelBase(QObject* parent)
33 : TSdlAbstractListModel<ModelDataType, ModelObjectDataType>(parent)
34{
35
36}
37
38
39template <class ModelDataType, class ModelObjectDataType>
40void TListModelBase<ModelDataType, ModelObjectDataType>::append(ModelObjectDataType* item){
41 this->beginInsertRows(QModelIndex(), this->rowCount(), this->rowCount());
42 this->Version_1_0->append(*item->Version_1_0);
43 this->ClearCache();
44 this->endInsertRows();
45}
46
47
48template <class ModelDataType, class ModelObjectDataType>
49void TListModelBase<ModelDataType, ModelObjectDataType>::fromMe(TListModelBase<ModelDataType, ModelObjectDataType>* objectListPtr)
50{
51 for (int i = 0; i < this->rowCount(); i++){
52 QVariant item = this->getData("item", i);
53 if (!item.canConvert<ModelObjectDataType>()){
54 return;
55 }
56
57 ModelObjectDataType* itemObjectPtr = item.value<ModelObjectDataType*>();
58 if (itemObjectPtr == nullptr){
59 return;
60 }
61
62 ModelObjectDataType* copyItem(dynamic_cast<ModelObjectDataType*>(itemObjectPtr->copyMe()));
63 objectListPtr->append(copyItem);
64 }
65}
66
67
68template <class ModelDataType, class ModelObjectDataType>
69QString TListModelBase<ModelDataType, ModelObjectDataType>::toJson()
70{
71 QString retVal = QStringLiteral("[");
72
73 for (int i = 0; i < this->rowCount(); i++){
74 if (i > 0 && i < this->rowCount() - 1){
75 retVal += QStringLiteral(", ");
76 }
77
78 QVariant item = this->getData("item", i);
79 if (!item.canConvert<ModelObjectDataType*>()){
80 return nullptr;
81 }
82
83 ModelObjectDataType* itemObjectPtr = item.value<ModelObjectDataType*>();
84 if (itemObjectPtr == nullptr){
85 return QString();
86 }
87
88 retVal += itemObjectPtr->toJson();
89 }
90
91 retVal += QStringLiteral("]");
92
93 return retVal;
94}
95
96
97template <class ModelDataType, class ModelObjectDataType>
98QString TListModelBase<ModelDataType, ModelObjectDataType>::toGraphQL()
99{
100 QString retVal = QStringLiteral("[");
101
102 for (int i = 0; i < this->rowCount(); i++){
103 if (i > 0 && i < this->rowCount() - 1){
104 retVal += QStringLiteral(", ");
105 }
106
107 QVariant item = this->getData("item", i);
108 if (!item.canConvert<ModelObjectDataType*>()){
109 return nullptr;
110 }
111
112 ModelObjectDataType* itemObjectPtr = item.value<ModelObjectDataType*>();
113 if (itemObjectPtr == nullptr){
114 return QString();
115 }
116
117 retVal += itemObjectPtr->toGraphQL();
118 }
119
120 retVal += QStringLiteral("]");
121
122 return retVal;
123}
124
125
126template <class ModelDataType, class ModelObjectDataType>
127bool TListModelBase<ModelDataType, ModelObjectDataType>::isEqualWithModel(TListModelBase<ModelDataType, ModelObjectDataType>* otherModelPtr)
128{
129 if (otherModelPtr == nullptr){
130 return false;
131 }
132
133 if (this == otherModelPtr){
134 return false;
135 }
136
137 if (this->rowCount() != otherModelPtr->rowCount()){
138 return false;
139 }
140
141 for (int i = 0; i < this->rowCount(); i++){
142 QVariant selfItem = this->getData("item", i);
143 QVariant otherItem = otherModelPtr->getData("item", i);
144 if (!selfItem.canConvert<ModelObjectDataType>() || !otherItem.canConvert<ModelObjectDataType>()){
145 return false;
146 }
147
148 ModelObjectDataType* selfItemObjectPtr = selfItem.value<ModelObjectDataType*>();
149 if (selfItemObjectPtr == nullptr){
150 return false;
151 }
152
153 ModelObjectDataType* otherItemObjectPtr = otherItem.value<ModelObjectDataType*>();
154 if (otherItemObjectPtr == nullptr){
155 return false;
156 }
157
158 if (!selfItemObjectPtr->isEqualWithModel(otherItemObjectPtr)){
159 return false;
160 }
161 }
162
163 return true;
164}
165
166
167template <class ModelDataType, class ModelObjectDataType>
168void TListModelBase<ModelDataType, ModelObjectDataType>::insert(int index, ModelObjectDataType* item)
169{
170 if (index < 0 || index > this->Version_1_0->size()) {
171 return;
172 }
173 this->beginInsertRows(QModelIndex(), index, index);
174 this->Version_1_0->insert(index, *item->Version_1_0);
175 this->ClearCache();
176 this->endInsertRows();
177}
178
179
180// reimplemented (TSdlAbstractListModel)
181template <class ModelDataType, class ModelObjectDataType>
182QVariant TListModelBase<ModelDataType, ModelObjectDataType>::GetOrCreateCachedObject(int index) const
183{
184 Q_ASSERT_X(this->Version_1_0, "TListModelBase::GetOrCreateCachedObject", "Version_1_0 is null");
185
186 QVariant retVal;
187 if (this->m_objectDataTypeMap.contains(index)){
188 retVal = QVariant::fromValue(this->m_objectDataTypeMap[index]);
189 }
190 else{
191 auto* newItem = new ModelObjectDataType();
192 newItem->Version_1_0 = this->Version_1_0->at(index);
193 this->m_objectDataTypeMap.insert(index, QVariant::fromValue(newItem));
194 retVal = QVariant::fromValue(newItem);
195 }
196
197 return retVal;
198}
199
200
201} // namespace imtsdl
202
203