Salome HOME
0e31dd7fd7bea98a67cfbad22ab9b509b21e0570
[modules/shaper.git] / src / XGUI / XGUI_PartDataModel.cpp
1 #include "XGUI_PartDataModel.h"
2
3 #include <ModelAPI_PluginManager.h>
4 #include <ModelAPI_Document.h>
5 #include <ModelAPI_Feature.h>
6 #include <ModelAPI_Data.h>
7 #include <ModelAPI_AttributeDocRef.h>
8
9 #include <QIcon>
10
11 XGUI_TopDataModel::XGUI_TopDataModel(const boost::shared_ptr<ModelAPI_Document>& theDocument, QObject* theParent)
12   : XGUI_FeaturesModel(theDocument, theParent)
13 {
14 }
15   
16 XGUI_TopDataModel::~XGUI_TopDataModel()
17 {
18 }
19
20
21 QVariant XGUI_TopDataModel::data(const QModelIndex& theIndex, int theRole) const
22 {
23   switch (theRole) {
24   case Qt::DisplayRole:
25     // return a name
26     switch (theIndex.internalId()) {
27     case ParamsFolder:
28       return tr("Parameters") + QString(" (%1)").arg(rowCount(theIndex));
29     case ParamObject:
30       {
31         boost::shared_ptr<ModelAPI_Feature> aFeature = myDocument->feature(PARAMETERS_GROUP, theIndex.row());
32         if (aFeature)
33           return aFeature->data()->getName().c_str();
34       } 
35     case ConstructFolder:
36         return tr("Constructions") + QString(" (%1)").arg(rowCount(theIndex));
37     case ConstructObject:
38       {
39         boost::shared_ptr<ModelAPI_Feature> aFeature = myDocument->feature(CONSTRUCTIONS_GROUP, theIndex.row());
40         if (aFeature)
41           return aFeature->data()->getName().c_str();
42       }
43     }
44     break;
45
46   case Qt::DecorationRole:
47     // return an Icon
48     switch (theIndex.internalId()) {
49     case ParamsFolder:
50         return QIcon(":pictures/params_folder.png");
51     case ConstructFolder:
52         return QIcon(":pictures/constr_folder.png");
53     case ConstructObject:
54         return QIcon(":pictures/point_ico.png");
55     }
56     break;
57
58   case Qt::ToolTipRole:
59     // return Tooltip
60     break;
61   }
62   return QVariant();
63 }
64
65 QVariant XGUI_TopDataModel::headerData(int section, Qt::Orientation orientation, int role) const
66 {
67   return QVariant();
68 }
69
70 int XGUI_TopDataModel::rowCount(const QModelIndex& theParent) const
71 {
72   if (!theParent.isValid()) 
73     return 2;
74
75   if (theParent.internalId() == ParamsFolder)
76     return myDocument->size(PARAMETERS_GROUP);
77
78   if (theParent.internalId() == ConstructFolder)
79     return myDocument->size(CONSTRUCTIONS_GROUP);
80
81   return 0;
82 }
83
84 int XGUI_TopDataModel::columnCount(const QModelIndex &parent) const
85 {
86   return 1;
87 }
88
89 QModelIndex XGUI_TopDataModel::index(int theRow, int theColumn, const QModelIndex& theParent) const
90 {
91   if (!theParent.isValid()) {
92     switch (theRow) {
93     case 0:
94       return createIndex(theRow, theColumn, (qint32) ParamsFolder);
95     case 1:
96       return createIndex(theRow, theColumn, (qint32) ConstructFolder);
97     }
98   } else {
99     if (theParent.internalId() == ParamsFolder)
100       return createIndex(theRow, theColumn, (qint32) ParamObject);
101
102     if (theParent.internalId() == ConstructFolder)
103       return createIndex(theRow, theColumn, (qint32) ConstructObject);
104   }
105   return QModelIndex();
106 }
107
108 QModelIndex XGUI_TopDataModel::parent(const QModelIndex& theIndex) const
109 {
110   int aId = (int)theIndex.internalId();
111   switch (aId) {
112   case ParamsFolder:
113   case ConstructFolder:
114     return QModelIndex();
115   case ParamObject:
116     return createIndex(0, 0, (qint32) ParamsFolder);
117   case ConstructObject:
118     return createIndex(1, 0, (qint32) ConstructFolder);
119   }
120   return QModelIndex();
121 }
122
123 bool XGUI_TopDataModel::hasChildren(const QModelIndex& theParent) const
124 {
125   return rowCount(theParent) > 0;
126 }
127
128 FeaturePtr XGUI_TopDataModel::feature(const QModelIndex& theIndex) const
129 {
130   switch (theIndex.internalId()) {
131   case ParamsFolder:
132   case ConstructFolder:
133     return FeaturePtr();
134   case ParamObject:
135     return myDocument->feature(PARAMETERS_GROUP, theIndex.row());
136   case ConstructObject:
137     return myDocument->feature(CONSTRUCTIONS_GROUP, theIndex.row());
138   }
139   return FeaturePtr();
140 }
141
142
143 QModelIndex XGUI_TopDataModel::findParent(const boost::shared_ptr<ModelAPI_Feature>& theFeature) const
144 {
145   QString aGroup(theFeature->getGroup().c_str());
146
147   if (theFeature->getGroup().compare(PARAMETERS_GROUP) == 0)
148     return createIndex(0, 0, (qint32) ParamsFolder);
149   if (theFeature->getGroup().compare(CONSTRUCTIONS_GROUP) == 0)
150     return createIndex(1, 0, (qint32) ConstructFolder);
151   return QModelIndex();
152 }
153
154 QModelIndex XGUI_TopDataModel::findGroup(const std::string& theGroup) const
155 {
156   if (theGroup.compare(PARAMETERS_GROUP) == 0)
157     return createIndex(0, 0, (qint32) ParamsFolder);
158   if (theGroup.compare(CONSTRUCTIONS_GROUP) == 0)
159     return createIndex(1, 0, (qint32) ConstructFolder);
160   return QModelIndex();
161 }
162
163
164 //******************************************************************
165 //******************************************************************
166 //******************************************************************
167 XGUI_PartDataModel::XGUI_PartDataModel(const boost::shared_ptr<ModelAPI_Document>& theDocument, QObject* theParent)
168   : XGUI_PartModel(theDocument, theParent)
169 {
170 }
171
172
173 XGUI_PartDataModel::~XGUI_PartDataModel()
174 {
175 }
176
177 QVariant XGUI_PartDataModel::data(const QModelIndex& theIndex, int theRole) const
178 {
179   switch (theRole) {
180   case Qt::DisplayRole:
181     // return a name
182     switch (theIndex.internalId()) {
183     case MyRoot:
184       {
185         boost::shared_ptr<ModelAPI_Feature> aFeature = myDocument->feature(PARTS_GROUP, myId);
186         if (aFeature)
187           return aFeature->data()->getName().c_str();
188       }
189     case ParamsFolder:
190       return tr("Parameters") + QString(" (%1)").arg(rowCount(theIndex));
191     case ConstructFolder:
192       return tr("Constructions") + QString(" (%1)").arg(rowCount(theIndex));
193     case BodiesFolder:
194       return tr("Bodies") + QString(" (%1)").arg(rowCount(theIndex));
195     case ParamObject:
196       {
197         boost::shared_ptr<ModelAPI_Feature> aFeature = 
198           featureDocument()->feature(PARAMETERS_GROUP, theIndex.row());
199         if (aFeature)
200           return aFeature->data()->getName().c_str();
201       }
202     case ConstructObject:
203       {
204         boost::shared_ptr<ModelAPI_Feature> aFeature = 
205           featureDocument()->feature(CONSTRUCTIONS_GROUP, theIndex.row());
206         if (aFeature)
207           return aFeature->data()->getName().c_str();
208       }
209     }
210     break;
211   case Qt::DecorationRole:
212     // return an Icon
213     switch (theIndex.internalId()) {
214     case MyRoot:
215       return QIcon(":pictures/part_ico.png");
216     case ParamsFolder:
217       return QIcon(":pictures/params_folder.png");
218     case ConstructFolder:
219     case BodiesFolder:
220       return QIcon(":pictures/constr_folder.png");
221     case ConstructObject:
222         return QIcon(":pictures/point_ico.png");
223     }
224    break;
225   case Qt::ToolTipRole:
226     // return Tooltip
227     break;
228   }
229   return QVariant();
230 }
231
232 QVariant XGUI_PartDataModel::headerData(int section, Qt::Orientation orientation, int role) const
233 {
234   return QVariant();
235 }
236
237 int XGUI_PartDataModel::rowCount(const QModelIndex& parent) const
238 {
239   if (!parent.isValid()) 
240     if (myDocument->feature(PARTS_GROUP, myId))
241       return 1;
242     else 
243       return 0;
244   switch (parent.internalId()) {
245   case MyRoot:
246     return 3;
247   case ParamsFolder:
248     return featureDocument()->size(PARAMETERS_GROUP);
249   case ConstructFolder:
250     return featureDocument()->size(CONSTRUCTIONS_GROUP);
251   case BodiesFolder:
252     return 0;
253   }
254   return 0;
255 }
256
257 int XGUI_PartDataModel::columnCount(const QModelIndex &parent) const
258 {
259   return 1;
260 }
261
262 QModelIndex XGUI_PartDataModel::index(int theRow, int theColumn, const QModelIndex &theParent) const
263 {
264   if (!theParent.isValid())
265     return createIndex(theRow, 0, (qint32) MyRoot);
266
267   int aId = (int)theParent.internalId();
268   switch (aId) {
269   case MyRoot:
270     switch (theRow) {
271     case 0:
272       return createIndex(0, 0, (qint32) ParamsFolder);
273     case 1:
274       return createIndex(1, 0, (qint32) ConstructFolder);
275     case 2:
276       return createIndex(1, 0, (qint32) BodiesFolder);
277     }
278   case ParamsFolder:
279     return createIndex(theRow, 0, (qint32) ParamObject);
280   case ConstructFolder:
281     return createIndex(theRow, 0, (qint32) ConstructObject);
282   case BodiesFolder:
283     return createIndex(theRow, 0, (qint32) BodieswObject);
284   }
285   return QModelIndex();
286 }
287
288 QModelIndex XGUI_PartDataModel::parent(const QModelIndex& theIndex) const
289 {
290   switch (theIndex.internalId()) {
291   case MyRoot:
292     return QModelIndex();
293   case ParamsFolder:
294   case ConstructFolder:
295   case BodiesFolder:
296     return createIndex(0, 0, (qint32) MyRoot);
297   case ParamObject:
298     return createIndex(0, 0, (qint32) ParamsFolder);
299   case ConstructObject:
300     return createIndex(1, 0, (qint32) ConstructFolder);
301   }
302   return QModelIndex();
303 }
304
305 bool XGUI_PartDataModel::hasChildren(const QModelIndex& theParent) const
306 {
307   return rowCount(theParent) > 0;
308 }
309
310
311 boost::shared_ptr<ModelAPI_Document> XGUI_PartDataModel::featureDocument() const
312 {
313   boost::shared_ptr<ModelAPI_Feature> aFeature = myDocument->feature(PARTS_GROUP, myId);
314   return aFeature->data()->docRef("PartDocument")->value();
315 }
316
317 FeaturePtr XGUI_PartDataModel::feature(const QModelIndex& theIndex) const
318 {
319   switch (theIndex.internalId()) {
320   case MyRoot:
321     return myDocument->feature(PARTS_GROUP, myId);
322   case ParamsFolder:
323   case ConstructFolder:
324     return FeaturePtr();
325   case ParamObject:
326     return featureDocument()->feature(PARAMETERS_GROUP, theIndex.row());
327   case ConstructObject:
328     return featureDocument()->feature(CONSTRUCTIONS_GROUP, theIndex.row());
329   }
330   return FeaturePtr();
331 }
332
333 bool XGUI_PartDataModel::hasDocument(const boost::shared_ptr<ModelAPI_Document>& theDoc) const
334 {
335   return (featureDocument() == theDoc);
336 }
337
338
339 QModelIndex XGUI_PartDataModel::findParent(const boost::shared_ptr<ModelAPI_Feature>& theFeature) const
340 {
341   QString aGroup(theFeature->getGroup().c_str());
342
343   if (theFeature->getGroup().compare(PARAMETERS_GROUP) == 0)
344     return createIndex(0, 0, (qint32) ParamsFolder);
345   if (theFeature->getGroup().compare(CONSTRUCTIONS_GROUP) == 0)
346     return createIndex(1, 0, (qint32) ConstructFolder);
347   return QModelIndex();
348 }
349
350 QModelIndex XGUI_PartDataModel::findGroup(const std::string& theGroup) const
351 {
352   if (theGroup.compare(PARAMETERS_GROUP) == 0)
353     return createIndex(0, 0, (qint32) ParamsFolder);
354   if (theGroup.compare(CONSTRUCTIONS_GROUP) == 0)
355     return createIndex(1, 0, (qint32) ConstructFolder);
356   return QModelIndex();
357 }