1 #include "XGUI_PartDataModel.h"
2 #include "XGUI_Workshop.h"
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>
14 XGUI_TopDataModel::XGUI_TopDataModel(const DocumentPtr& theDocument, QObject* theParent)
15 : XGUI_FeaturesModel(theDocument, theParent)
19 XGUI_TopDataModel::~XGUI_TopDataModel()
24 QVariant XGUI_TopDataModel::data(const QModelIndex& theIndex, int theRole) const
29 switch (theIndex.internalId()) {
31 return tr("Parameters") + QString(" (%1)").arg(rowCount(theIndex));
34 FeaturePtr aFeature = myDocument->feature(PARAMETERS_GROUP, theIndex.row());
36 return aFeature->data()->getName().c_str();
39 return tr("Constructions") + QString(" (%1)").arg(rowCount(theIndex));
42 FeaturePtr aFeature = myDocument->feature(CONSTRUCTIONS_GROUP, theIndex.row());
44 return aFeature->data()->getName().c_str();
49 case Qt::DecorationRole:
51 switch (theIndex.internalId()) {
53 return QIcon(":pictures/params_folder.png");
55 return QIcon(":pictures/constr_folder.png");
58 FeaturePtr aFeature = myDocument->feature(CONSTRUCTIONS_GROUP, theIndex.row());
60 return QIcon(XGUI_Workshop::featureIcon(aFeature->getKind()));
68 case Qt::ForegroundRole:
69 return QBrush(myItemsColor);
75 QVariant XGUI_TopDataModel::headerData(int section, Qt::Orientation orientation, int role) const
80 int XGUI_TopDataModel::rowCount(const QModelIndex& theParent) const
82 if (!theParent.isValid())
85 if (theParent.internalId() == ParamsFolder)
86 return myDocument->size(PARAMETERS_GROUP);
88 if (theParent.internalId() == ConstructFolder)
89 return myDocument->size(CONSTRUCTIONS_GROUP);
94 int XGUI_TopDataModel::columnCount(const QModelIndex &parent) const
99 QModelIndex XGUI_TopDataModel::index(int theRow, int theColumn, const QModelIndex& theParent) const
101 if (!theParent.isValid()) {
104 return createIndex(theRow, theColumn, (qint32) ParamsFolder);
106 return createIndex(theRow, theColumn, (qint32) ConstructFolder);
109 if (theParent.internalId() == ParamsFolder)
110 return createIndex(theRow, theColumn, (qint32) ParamObject);
112 if (theParent.internalId() == ConstructFolder)
113 return createIndex(theRow, theColumn, (qint32) ConstructObject);
115 return QModelIndex();
118 QModelIndex XGUI_TopDataModel::parent(const QModelIndex& theIndex) const
120 int aId = (int)theIndex.internalId();
123 case ConstructFolder:
124 return QModelIndex();
126 return createIndex(0, 0, (qint32) ParamsFolder);
127 case ConstructObject:
128 return createIndex(1, 0, (qint32) ConstructFolder);
130 return QModelIndex();
133 bool XGUI_TopDataModel::hasChildren(const QModelIndex& theParent) const
135 return rowCount(theParent) > 0;
138 FeaturePtr XGUI_TopDataModel::feature(const QModelIndex& theIndex) const
140 switch (theIndex.internalId()) {
142 case ConstructFolder:
145 return myDocument->feature(PARAMETERS_GROUP, theIndex.row());
146 case ConstructObject:
147 return myDocument->feature(CONSTRUCTIONS_GROUP, theIndex.row());
153 QModelIndex XGUI_TopDataModel::findParent(const FeaturePtr& theFeature) const
155 QString aGroup(theFeature->getGroup().c_str());
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();
164 QModelIndex XGUI_TopDataModel::findGroup(const std::string& theGroup) const
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();
174 //******************************************************************
175 //******************************************************************
176 //******************************************************************
177 XGUI_PartDataModel::XGUI_PartDataModel(const DocumentPtr& theDocument, QObject* theParent)
178 : XGUI_PartModel(theDocument, theParent)
183 XGUI_PartDataModel::~XGUI_PartDataModel()
187 QVariant XGUI_PartDataModel::data(const QModelIndex& theIndex, int theRole) const
190 case Qt::DisplayRole:
192 switch (theIndex.internalId()) {
195 FeaturePtr aFeature = myDocument->feature(PARTS_GROUP, myId);
197 return aFeature->data()->getName().c_str();
200 return tr("Parameters") + QString(" (%1)").arg(rowCount(theIndex));
201 case ConstructFolder:
202 return tr("Constructions") + QString(" (%1)").arg(rowCount(theIndex));
204 return tr("Bodies") + QString(" (%1)").arg(rowCount(theIndex));
207 FeaturePtr aFeature = featureDocument()->feature(PARAMETERS_GROUP, theIndex.row());
209 return aFeature->data()->getName().c_str();
211 case ConstructObject:
213 FeaturePtr aFeature = featureDocument()->feature(CONSTRUCTIONS_GROUP, theIndex.row());
215 return aFeature->data()->getName().c_str();
219 FeaturePtr aFeature = featureDocument()->feature(FEATURES_GROUP, theIndex.row() - 3);
221 return aFeature->data()->getName().c_str();
225 case Qt::DecorationRole:
227 switch (theIndex.internalId()) {
229 return QIcon(":pictures/part_ico.png");
231 return QIcon(":pictures/params_folder.png");
232 case ConstructFolder:
234 return QIcon(":pictures/constr_folder.png");
235 case ConstructObject:
237 FeaturePtr aFeature = featureDocument()->feature(CONSTRUCTIONS_GROUP, theIndex.row());
239 return QIcon(XGUI_Workshop::featureIcon(aFeature->getKind()));
243 FeaturePtr aFeature = featureDocument()->feature(FEATURES_GROUP, theIndex.row() - 3);
245 return QIcon(XGUI_Workshop::featureIcon(aFeature->getKind()));
249 case Qt::ToolTipRole:
252 case Qt::ForegroundRole:
253 return QBrush(myItemsColor);
259 QVariant XGUI_PartDataModel::headerData(int section, Qt::Orientation orientation, int role) const
264 int XGUI_PartDataModel::rowCount(const QModelIndex& parent) const
266 if (!parent.isValid())
267 if (myDocument->feature(PARTS_GROUP, myId))
271 switch (parent.internalId()) {
273 return 3 + featureDocument()->size(FEATURES_GROUP);
275 return featureDocument()->size(PARAMETERS_GROUP);
276 case ConstructFolder:
277 return featureDocument()->size(CONSTRUCTIONS_GROUP);
284 int XGUI_PartDataModel::columnCount(const QModelIndex &parent) const
289 QModelIndex XGUI_PartDataModel::index(int theRow, int theColumn, const QModelIndex &theParent) const
291 if (!theParent.isValid())
292 return createIndex(theRow, 0, (qint32) MyRoot);
294 int aId = (int)theParent.internalId();
299 return createIndex(0, 0, (qint32) ParamsFolder);
301 return createIndex(1, 0, (qint32) ConstructFolder);
303 return createIndex(2, 0, (qint32) BodiesFolder);
305 return createIndex(theRow, theColumn, (qint32) HistoryObject);
308 return createIndex(theRow, 0, (qint32) ParamObject);
309 case ConstructFolder:
310 return createIndex(theRow, 0, (qint32) ConstructObject);
312 return createIndex(theRow, 0, (qint32) BodieswObject);
314 return QModelIndex();
317 QModelIndex XGUI_PartDataModel::parent(const QModelIndex& theIndex) const
319 switch (theIndex.internalId()) {
321 return QModelIndex();
323 case ConstructFolder:
326 return createIndex(0, 0, (qint32) MyRoot);
328 return createIndex(0, 0, (qint32) ParamsFolder);
329 case ConstructObject:
330 return createIndex(1, 0, (qint32) ConstructFolder);
332 return QModelIndex();
335 bool XGUI_PartDataModel::hasChildren(const QModelIndex& theParent) const
337 return rowCount(theParent) > 0;
341 DocumentPtr XGUI_PartDataModel::featureDocument() const
343 FeaturePtr aFeature = myDocument->feature(PARTS_GROUP, myId);
344 ObjectPtr aObject = boost::dynamic_pointer_cast<ModelAPI_Object>(aFeature);
346 return aObject->featureRef()->data()->docRef("PartDocument")->value();
347 return aFeature->data()->docRef("PartDocument")->value();
350 FeaturePtr XGUI_PartDataModel::feature(const QModelIndex& theIndex) const
352 switch (theIndex.internalId()) {
354 if (theIndex.row() < 3)
355 return myDocument->feature(PARTS_GROUP, myId);
357 return featureDocument()->feature(FEATURES_GROUP, theIndex.row() - 3);
359 case ConstructFolder:
362 return featureDocument()->feature(PARAMETERS_GROUP, theIndex.row());
363 case ConstructObject:
364 return featureDocument()->feature(CONSTRUCTIONS_GROUP, theIndex.row());
369 bool XGUI_PartDataModel::hasDocument(const DocumentPtr& theDoc) const
371 return (featureDocument() == theDoc);
375 QModelIndex XGUI_PartDataModel::findParent(const FeaturePtr& theFeature) const
377 QString aGroup(theFeature->getGroup().c_str());
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();
386 QModelIndex XGUI_PartDataModel::findGroup(const std::string& theGroup) const
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();
395 FeaturePtr XGUI_PartDataModel::part() const
397 return myDocument->feature(PARTS_GROUP, myId);