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)
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 if (theIndex.internalId() == HistoryObject) {
365 if (theIndex.row() > lastHistoryRow())
366 return QBrush(Qt::lightGray);
368 return QBrush(myItemsColor);
373 QVariant PartSet_PartDataModel::headerData(int section, Qt::Orientation orientation, int role) const
378 int PartSet_PartDataModel::rowCount(const QModelIndex& parent) const
380 if (!parent.isValid()) {
381 DocumentPtr aDoc = partDocument();
383 return getRowsNumber() + aDoc->size(ModelAPI_Feature::group());
387 switch (parent.internalId()) {
389 return partDocument()->size(ModelAPI_ResultParameter::group());
390 case ConstructFolder:
391 return partDocument()->size(ModelAPI_ResultConstruction::group());
393 return partDocument()->size(ModelAPI_ResultBody::group());
395 return partDocument()->size(ModelAPI_ResultGroup::group());
400 int PartSet_PartDataModel::columnCount(const QModelIndex &parent) const
405 QModelIndex PartSet_PartDataModel::index(int theRow, int theColumn, const QModelIndex &theParent) const
407 if (!theParent.isValid()) {
410 return createIndex(theRow, theColumn, (qint32) ParamsFolder);
412 return createIndex(theRow, theColumn, (qint32) ConstructFolder);
414 return createIndex(theRow, theColumn, (qint32) BodiesFolder);
417 int aSize = partDocument()->size(ModelAPI_ResultGroup::group());
419 return createIndex(theRow, theColumn, (qint32) GroupsFolder);
421 return createIndex(theRow, theColumn, (qint32) HistoryObject);
424 return createIndex(theRow, theColumn, (qint32) HistoryObject);
427 int aId = (int) theParent.internalId();
430 return createIndex(theRow, theColumn, (qint32) ParamObject);
431 case ConstructFolder:
432 return createIndex(theRow, theColumn, (qint32) ConstructObject);
434 return createIndex(theRow, theColumn, (qint32) BodiesObject);
436 return createIndex(theRow, theColumn, (qint32) GroupObject);
439 return QModelIndex();
442 QModelIndex PartSet_PartDataModel::parent(const QModelIndex& theIndex) const
444 switch (theIndex.internalId()) {
446 case ConstructFolder:
450 return QModelIndex();
453 return createIndex(0, 0, (qint32) ParamsFolder);
454 case ConstructObject:
455 return createIndex(1, 0, (qint32) ConstructFolder);
457 return createIndex(2, 0, (qint32) BodiesFolder);
459 return createIndex(3, 0, (qint32) GroupsFolder);
461 return QModelIndex();
464 bool PartSet_PartDataModel::hasChildren(const QModelIndex& theParent) const
466 return rowCount(theParent) > 0;
469 DocumentPtr PartSet_PartDataModel::partDocument() const
471 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
472 ObjectPtr aObject = aRootDoc->object(ModelAPI_Feature::group(), myId);
473 FeaturePtr aFeature = ModelAPI_Feature::feature(aObject);
474 ResultPartPtr aPart = std::dynamic_pointer_cast<ModelAPI_ResultPart>(aFeature->firstResult());
475 return aPart->partDoc();
478 ObjectPtr PartSet_PartDataModel::object(const QModelIndex& theIndex) const
480 switch (theIndex.internalId()) {
482 case ConstructFolder:
488 return partDocument()->object(ModelAPI_ResultParameter::group(), theIndex.row());
489 case ConstructObject:
490 return partDocument()->object(ModelAPI_ResultConstruction::group(), theIndex.row());
492 return partDocument()->object(ModelAPI_ResultBody::group(), theIndex.row());
494 return partDocument()->object(ModelAPI_ResultGroup::group(), theIndex.row());
496 return partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - getRowsNumber());
501 bool PartSet_PartDataModel::hasDocument(const DocumentPtr& theDoc) const
503 return (partDocument() == theDoc);
506 QModelIndex PartSet_PartDataModel::findParent(const ObjectPtr& theObject) const
508 return findGroup(theObject->groupName().c_str());
511 QModelIndex PartSet_PartDataModel::findGroup(const std::string& theGroup) const
513 if (theGroup == ModelAPI_ResultParameter::group())
514 return createIndex(0, 0, (qint32) ParamsFolder);
515 if (theGroup == ModelAPI_ResultConstruction::group())
516 return createIndex(1, 0, (qint32) ConstructFolder);
517 if (theGroup == ModelAPI_ResultBody::group())
518 return createIndex(2, 0, (qint32) BodiesFolder);
519 if (theGroup == ModelAPI_ResultGroup::group())
520 return createIndex(3, 0, (qint32) GroupsFolder);
521 return QModelIndex();
524 ResultPartPtr PartSet_PartDataModel::part() const
526 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
527 ObjectPtr aObj = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
528 return std::dynamic_pointer_cast<ModelAPI_ResultPart>(aObj);
531 QModelIndex PartSet_PartDataModel::objectIndex(const ObjectPtr& theObject) const
535 if (part() == theObject)
538 std::string aGroup = theObject->groupName();
539 DocumentPtr aDoc = theObject->document();
540 int aNb = aDoc->size(aGroup);
542 for (int i = 0; i < aNb; i++) {
543 if (aDoc->object(aGroup, i) == theObject) {
550 if (aGroup == ModelAPI_ResultParameter::group())
551 return createIndex(aRow, 0, (qint32) ParamObject);
552 else if (aGroup == ModelAPI_ResultConstruction::group())
553 return createIndex(aRow, 0, (qint32) ConstructObject);
554 else if (aGroup == ModelAPI_ResultBody::group())
555 return createIndex(aRow, 0, (qint32) BodiesObject);
556 else if (aGroup == ModelAPI_ResultGroup::group())
557 return createIndex(aRow, 0, (qint32) GroupObject);
559 return createIndex(aRow + getRowsNumber(), 0, (qint32) HistoryObject);
565 int PartSet_PartDataModel::getRowsNumber() const
567 int aSize = partDocument()->size(ModelAPI_ResultGroup::group());
568 if (aSize == 0) // If there are no groups then do not show group folder
573 int PartSet_PartDataModel::lastHistoryRow() const
575 DocumentPtr aDoc = partDocument();
576 FeaturePtr aFeature = aDoc->currentFeature();
577 return getRowsNumber() + aDoc->index(aFeature);
580 void PartSet_PartDataModel::setLastHistoryItem(const QModelIndex& theIndex)
582 if (theIndex.internalId() == HistoryObject) {
583 SessionPtr aMgr = ModelAPI_Session::get();
584 ObjectPtr aObject = object(theIndex);
585 DocumentPtr aDoc = partDocument();
586 aMgr->startOperation(tr("History change").toStdString());
587 aDoc->setCurrentFeature(std::dynamic_pointer_cast<ModelAPI_Feature>(aObject));
588 aMgr->finishOperation();
592 QModelIndex PartSet_PartDataModel::lastHistoryItem() const
594 return index(lastHistoryRow(), 1);
597 Qt::ItemFlags PartSet_PartDataModel::flags(const QModelIndex& theIndex) const
599 Qt::ItemFlags aFlags = Qt::ItemIsSelectable;
600 if (object(theIndex)) {
601 aFlags |= Qt::ItemIsEditable;
603 if (theIndex.internalId() == HistoryObject) {
604 if (theIndex.row() <= lastHistoryRow() || (theIndex.column() == 1))
605 aFlags |= Qt::ItemIsEnabled;
607 aFlags |= Qt::ItemIsEnabled;