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_Result.h>
8 #include <ModelAPI_Data.h>
9 #include <ModelAPI_AttributeDocRef.h>
10 #include <ModelAPI_Object.h>
11 #include <ModelAPI_ResultPart.h>
12 #include <ModelAPI_ResultConstruction.h>
13 #include <ModelAPI_ResultParameters.h>
14 #include <ModelAPI_ResultBody.h>
20 //ObjectPtr featureObj(const ObjectPtr& theFeature)
22 // ObjectPtr aObject = boost::dynamic_pointer_cast<ModelAPI_Object>(theFeature);
24 // return aObject->featureRef();
29 XGUI_TopDataModel::XGUI_TopDataModel(QObject* theParent)
30 : XGUI_FeaturesModel(theParent)
34 XGUI_TopDataModel::~XGUI_TopDataModel()
39 QVariant XGUI_TopDataModel::data(const QModelIndex& theIndex, int theRole) const
44 switch (theIndex.internalId()) {
46 return tr("Parameters") + QString(" (%1)").arg(rowCount(theIndex));
49 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
50 ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultParameters::group(), theIndex.row());
52 return aObject->data()->name().c_str();
56 return tr("Constructions") + QString(" (%1)").arg(rowCount(theIndex));
59 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
60 ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultConstruction::group(), theIndex.row());
62 return aObject->data()->name().c_str();
66 return tr("Bodies") + QString(" (%1)").arg(rowCount(theIndex));
69 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
70 ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultBody::group(), theIndex.row());
72 return aObject->data()->name().c_str();
77 case Qt::DecorationRole:
79 switch (theIndex.internalId()) {
81 return QIcon(":pictures/params_folder.png");
84 return QIcon(":pictures/constr_folder.png");
87 return QIcon(":pictures/constr_object.png");
94 case Qt::ForegroundRole:
95 return QBrush(myItemsColor);
101 QVariant XGUI_TopDataModel::headerData(int section, Qt::Orientation orientation, int role) const
106 int XGUI_TopDataModel::rowCount(const QModelIndex& theParent) const
108 if (!theParent.isValid())
111 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
112 if (theParent.internalId() == ParamsFolder)
113 return aRootDoc->size(ModelAPI_ResultParameters::group());
115 if (theParent.internalId() == ConstructFolder)
116 return aRootDoc->size(ModelAPI_ResultConstruction::group());
118 if (theParent.internalId() == BodiesFolder)
119 return aRootDoc->size(ModelAPI_ResultBody::group());
123 int XGUI_TopDataModel::columnCount(const QModelIndex &parent) const
128 QModelIndex XGUI_TopDataModel::index(int theRow, int theColumn, const QModelIndex& theParent) const
130 if (!theParent.isValid()) {
133 return createIndex(theRow, theColumn, (qint32) ParamsFolder);
135 return createIndex(theRow, theColumn, (qint32) ConstructFolder);
137 return createIndex(theRow, theColumn, (qint32) BodiesFolder);
140 if (theParent.internalId() == ParamsFolder)
141 return createIndex(theRow, theColumn, (qint32) ParamObject);
143 if (theParent.internalId() == ConstructFolder)
144 return createIndex(theRow, theColumn, (qint32) ConstructObject);
146 if (theParent.internalId() == BodiesFolder)
147 return createIndex(theRow, theColumn, (qint32) BodiesObject);
149 return QModelIndex();
152 QModelIndex XGUI_TopDataModel::parent(const QModelIndex& theIndex) const
154 int aId = (int)theIndex.internalId();
157 case ConstructFolder:
159 return QModelIndex();
161 return createIndex(0, 0, (qint32) ParamsFolder);
162 case ConstructObject:
163 return createIndex(1, 0, (qint32) ConstructFolder);
165 return createIndex(2, 0, (qint32) BodiesFolder);
167 return QModelIndex();
170 bool XGUI_TopDataModel::hasChildren(const QModelIndex& theParent) const
172 return rowCount(theParent) > 0;
175 ObjectPtr XGUI_TopDataModel::object(const QModelIndex& theIndex) const
177 switch (theIndex.internalId()) {
179 case ConstructFolder:
184 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
185 return aRootDoc->object(ModelAPI_ResultParameters::group(), theIndex.row());
187 case ConstructObject:
189 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
190 return aRootDoc->object(ModelAPI_ResultConstruction::group(), theIndex.row());
194 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
195 return aRootDoc->object(ModelAPI_ResultBody::group(), theIndex.row());
202 QModelIndex XGUI_TopDataModel::findParent(const ObjectPtr& theObject) const
204 return findGroup(theObject->groupName().c_str());
207 QModelIndex XGUI_TopDataModel::findGroup(const std::string& theGroup) const
209 if (theGroup == ModelAPI_ResultParameters::group())
210 return createIndex(0, 0, (qint32) ParamsFolder);
211 if (theGroup == ModelAPI_ResultConstruction::group())
212 return createIndex(1, 0, (qint32) ConstructFolder);
213 if (theGroup == ModelAPI_ResultBody::group())
214 return createIndex(2, 0, (qint32) BodiesFolder);
215 return QModelIndex();
218 QModelIndex XGUI_TopDataModel::objectIndex(const ObjectPtr& theObject) const
222 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
223 std::string aGroup = theObject->groupName();
224 int aNb = aRootDoc->size(aGroup);
226 for (int i = 0; i < aNb; i++) {
227 if (aRootDoc->object(aGroup, i) == theObject) {
233 if (aGroup == ModelAPI_ResultParameters::group())
234 return createIndex(aRow, 0, (qint32) ParamObject);
235 if (aGroup == ModelAPI_ResultConstruction::group())
236 return createIndex(aRow, 0, (qint32) ConstructObject);
237 if (aGroup == ModelAPI_ResultBody::group())
238 return createIndex(aRow, 0, (qint32) BodiesObject);
246 //******************************************************************
247 //******************************************************************
248 //******************************************************************
249 XGUI_PartDataModel::XGUI_PartDataModel(QObject* theParent)
250 : XGUI_PartModel(theParent)
255 XGUI_PartDataModel::~XGUI_PartDataModel()
259 QVariant XGUI_PartDataModel::data(const QModelIndex& theIndex, int theRole) const
262 case Qt::DisplayRole:
264 switch (theIndex.internalId()) {
267 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
268 ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
270 return boost::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
273 return tr("Parameters") + QString(" (%1)").arg(rowCount(theIndex));
274 case ConstructFolder:
275 return tr("Constructions") + QString(" (%1)").arg(rowCount(theIndex));
277 return tr("Bodies") + QString(" (%1)").arg(rowCount(theIndex));
280 ObjectPtr aObject = partDocument()->object(ModelAPI_ResultParameters::group(), theIndex.row());
282 return boost::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
284 case ConstructObject:
286 ObjectPtr aObject = partDocument()->object(ModelAPI_ResultConstruction::group(), theIndex.row());
288 return boost::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
292 ObjectPtr aObject = partDocument()->object(ModelAPI_ResultBody::group(), theIndex.row());
294 return aObject->data()->name().c_str();
298 ObjectPtr aObject = partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - 3);
300 return aObject->data()->name().c_str();
304 case Qt::DecorationRole:
306 switch (theIndex.internalId()) {
308 return QIcon(":pictures/part_ico.png");
310 return QIcon(":pictures/params_folder.png");
311 case ConstructFolder:
313 return QIcon(":pictures/constr_folder.png");
314 case ConstructObject:
316 return QIcon(":pictures/constr_object.png");
319 ObjectPtr aObject = partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - 3);
320 FeaturePtr aFeature = boost::dynamic_pointer_cast<ModelAPI_Feature>(aObject);
322 return QIcon(XGUI_Workshop::featureIcon(aFeature->getKind()));
326 case Qt::ToolTipRole:
329 case Qt::ForegroundRole:
330 return QBrush(myItemsColor);
336 QVariant XGUI_PartDataModel::headerData(int section, Qt::Orientation orientation, int role) const
341 int XGUI_PartDataModel::rowCount(const QModelIndex& parent) const
343 if (!parent.isValid()) {
344 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
345 if (aRootDoc->object(ModelAPI_ResultPart::group(), myId))
350 switch (parent.internalId()) {
352 return 3 + partDocument()->size(ModelAPI_Feature::group());
354 return partDocument()->size(ModelAPI_ResultParameters::group());
355 case ConstructFolder:
356 return partDocument()->size(ModelAPI_ResultConstruction::group());
358 return partDocument()->size(ModelAPI_ResultBody::group());
363 int XGUI_PartDataModel::columnCount(const QModelIndex &parent) const
368 QModelIndex XGUI_PartDataModel::index(int theRow, int theColumn, const QModelIndex &theParent) const
370 if (!theParent.isValid())
371 return createIndex(theRow, 0, (qint32) MyRoot);
373 int aId = (int)theParent.internalId();
378 return createIndex(0, 0, (qint32) ParamsFolder);
380 return createIndex(1, 0, (qint32) ConstructFolder);
382 return createIndex(2, 0, (qint32) BodiesFolder);
384 return createIndex(theRow, theColumn, (qint32) HistoryObject);
387 return createIndex(theRow, 0, (qint32) ParamObject);
388 case ConstructFolder:
389 return createIndex(theRow, 0, (qint32) ConstructObject);
391 return createIndex(theRow, 0, (qint32) BodiesObject);
393 return QModelIndex();
396 QModelIndex XGUI_PartDataModel::parent(const QModelIndex& theIndex) const
398 switch (theIndex.internalId()) {
400 return QModelIndex();
402 case ConstructFolder:
405 return createIndex(0, 0, (qint32) MyRoot);
407 return createIndex(0, 0, (qint32) ParamsFolder);
408 case ConstructObject:
409 return createIndex(1, 0, (qint32) ConstructFolder);
411 return createIndex(2, 0, (qint32) BodiesFolder);
413 return QModelIndex();
416 bool XGUI_PartDataModel::hasChildren(const QModelIndex& theParent) const
418 return rowCount(theParent) > 0;
422 DocumentPtr XGUI_PartDataModel::partDocument() const
424 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
425 ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
426 ResultPartPtr aPart = boost::dynamic_pointer_cast<ModelAPI_ResultPart>(aObject);
427 return aPart->partDoc();
430 ObjectPtr XGUI_PartDataModel::object(const QModelIndex& theIndex) const
432 switch (theIndex.internalId()) {
435 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
436 return aRootDoc->object(ModelAPI_ResultPart::group(), myId);
439 case ConstructFolder:
443 return partDocument()->object(ModelAPI_ResultParameters::group(), theIndex.row());
444 case ConstructObject:
445 return partDocument()->object(ModelAPI_ResultConstruction::group(), theIndex.row());
447 return partDocument()->object(ModelAPI_ResultBody::group(), theIndex.row());
449 return partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - 3);
454 bool XGUI_PartDataModel::hasDocument(const DocumentPtr& theDoc) const
456 return (partDocument() == theDoc);
460 QModelIndex XGUI_PartDataModel::findParent(const ObjectPtr& theObject) const
462 return findGroup(theObject->groupName().c_str());
465 QModelIndex XGUI_PartDataModel::findGroup(const std::string& theGroup) const
467 if (theGroup.compare(ModelAPI_ResultParameters::group()) == 0)
468 return createIndex(0, 0, (qint32) ParamsFolder);
469 if (theGroup.compare(ModelAPI_ResultConstruction::group()) == 0)
470 return createIndex(1, 0, (qint32) ConstructFolder);
471 if (theGroup.compare(ModelAPI_ResultBody::group()) == 0)
472 return createIndex(2, 0, (qint32) BodiesFolder);
473 return QModelIndex();
476 ResultPartPtr XGUI_PartDataModel::part() const
478 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
479 ObjectPtr aObj = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
480 return boost::dynamic_pointer_cast<ModelAPI_ResultPart>(aObj);
483 QModelIndex XGUI_PartDataModel::objectIndex(const ObjectPtr& theObject) const
487 if (part() == theObject)
490 std::string aGroup = theObject->groupName();
491 DocumentPtr aDoc = theObject->document();
492 int aNb = aDoc->size(aGroup);
494 for (int i = 0; i < aNb; i++) {
495 if (aDoc->object(aGroup, i) == theObject) {
502 if (aGroup == ModelAPI_ResultParameters::group())
503 return createIndex(aRow, 0, (qint32) ParamObject);
504 else if (aGroup == ModelAPI_ResultConstruction::group())
505 return createIndex(aRow, 0, (qint32) ConstructObject);
506 else if (aGroup == ModelAPI_ResultBody::group())
507 return createIndex(aRow, 0, (qint32) BodiesObject);
509 return createIndex(aRow + 3, 0, (qint32) HistoryObject);