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
36 if (theIndex.column() == 1)
42 switch (theIndex.internalId()) {
44 return tr("Parameters") + QString(" (%1)").arg(rowCount(theIndex));
46 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
47 ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultParameter::group(), theIndex.row());
49 ResultParameterPtr aParam = std::dynamic_pointer_cast<ModelAPI_ResultParameter>(aObject);
50 AttributeDoublePtr aValueAttribute = aParam->data()->real(ModelAPI_ResultParameter::VALUE());
51 QString aVal = QString::number(aValueAttribute->value());
52 QString aTitle = QString(aObject->data()->name().c_str());
53 return aTitle + " = " + aVal;
58 return tr("Constructions") + QString(" (%1)").arg(rowCount(theIndex));
59 case ConstructObject: {
60 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
61 ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultConstruction::group(),
64 return aObject->data()->name().c_str();
68 // return tr("Groups") + QString(" (%1)").arg(rowCount(theIndex));
70 // DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
71 // ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultGroup::group(),
74 // return aObject->data()->name().c_str();
80 case Qt::DecorationRole:
83 switch (theIndex.internalId()) {
85 return QIcon(":pictures/params_folder.png");
87 return QIcon(":pictures/constr_folder.png");
89 return QIcon(":pictures/constr_object.png");
91 // return QIcon(":pictures/constr_folder.png");
99 case Qt::ForegroundRole:
100 return QBrush(myItemsColor);
106 QVariant PartSet_TopDataModel::headerData(int section, Qt::Orientation orientation, int role) const
111 int PartSet_TopDataModel::rowCount(const QModelIndex& theParent) const
113 if (!theParent.isValid())
114 return 2; // In case of groups using it has to be +1
116 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
117 if (theParent.internalId() == ParamsFolder)
118 return aRootDoc->size(ModelAPI_ResultParameter::group());
120 if (theParent.internalId() == ConstructFolder)
121 return aRootDoc->size(ModelAPI_ResultConstruction::group());
123 //if (theParent.internalId() == GroupsFolder)
124 // return aRootDoc->size(ModelAPI_ResultGroup::group());
129 int PartSet_TopDataModel::columnCount(const QModelIndex &parent) const
134 QModelIndex PartSet_TopDataModel::index(int theRow, int theColumn, const QModelIndex& theParent) const
136 if (!theParent.isValid()) {
139 return createIndex(theRow, theColumn, (qint32) ParamsFolder);
141 return createIndex(theRow, theColumn, (qint32) ConstructFolder);
143 // return createIndex(theRow, theColumn, (qint32) GroupsFolder);
146 if (theParent.internalId() == ParamsFolder)
147 return createIndex(theRow, theColumn, (qint32) ParamObject);
149 if (theParent.internalId() == ConstructFolder)
150 return createIndex(theRow, theColumn, (qint32) ConstructObject);
152 //if (theParent.internalId() == GroupsFolder)
153 // return createIndex(theRow, theColumn, (qint32) GroupObject);
155 return QModelIndex();
158 QModelIndex PartSet_TopDataModel::parent(const QModelIndex& theIndex) const
160 int aId = (int) theIndex.internalId();
163 case ConstructFolder:
165 return QModelIndex();
167 return createIndex(0, 0, (qint32) ParamsFolder);
168 case ConstructObject:
169 return createIndex(1, 0, (qint32) ConstructFolder);
171 // return createIndex(2, 0, (qint32) GroupsFolder);
173 return QModelIndex();
176 bool PartSet_TopDataModel::hasChildren(const QModelIndex& theParent) const
178 return rowCount(theParent) > 0;
181 ObjectPtr PartSet_TopDataModel::object(const QModelIndex& theIndex) const
183 switch (theIndex.internalId()) {
185 case ConstructFolder:
188 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
189 return aRootDoc->object(ModelAPI_ResultParameter::group(), theIndex.row());
191 case ConstructObject: {
192 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
193 return aRootDoc->object(ModelAPI_ResultConstruction::group(), theIndex.row());
195 //case GroupObject: {
196 // DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
197 // return aRootDoc->object(ModelAPI_ResultGroup::group(), theIndex.row());
203 QModelIndex PartSet_TopDataModel::findParent(const ObjectPtr& theObject) const
205 return findGroup(theObject->groupName().c_str());
208 QModelIndex PartSet_TopDataModel::findGroup(const std::string& theGroup) const
210 if (theGroup == ModelAPI_ResultParameter::group())
211 return createIndex(0, 0, (qint32) ParamsFolder);
212 if (theGroup == ModelAPI_ResultConstruction::group())
213 return createIndex(1, 0, (qint32) ConstructFolder);
214 //if (theGroup == ModelAPI_ResultGroup::group())
215 // return createIndex(2, 0, (qint32) ConstructFolder);
216 return QModelIndex();
219 QModelIndex PartSet_TopDataModel::objectIndex(const ObjectPtr& theObject) const
223 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
224 std::string aGroup = theObject->groupName();
225 int aNb = aRootDoc->size(aGroup);
227 for (int i = 0; i < aNb; i++) {
228 if (aRootDoc->object(aGroup, i) == theObject) {
234 if (aGroup == ModelAPI_ResultParameter::group())
235 return createIndex(aRow, 0, (qint32) ParamObject);
236 if (aGroup == ModelAPI_ResultConstruction::group())
237 return createIndex(aRow, 0, (qint32) ConstructObject);
238 //if (aGroup == ModelAPI_ResultGroup::group())
239 // return createIndex(aRow, 0, (qint32) GroupObject);
245 //******************************************************************
246 //******************************************************************
247 //******************************************************************
248 PartSet_PartDataModel::PartSet_PartDataModel(QObject* theParent)
249 : PartSet_PartModel(theParent), myHistoryBackOffset(0)
253 PartSet_PartDataModel::~PartSet_PartDataModel()
257 QVariant PartSet_PartDataModel::data(const QModelIndex& theIndex, int theRole) const
259 DocumentPtr aPartDoc = partDocument();
260 if (theIndex.column() == 1) {
261 DocumentPtr aActiveDoc = ModelAPI_Session::get()->activeDocument();
262 QModelIndex aParent = theIndex.parent();
263 if (aActiveDoc == aPartDoc) {
264 if ((theIndex.internalId() == HistoryObject) && (!aParent.isValid())) {
266 case Qt::DecorationRole:
267 if (theIndex.row() == lastHistoryRow())
268 return QIcon(":pictures/arrow.png");
276 case Qt::DisplayRole:
278 switch (theIndex.internalId()) {
280 // DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
281 // ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
283 // return std::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
286 return tr("Parameters") + QString(" (%1)").arg(rowCount(theIndex));
287 case ConstructFolder:
288 return tr("Constructions") + QString(" (%1)").arg(rowCount(theIndex));
290 return tr("Bodies") + QString(" (%1)").arg(rowCount(theIndex));
292 return tr("Groups") + QString(" (%1)").arg(rowCount(theIndex));
294 ObjectPtr aObject = aPartDoc->object(ModelAPI_ResultParameter::group(), theIndex.row());
296 ResultParameterPtr aParam = std::dynamic_pointer_cast<ModelAPI_ResultParameter>(aObject);
297 AttributeDoublePtr aValueAttribute = aParam->data()->real(ModelAPI_ResultParameter::VALUE());
298 QString aVal = QString::number(aValueAttribute->value());
299 QString aTitle = QString(aObject->data()->name().c_str());
300 return aTitle + " = " + aVal;
304 case ConstructObject: {
305 ObjectPtr aObject = aPartDoc->object(ModelAPI_ResultConstruction::group(), theIndex.row());
307 return std::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
311 ObjectPtr aObject = aPartDoc->object(ModelAPI_ResultBody::group(), theIndex.row());
313 return aObject->data()->name().c_str();
317 ObjectPtr aObject = aPartDoc->object(ModelAPI_ResultGroup::group(), theIndex.row());
319 return aObject->data()->name().c_str();
321 case HistoryObject: {
322 ObjectPtr aObject = aPartDoc->object(ModelAPI_Feature::group(), theIndex.row() - getRowsNumber());
324 return aObject->data()->name().c_str();
328 case Qt::DecorationRole:
330 switch (theIndex.internalId()) {
332 // return QIcon(":pictures/part_ico.png");
334 return QIcon(":pictures/params_folder.png");
335 case ConstructFolder:
337 return QIcon(":pictures/constr_folder.png");
339 return QIcon(":pictures/constr_folder.png");
340 case ConstructObject:
343 std::string aGroup = theIndex.internalId() == ConstructObject ?
344 ModelAPI_ResultConstruction::group() : ModelAPI_ResultBody::group();
345 ObjectPtr anObject = aPartDoc->object(aGroup, theIndex.row());
346 if (anObject && anObject->data() &&
347 anObject->data()->execState() == ModelAPI_StateMustBeUpdated) {
348 return QIcon(":pictures/constr_object_modified.png");
350 return QIcon(":pictures/constr_object.png");
352 case HistoryObject: {
353 ObjectPtr aObject = aPartDoc->object(ModelAPI_Feature::group(), theIndex.row() - getRowsNumber());
354 FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(aObject);
356 return PartSet_DocumentDataModel::featureIcon(aFeature);
360 case Qt::ToolTipRole:
363 case Qt::ForegroundRole:
364 return QBrush(myItemsColor);
370 QVariant PartSet_PartDataModel::headerData(int section, Qt::Orientation orientation, int role) const
375 int PartSet_PartDataModel::rowCount(const QModelIndex& parent) const
377 if (!parent.isValid()) {
378 DocumentPtr aDoc = partDocument();
380 return getRowsNumber() + aDoc->size(ModelAPI_Feature::group());
384 switch (parent.internalId()) {
386 return partDocument()->size(ModelAPI_ResultParameter::group());
387 case ConstructFolder:
388 return partDocument()->size(ModelAPI_ResultConstruction::group());
390 return partDocument()->size(ModelAPI_ResultBody::group());
392 return partDocument()->size(ModelAPI_ResultGroup::group());
397 int PartSet_PartDataModel::columnCount(const QModelIndex &parent) const
402 QModelIndex PartSet_PartDataModel::index(int theRow, int theColumn, const QModelIndex &theParent) const
404 if (!theParent.isValid()) {
407 return createIndex(theRow, theColumn, (qint32) ParamsFolder);
409 return createIndex(theRow, theColumn, (qint32) ConstructFolder);
411 return createIndex(theRow, theColumn, (qint32) BodiesFolder);
414 int aSize = partDocument()->size(ModelAPI_ResultGroup::group());
416 return createIndex(theRow, theColumn, (qint32) GroupsFolder);
418 return createIndex(theRow, theColumn, (qint32) HistoryObject);
421 return createIndex(theRow, theColumn, (qint32) HistoryObject);
424 int aId = (int) theParent.internalId();
427 return createIndex(theRow, theColumn, (qint32) ParamObject);
428 case ConstructFolder:
429 return createIndex(theRow, theColumn, (qint32) ConstructObject);
431 return createIndex(theRow, theColumn, (qint32) BodiesObject);
433 return createIndex(theRow, theColumn, (qint32) GroupObject);
436 return QModelIndex();
439 QModelIndex PartSet_PartDataModel::parent(const QModelIndex& theIndex) const
441 switch (theIndex.internalId()) {
443 case ConstructFolder:
447 return QModelIndex();
450 return createIndex(0, 0, (qint32) ParamsFolder);
451 case ConstructObject:
452 return createIndex(1, 0, (qint32) ConstructFolder);
454 return createIndex(2, 0, (qint32) BodiesFolder);
456 return createIndex(3, 0, (qint32) GroupsFolder);
458 return QModelIndex();
461 bool PartSet_PartDataModel::hasChildren(const QModelIndex& theParent) const
463 return rowCount(theParent) > 0;
466 DocumentPtr PartSet_PartDataModel::partDocument() const
468 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
469 ObjectPtr aObject = aRootDoc->object(ModelAPI_Feature::group(), myId);
470 FeaturePtr aFeature = ModelAPI_Feature::feature(aObject);
471 ResultPartPtr aPart = std::dynamic_pointer_cast<ModelAPI_ResultPart>(aFeature->firstResult());
472 return aPart->partDoc();
475 ObjectPtr PartSet_PartDataModel::object(const QModelIndex& theIndex) const
477 switch (theIndex.internalId()) {
479 case ConstructFolder:
485 return partDocument()->object(ModelAPI_ResultParameter::group(), theIndex.row());
486 case ConstructObject:
487 return partDocument()->object(ModelAPI_ResultConstruction::group(), theIndex.row());
489 return partDocument()->object(ModelAPI_ResultBody::group(), theIndex.row());
491 return partDocument()->object(ModelAPI_ResultGroup::group(), theIndex.row());
493 return partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - getRowsNumber());
498 bool PartSet_PartDataModel::hasDocument(const DocumentPtr& theDoc) const
500 return (partDocument() == theDoc);
503 QModelIndex PartSet_PartDataModel::findParent(const ObjectPtr& theObject) const
505 return findGroup(theObject->groupName().c_str());
508 QModelIndex PartSet_PartDataModel::findGroup(const std::string& theGroup) const
510 if (theGroup == ModelAPI_ResultParameter::group())
511 return createIndex(0, 0, (qint32) ParamsFolder);
512 if (theGroup == ModelAPI_ResultConstruction::group())
513 return createIndex(1, 0, (qint32) ConstructFolder);
514 if (theGroup == ModelAPI_ResultBody::group())
515 return createIndex(2, 0, (qint32) BodiesFolder);
516 if (theGroup == ModelAPI_ResultGroup::group())
517 return createIndex(3, 0, (qint32) GroupsFolder);
518 return QModelIndex();
521 ResultPartPtr PartSet_PartDataModel::part() const
523 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
524 ObjectPtr aObj = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
525 return std::dynamic_pointer_cast<ModelAPI_ResultPart>(aObj);
528 QModelIndex PartSet_PartDataModel::objectIndex(const ObjectPtr& theObject) const
532 if (part() == theObject)
535 std::string aGroup = theObject->groupName();
536 DocumentPtr aDoc = theObject->document();
537 int aNb = aDoc->size(aGroup);
539 for (int i = 0; i < aNb; i++) {
540 if (aDoc->object(aGroup, i) == theObject) {
547 if (aGroup == ModelAPI_ResultParameter::group())
548 return createIndex(aRow, 0, (qint32) ParamObject);
549 else if (aGroup == ModelAPI_ResultConstruction::group())
550 return createIndex(aRow, 0, (qint32) ConstructObject);
551 else if (aGroup == ModelAPI_ResultBody::group())
552 return createIndex(aRow, 0, (qint32) BodiesObject);
553 else if (aGroup == ModelAPI_ResultGroup::group())
554 return createIndex(aRow, 0, (qint32) GroupObject);
556 return createIndex(aRow + getRowsNumber(), 0, (qint32) HistoryObject);
562 int PartSet_PartDataModel::getRowsNumber() const
564 int aSize = partDocument()->size(ModelAPI_ResultGroup::group());
565 if (aSize == 0) // If there are no groups then do not show group folder
570 int PartSet_PartDataModel::lastHistoryRow() const
572 return rowCount() - 1 - myHistoryBackOffset;