1 #include "XGUI_PartDataModel.h"
2 #include "XGUI_Workshop.h"
4 #include <ModelAPI_Session.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>
15 #include <ModelAPI_ResultGroup.h>
20 //ObjectPtr featureObj(const ObjectPtr& theFeature)
22 // ObjectPtr aObject = std::dynamic_pointer_cast<ModelAPI_Object>(theFeature);
24 // return aObject->featureRef();
28 XGUI_TopDataModel::XGUI_TopDataModel(QObject* theParent)
29 : XGUI_FeaturesModel(theParent)
33 XGUI_TopDataModel::~XGUI_TopDataModel()
37 QVariant XGUI_TopDataModel::data(const QModelIndex& theIndex, int theRole) const
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_ResultParameters::group(), theIndex.row());
49 return aObject->data()->name().c_str();
53 return tr("Constructions") + QString(" (%1)").arg(rowCount(theIndex));
54 case ConstructObject: {
55 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
56 ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultConstruction::group(),
59 return aObject->data()->name().c_str();
63 // return tr("Groups") + QString(" (%1)").arg(rowCount(theIndex));
65 // DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
66 // ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultGroup::group(),
69 // return aObject->data()->name().c_str();
75 case Qt::DecorationRole:
78 switch (theIndex.internalId()) {
80 return QIcon(":pictures/params_folder.png");
82 return QIcon(":pictures/constr_folder.png");
84 return QIcon(":pictures/constr_object.png");
86 // return QIcon(":pictures/constr_folder.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())
109 return 2; // In case of groups using it has to be +1
111 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
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() == GroupsFolder)
119 // return aRootDoc->size(ModelAPI_ResultGroup::group());
124 int XGUI_TopDataModel::columnCount(const QModelIndex &parent) const
129 QModelIndex XGUI_TopDataModel::index(int theRow, int theColumn, const QModelIndex& theParent) const
131 if (!theParent.isValid()) {
134 return createIndex(theRow, theColumn, (qint32) ParamsFolder);
136 return createIndex(theRow, theColumn, (qint32) ConstructFolder);
138 // return createIndex(theRow, theColumn, (qint32) GroupsFolder);
141 if (theParent.internalId() == ParamsFolder)
142 return createIndex(theRow, theColumn, (qint32) ParamObject);
144 if (theParent.internalId() == ConstructFolder)
145 return createIndex(theRow, theColumn, (qint32) ConstructObject);
147 //if (theParent.internalId() == GroupsFolder)
148 // return createIndex(theRow, theColumn, (qint32) GroupObject);
150 return QModelIndex();
153 QModelIndex XGUI_TopDataModel::parent(const QModelIndex& theIndex) const
155 int aId = (int) theIndex.internalId();
158 case ConstructFolder:
160 return QModelIndex();
162 return createIndex(0, 0, (qint32) ParamsFolder);
163 case ConstructObject:
164 return createIndex(1, 0, (qint32) ConstructFolder);
166 // return createIndex(2, 0, (qint32) GroupsFolder);
168 return QModelIndex();
171 bool XGUI_TopDataModel::hasChildren(const QModelIndex& theParent) const
173 return rowCount(theParent) > 0;
176 ObjectPtr XGUI_TopDataModel::object(const QModelIndex& theIndex) const
178 switch (theIndex.internalId()) {
180 case ConstructFolder:
183 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
184 return aRootDoc->object(ModelAPI_ResultParameters::group(), theIndex.row());
186 case ConstructObject: {
187 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
188 return aRootDoc->object(ModelAPI_ResultConstruction::group(), theIndex.row());
190 //case GroupObject: {
191 // DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
192 // return aRootDoc->object(ModelAPI_ResultGroup::group(), theIndex.row());
198 QModelIndex XGUI_TopDataModel::findParent(const ObjectPtr& theObject) const
200 return findGroup(theObject->groupName().c_str());
203 QModelIndex XGUI_TopDataModel::findGroup(const std::string& theGroup) const
205 if (theGroup == ModelAPI_ResultParameters::group())
206 return createIndex(0, 0, (qint32) ParamsFolder);
207 if (theGroup == ModelAPI_ResultConstruction::group())
208 return createIndex(1, 0, (qint32) ConstructFolder);
209 //if (theGroup == ModelAPI_ResultGroup::group())
210 // return createIndex(2, 0, (qint32) ConstructFolder);
211 return QModelIndex();
214 QModelIndex XGUI_TopDataModel::objectIndex(const ObjectPtr& theObject) const
218 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
219 std::string aGroup = theObject->groupName();
220 int aNb = aRootDoc->size(aGroup);
222 for (int i = 0; i < aNb; i++) {
223 if (aRootDoc->object(aGroup, i) == theObject) {
229 if (aGroup == ModelAPI_ResultParameters::group())
230 return createIndex(aRow, 0, (qint32) ParamObject);
231 if (aGroup == ModelAPI_ResultConstruction::group())
232 return createIndex(aRow, 0, (qint32) ConstructObject);
233 //if (aGroup == ModelAPI_ResultGroup::group())
234 // return createIndex(aRow, 0, (qint32) GroupObject);
240 //******************************************************************
241 //******************************************************************
242 //******************************************************************
243 XGUI_PartDataModel::XGUI_PartDataModel(QObject* theParent)
244 : XGUI_PartModel(theParent)
248 XGUI_PartDataModel::~XGUI_PartDataModel()
252 QVariant XGUI_PartDataModel::data(const QModelIndex& theIndex, int theRole) const
255 case Qt::DisplayRole:
257 switch (theIndex.internalId()) {
259 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
260 ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
262 return std::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
265 return tr("Parameters") + QString(" (%1)").arg(rowCount(theIndex));
266 case ConstructFolder:
267 return tr("Constructions") + QString(" (%1)").arg(rowCount(theIndex));
269 return tr("Bodies") + QString(" (%1)").arg(rowCount(theIndex));
271 return tr("Groups") + QString(" (%1)").arg(rowCount(theIndex));
273 ObjectPtr aObject = partDocument()->object(ModelAPI_ResultParameters::group(),
276 return std::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
279 case ConstructObject: {
280 ObjectPtr aObject = partDocument()->object(ModelAPI_ResultConstruction::group(),
283 return std::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
287 ObjectPtr aObject = partDocument()->object(ModelAPI_ResultBody::group(), theIndex.row());
289 return aObject->data()->name().c_str();
293 ObjectPtr aObject = partDocument()->object(ModelAPI_ResultGroup::group(), theIndex.row());
295 return aObject->data()->name().c_str();
297 case HistoryObject: {
298 ObjectPtr aObject = partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - getRowsNumber());
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");
315 return QIcon(":pictures/constr_folder.png");
316 case ConstructObject:
319 std::string aGroup = theIndex.internalId() == ConstructObject ?
320 ModelAPI_ResultConstruction::group() : ModelAPI_ResultBody::group();
321 ObjectPtr anObject = partDocument()->object(aGroup, theIndex.row());
322 if (anObject && anObject->data() &&
323 anObject->data()->execState() == ModelAPI_StateMustBeUpdated) {
324 return QIcon(":pictures/constr_object_modified.png");
326 return QIcon(":pictures/constr_object.png");
328 case HistoryObject: {
329 ObjectPtr aObject = partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - getRowsNumber());
330 FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(aObject);
332 return XGUI_Workshop::featureIcon(aFeature);
336 case Qt::ToolTipRole:
339 case Qt::ForegroundRole:
340 return QBrush(myItemsColor);
346 QVariant XGUI_PartDataModel::headerData(int section, Qt::Orientation orientation, int role) const
351 int XGUI_PartDataModel::rowCount(const QModelIndex& parent) const
353 if (!parent.isValid()) {
354 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
355 if (aRootDoc->object(ModelAPI_ResultPart::group(), myId))
360 switch (parent.internalId()) {
363 DocumentPtr aDoc = partDocument();
365 return getRowsNumber() + aDoc->size(ModelAPI_Feature::group());
370 return partDocument()->size(ModelAPI_ResultParameters::group());
371 case ConstructFolder:
372 return partDocument()->size(ModelAPI_ResultConstruction::group());
374 return partDocument()->size(ModelAPI_ResultBody::group());
376 return partDocument()->size(ModelAPI_ResultGroup::group());
381 int XGUI_PartDataModel::columnCount(const QModelIndex &parent) const
386 QModelIndex XGUI_PartDataModel::index(int theRow, int theColumn, const QModelIndex &theParent) const
388 if (!theParent.isValid())
389 return createIndex(theRow, 0, (qint32) MyRoot);
391 int aId = (int) theParent.internalId();
396 return createIndex(theRow, 0, (qint32) ParamsFolder);
398 return createIndex(theRow, 0, (qint32) ConstructFolder);
400 return createIndex(theRow, 0, (qint32) BodiesFolder);
403 int aSize = partDocument()->size(ModelAPI_ResultGroup::group());
405 return createIndex(theRow, 0, (qint32) GroupsFolder);
407 return createIndex(theRow, theColumn, (qint32) HistoryObject);
410 return createIndex(theRow, theColumn, (qint32) HistoryObject);
413 return createIndex(theRow, 0, (qint32) ParamObject);
414 case ConstructFolder:
415 return createIndex(theRow, 0, (qint32) ConstructObject);
417 return createIndex(theRow, 0, (qint32) BodiesObject);
419 return createIndex(theRow, 0, (qint32) GroupObject);
421 return QModelIndex();
424 QModelIndex XGUI_PartDataModel::parent(const QModelIndex& theIndex) const
426 switch (theIndex.internalId()) {
428 return QModelIndex();
430 case ConstructFolder:
434 return createIndex(0, 0, (qint32) MyRoot);
437 return createIndex(0, 0, (qint32) ParamsFolder);
438 case ConstructObject:
439 return createIndex(1, 0, (qint32) ConstructFolder);
441 return createIndex(2, 0, (qint32) BodiesFolder);
443 return createIndex(3, 0, (qint32) GroupsFolder);
445 return QModelIndex();
448 bool XGUI_PartDataModel::hasChildren(const QModelIndex& theParent) const
450 return rowCount(theParent) > 0;
453 DocumentPtr XGUI_PartDataModel::partDocument() const
455 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
456 ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
457 ResultPartPtr aPart = std::dynamic_pointer_cast<ModelAPI_ResultPart>(aObject);
459 return aPart->partDoc();
460 return DocumentPtr(); // null if not found
463 ObjectPtr XGUI_PartDataModel::object(const QModelIndex& theIndex) const
465 switch (theIndex.internalId()) {
467 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
468 return aRootDoc->object(ModelAPI_ResultPart::group(), myId);
471 case ConstructFolder:
477 return partDocument()->object(ModelAPI_ResultParameters::group(), theIndex.row());
478 case ConstructObject:
479 return partDocument()->object(ModelAPI_ResultConstruction::group(), theIndex.row());
481 return partDocument()->object(ModelAPI_ResultBody::group(), theIndex.row());
483 return partDocument()->object(ModelAPI_ResultGroup::group(), theIndex.row());
485 return partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - getRowsNumber());
490 bool XGUI_PartDataModel::hasDocument(const DocumentPtr& theDoc) const
492 return (partDocument() == theDoc);
495 QModelIndex XGUI_PartDataModel::findParent(const ObjectPtr& theObject) const
497 return findGroup(theObject->groupName().c_str());
500 QModelIndex XGUI_PartDataModel::findGroup(const std::string& theGroup) const
502 if (theGroup == ModelAPI_ResultParameters::group())
503 return createIndex(0, 0, (qint32) ParamsFolder);
504 if (theGroup == ModelAPI_ResultConstruction::group())
505 return createIndex(1, 0, (qint32) ConstructFolder);
506 if (theGroup == ModelAPI_ResultBody::group())
507 return createIndex(2, 0, (qint32) BodiesFolder);
508 if (theGroup == ModelAPI_ResultGroup::group())
509 return createIndex(3, 0, (qint32) GroupsFolder);
510 return QModelIndex();
513 ResultPartPtr XGUI_PartDataModel::part() const
515 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
516 ObjectPtr aObj = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
517 return std::dynamic_pointer_cast<ModelAPI_ResultPart>(aObj);
520 QModelIndex XGUI_PartDataModel::objectIndex(const ObjectPtr& theObject) const
524 if (part() == theObject)
527 std::string aGroup = theObject->groupName();
528 DocumentPtr aDoc = theObject->document();
529 int aNb = aDoc->size(aGroup);
531 for (int i = 0; i < aNb; i++) {
532 if (aDoc->object(aGroup, i) == theObject) {
539 if (aGroup == ModelAPI_ResultParameters::group())
540 return createIndex(aRow, 0, (qint32) ParamObject);
541 else if (aGroup == ModelAPI_ResultConstruction::group())
542 return createIndex(aRow, 0, (qint32) ConstructObject);
543 else if (aGroup == ModelAPI_ResultBody::group())
544 return createIndex(aRow, 0, (qint32) BodiesObject);
545 else if (aGroup == ModelAPI_ResultGroup::group())
546 return createIndex(aRow, 0, (qint32) GroupObject);
548 return createIndex(aRow + getRowsNumber(), 0, (qint32) HistoryObject);
554 int XGUI_PartDataModel::getRowsNumber() const
556 int aSize = partDocument()->size(ModelAPI_ResultGroup::group());
557 if (aSize == 0) // If there are no groups then do not show group folder