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