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