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