1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D -->
3 #include "PartSet_PartDataModel.h"
4 #include "PartSet_Module.h"
5 #include "PartSet_DocumentDataModel.h"
7 #include <ModelAPI_Session.h>
8 #include <ModelAPI_Document.h>
9 #include <ModelAPI_Feature.h>
10 #include <ModelAPI_Result.h>
11 #include <ModelAPI_Data.h>
12 #include <ModelAPI_AttributeDocRef.h>
13 #include <ModelAPI_Object.h>
14 #include <ModelAPI_ResultPart.h>
15 #include <ModelAPI_ResultConstruction.h>
16 #include <ModelAPI_ResultParameter.h>
17 #include <ModelAPI_ResultBody.h>
18 #include <ModelAPI_ResultGroup.h>
19 #include <ModelAPI_AttributeDouble.h>
25 PartSet_TopDataModel::PartSet_TopDataModel(QObject* theParent)
26 : PartSet_FeaturesModel(theParent)
30 PartSet_TopDataModel::~PartSet_TopDataModel()
34 QVariant PartSet_TopDataModel::data(const QModelIndex& theIndex, int theRole) const
39 switch (theIndex.internalId()) {
41 return tr("Parameters") + QString(" (%1)").arg(rowCount(theIndex));
43 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
44 ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultParameter::group(), theIndex.row());
46 ResultParameterPtr aParam = std::dynamic_pointer_cast<ModelAPI_ResultParameter>(aObject);
47 AttributeDoublePtr aValueAttribute = aParam->data()->real(ModelAPI_ResultParameter::VALUE());
48 QString aVal = QString::number(aValueAttribute->value());
49 QString aTitle = QString(aObject->data()->name().c_str());
50 return aTitle + " = " + aVal;
55 return tr("Constructions") + QString(" (%1)").arg(rowCount(theIndex));
56 case ConstructObject: {
57 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
58 ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultConstruction::group(),
61 return aObject->data()->name().c_str();
65 // return tr("Groups") + QString(" (%1)").arg(rowCount(theIndex));
67 // DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
68 // ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultGroup::group(),
71 // return aObject->data()->name().c_str();
77 case Qt::DecorationRole:
80 switch (theIndex.internalId()) {
82 return QIcon(":pictures/params_folder.png");
84 return QIcon(":pictures/constr_folder.png");
86 return QIcon(":pictures/constr_object.png");
88 // return QIcon(":pictures/constr_folder.png");
96 case Qt::ForegroundRole:
97 return QBrush(myItemsColor);
103 QVariant PartSet_TopDataModel::headerData(int section, Qt::Orientation orientation, int role) const
108 int PartSet_TopDataModel::rowCount(const QModelIndex& theParent) const
110 if (!theParent.isValid())
111 return 2; // In case of groups using it has to be +1
113 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
114 if (theParent.internalId() == ParamsFolder)
115 return aRootDoc->size(ModelAPI_ResultParameter::group());
117 if (theParent.internalId() == ConstructFolder)
118 return aRootDoc->size(ModelAPI_ResultConstruction::group());
120 //if (theParent.internalId() == GroupsFolder)
121 // return aRootDoc->size(ModelAPI_ResultGroup::group());
126 int PartSet_TopDataModel::columnCount(const QModelIndex &parent) const
131 QModelIndex PartSet_TopDataModel::index(int theRow, int theColumn, const QModelIndex& theParent) const
133 if (!theParent.isValid()) {
136 return createIndex(theRow, theColumn, (qint32) ParamsFolder);
138 return createIndex(theRow, theColumn, (qint32) ConstructFolder);
140 // return createIndex(theRow, theColumn, (qint32) GroupsFolder);
143 if (theParent.internalId() == ParamsFolder)
144 return createIndex(theRow, theColumn, (qint32) ParamObject);
146 if (theParent.internalId() == ConstructFolder)
147 return createIndex(theRow, theColumn, (qint32) ConstructObject);
149 //if (theParent.internalId() == GroupsFolder)
150 // return createIndex(theRow, theColumn, (qint32) GroupObject);
152 return QModelIndex();
155 QModelIndex PartSet_TopDataModel::parent(const QModelIndex& theIndex) const
157 int aId = (int) theIndex.internalId();
160 case ConstructFolder:
162 return QModelIndex();
164 return createIndex(0, 0, (qint32) ParamsFolder);
165 case ConstructObject:
166 return createIndex(1, 0, (qint32) ConstructFolder);
168 // return createIndex(2, 0, (qint32) GroupsFolder);
170 return QModelIndex();
173 bool PartSet_TopDataModel::hasChildren(const QModelIndex& theParent) const
175 return rowCount(theParent) > 0;
178 ObjectPtr PartSet_TopDataModel::object(const QModelIndex& theIndex) const
180 switch (theIndex.internalId()) {
182 case ConstructFolder:
185 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
186 return aRootDoc->object(ModelAPI_ResultParameter::group(), theIndex.row());
188 case ConstructObject: {
189 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
190 return aRootDoc->object(ModelAPI_ResultConstruction::group(), theIndex.row());
192 //case GroupObject: {
193 // DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
194 // return aRootDoc->object(ModelAPI_ResultGroup::group(), theIndex.row());
200 QModelIndex PartSet_TopDataModel::findParent(const ObjectPtr& theObject) const
202 return findGroup(theObject->groupName().c_str());
205 QModelIndex PartSet_TopDataModel::findGroup(const std::string& theGroup) const
207 if (theGroup == ModelAPI_ResultParameter::group())
208 return createIndex(0, 0, (qint32) ParamsFolder);
209 if (theGroup == ModelAPI_ResultConstruction::group())
210 return createIndex(1, 0, (qint32) ConstructFolder);
211 //if (theGroup == ModelAPI_ResultGroup::group())
212 // return createIndex(2, 0, (qint32) ConstructFolder);
213 return QModelIndex();
216 QModelIndex PartSet_TopDataModel::objectIndex(const ObjectPtr& theObject) const
220 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
221 std::string aGroup = theObject->groupName();
222 int aNb = aRootDoc->size(aGroup);
224 for (int i = 0; i < aNb; i++) {
225 if (aRootDoc->object(aGroup, i) == theObject) {
231 if (aGroup == ModelAPI_ResultParameter::group())
232 return createIndex(aRow, 0, (qint32) ParamObject);
233 if (aGroup == ModelAPI_ResultConstruction::group())
234 return createIndex(aRow, 0, (qint32) ConstructObject);
235 //if (aGroup == ModelAPI_ResultGroup::group())
236 // return createIndex(aRow, 0, (qint32) GroupObject);
242 //******************************************************************
243 //******************************************************************
244 //******************************************************************
245 PartSet_PartDataModel::PartSet_PartDataModel(QObject* theParent)
246 : PartSet_PartModel(theParent)
250 PartSet_PartDataModel::~PartSet_PartDataModel()
254 QVariant PartSet_PartDataModel::data(const QModelIndex& theIndex, int theRole) const
257 case Qt::DisplayRole:
259 switch (theIndex.internalId()) {
261 // DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
262 // ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
264 // return std::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
267 return tr("Parameters") + QString(" (%1)").arg(rowCount(theIndex));
268 case ConstructFolder:
269 return tr("Constructions") + QString(" (%1)").arg(rowCount(theIndex));
271 return tr("Bodies") + QString(" (%1)").arg(rowCount(theIndex));
273 return tr("Groups") + QString(" (%1)").arg(rowCount(theIndex));
275 ObjectPtr aObject = partDocument()->object(ModelAPI_ResultParameter::group(),
278 ResultParameterPtr aParam = std::dynamic_pointer_cast<ModelAPI_ResultParameter>(aObject);
279 AttributeDoublePtr aValueAttribute = aParam->data()->real(ModelAPI_ResultParameter::VALUE());
280 QString aVal = QString::number(aValueAttribute->value());
281 QString aTitle = QString(aObject->data()->name().c_str());
282 return aTitle + " = " + aVal;
286 case ConstructObject: {
287 ObjectPtr aObject = partDocument()->object(ModelAPI_ResultConstruction::group(),
290 return std::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
294 ObjectPtr aObject = partDocument()->object(ModelAPI_ResultBody::group(), theIndex.row());
296 return aObject->data()->name().c_str();
300 ObjectPtr aObject = partDocument()->object(ModelAPI_ResultGroup::group(), theIndex.row());
302 return aObject->data()->name().c_str();
304 case HistoryObject: {
305 ObjectPtr aObject = partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - getRowsNumber());
307 return aObject->data()->name().c_str();
311 case Qt::DecorationRole:
313 switch (theIndex.internalId()) {
315 // return QIcon(":pictures/part_ico.png");
317 return QIcon(":pictures/params_folder.png");
318 case ConstructFolder:
320 return QIcon(":pictures/constr_folder.png");
322 return QIcon(":pictures/constr_folder.png");
323 case ConstructObject:
326 std::string aGroup = theIndex.internalId() == ConstructObject ?
327 ModelAPI_ResultConstruction::group() : ModelAPI_ResultBody::group();
328 ObjectPtr anObject = partDocument()->object(aGroup, theIndex.row());
329 if (anObject && anObject->data() &&
330 anObject->data()->execState() == ModelAPI_StateMustBeUpdated) {
331 return QIcon(":pictures/constr_object_modified.png");
333 return QIcon(":pictures/constr_object.png");
335 case HistoryObject: {
336 ObjectPtr aObject = partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - getRowsNumber());
337 FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(aObject);
339 return PartSet_DocumentDataModel::featureIcon(aFeature);
343 case Qt::ToolTipRole:
346 case Qt::ForegroundRole:
347 return QBrush(myItemsColor);
353 QVariant PartSet_PartDataModel::headerData(int section, Qt::Orientation orientation, int role) const
358 int PartSet_PartDataModel::rowCount(const QModelIndex& parent) const
360 if (!parent.isValid()) {
361 //DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
362 //if (aRootDoc->object(ModelAPI_ResultPart::group(), myId))
366 DocumentPtr aDoc = partDocument();
368 return getRowsNumber() + aDoc->size(ModelAPI_Feature::group());
372 switch (parent.internalId()) {
375 // DocumentPtr aDoc = partDocument();
377 // return getRowsNumber() + aDoc->size(ModelAPI_Feature::group());
382 return partDocument()->size(ModelAPI_ResultParameter::group());
383 case ConstructFolder:
384 return partDocument()->size(ModelAPI_ResultConstruction::group());
386 return partDocument()->size(ModelAPI_ResultBody::group());
388 return partDocument()->size(ModelAPI_ResultGroup::group());
393 int PartSet_PartDataModel::columnCount(const QModelIndex &parent) const
398 QModelIndex PartSet_PartDataModel::index(int theRow, int theColumn, const QModelIndex &theParent) const
400 if (!theParent.isValid()) {
401 // return createIndex(theRow, 0, (qint32) MyRoot);
404 return createIndex(theRow, theColumn, (qint32) ParamsFolder);
406 return createIndex(theRow, theColumn, (qint32) ConstructFolder);
408 return createIndex(theRow, theColumn, (qint32) BodiesFolder);
411 int aSize = partDocument()->size(ModelAPI_ResultGroup::group());
413 return createIndex(theRow, theColumn, (qint32) GroupsFolder);
415 return createIndex(theRow, theColumn, (qint32) HistoryObject);
418 return createIndex(theRow, theColumn, (qint32) HistoryObject);
421 int aId = (int) theParent.internalId();
426 // return createIndex(theRow, 0, (qint32) ParamsFolder);
428 // return createIndex(theRow, 0, (qint32) ConstructFolder);
430 // return createIndex(theRow, 0, (qint32) BodiesFolder);
433 // int aSize = partDocument()->size(ModelAPI_ResultGroup::group());
435 // return createIndex(theRow, 0, (qint32) GroupsFolder);
437 // return createIndex(theRow, theColumn, (qint32) HistoryObject);
440 // return createIndex(theRow, theColumn, (qint32) HistoryObject);
443 return createIndex(theRow, theColumn, (qint32) ParamObject);
444 case ConstructFolder:
445 return createIndex(theRow, theColumn, (qint32) ConstructObject);
447 return createIndex(theRow, theColumn, (qint32) BodiesObject);
449 return createIndex(theRow, theColumn, (qint32) GroupObject);
452 return QModelIndex();
455 QModelIndex PartSet_PartDataModel::parent(const QModelIndex& theIndex) const
457 switch (theIndex.internalId()) {
459 // return QModelIndex();
461 case ConstructFolder:
465 return QModelIndex();
466 //return createIndex(0, 0, (qint32) MyRoot);
469 return createIndex(0, theIndex.column(), (qint32) ParamsFolder);
470 case ConstructObject:
471 return createIndex(1, theIndex.column(), (qint32) ConstructFolder);
473 return createIndex(2, theIndex.column(), (qint32) BodiesFolder);
475 return createIndex(3, theIndex.column(), (qint32) GroupsFolder);
477 return QModelIndex();
480 bool PartSet_PartDataModel::hasChildren(const QModelIndex& theParent) const
482 return rowCount(theParent) > 0;
485 DocumentPtr PartSet_PartDataModel::partDocument() const
487 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
488 //ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
489 ObjectPtr aObject = aRootDoc->object(ModelAPI_Feature::group(), myId);
490 FeaturePtr aFeature = ModelAPI_Feature::feature(aObject);
491 ResultPartPtr aPart = std::dynamic_pointer_cast<ModelAPI_ResultPart>(aFeature->firstResult());
492 //std::dynamic_pointer_cast<ModelAPI_ResultPart>(aObject);
493 return aPart->partDoc();
496 ObjectPtr PartSet_PartDataModel::object(const QModelIndex& theIndex) const
498 switch (theIndex.internalId()) {
500 // DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
501 // return aRootDoc->object(ModelAPI_ResultPart::group(), myId);
504 case ConstructFolder:
510 return partDocument()->object(ModelAPI_ResultParameter::group(), theIndex.row());
511 case ConstructObject:
512 return partDocument()->object(ModelAPI_ResultConstruction::group(), theIndex.row());
514 return partDocument()->object(ModelAPI_ResultBody::group(), theIndex.row());
516 return partDocument()->object(ModelAPI_ResultGroup::group(), theIndex.row());
518 return partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - getRowsNumber());
523 bool PartSet_PartDataModel::hasDocument(const DocumentPtr& theDoc) const
525 return (partDocument() == theDoc);
528 QModelIndex PartSet_PartDataModel::findParent(const ObjectPtr& theObject) const
530 return findGroup(theObject->groupName().c_str());
533 QModelIndex PartSet_PartDataModel::findGroup(const std::string& theGroup) const
535 if (theGroup == ModelAPI_ResultParameter::group())
536 return createIndex(0, 0, (qint32) ParamsFolder);
537 if (theGroup == ModelAPI_ResultConstruction::group())
538 return createIndex(1, 0, (qint32) ConstructFolder);
539 if (theGroup == ModelAPI_ResultBody::group())
540 return createIndex(2, 0, (qint32) BodiesFolder);
541 if (theGroup == ModelAPI_ResultGroup::group())
542 return createIndex(3, 0, (qint32) GroupsFolder);
543 return QModelIndex();
546 ResultPartPtr PartSet_PartDataModel::part() const
548 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
549 ObjectPtr aObj = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
550 return std::dynamic_pointer_cast<ModelAPI_ResultPart>(aObj);
553 QModelIndex PartSet_PartDataModel::objectIndex(const ObjectPtr& theObject) const
557 if (part() == theObject)
560 std::string aGroup = theObject->groupName();
561 DocumentPtr aDoc = theObject->document();
562 int aNb = aDoc->size(aGroup);
564 for (int i = 0; i < aNb; i++) {
565 if (aDoc->object(aGroup, i) == theObject) {
572 if (aGroup == ModelAPI_ResultParameter::group())
573 return createIndex(aRow, 0, (qint32) ParamObject);
574 else if (aGroup == ModelAPI_ResultConstruction::group())
575 return createIndex(aRow, 0, (qint32) ConstructObject);
576 else if (aGroup == ModelAPI_ResultBody::group())
577 return createIndex(aRow, 0, (qint32) BodiesObject);
578 else if (aGroup == ModelAPI_ResultGroup::group())
579 return createIndex(aRow, 0, (qint32) GroupObject);
581 return createIndex(aRow + getRowsNumber(), 0, (qint32) HistoryObject);
587 int PartSet_PartDataModel::getRowsNumber() const
589 int aSize = partDocument()->size(ModelAPI_ResultGroup::group());
590 if (aSize == 0) // If there are no groups then do not show group folder