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