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