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>
19 //ObjectPtr featureObj(const ObjectPtr& theFeature)
21 // ObjectPtr aObject = boost::dynamic_pointer_cast<ModelAPI_Object>(theFeature);
23 // return aObject->featureRef();
27 XGUI_TopDataModel::XGUI_TopDataModel(QObject* theParent)
28 : XGUI_FeaturesModel(theParent)
32 XGUI_TopDataModel::~XGUI_TopDataModel()
36 QVariant XGUI_TopDataModel::data(const QModelIndex& theIndex, int theRole) const
41 switch (theIndex.internalId()) {
43 return tr("Parameters") + QString(" (%1)").arg(rowCount(theIndex));
45 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
46 ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultParameters::group(), theIndex.row());
48 return aObject->data()->name().c_str();
52 return tr("Constructions") + QString(" (%1)").arg(rowCount(theIndex));
53 case ConstructObject: {
54 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
55 ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultConstruction::group(),
58 return aObject->data()->name().c_str();
62 return tr("Bodies") + QString(" (%1)").arg(rowCount(theIndex));
64 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
65 ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultBody::group(), theIndex.row());
67 return aObject->data()->name().c_str();
72 case Qt::DecorationRole:
74 switch (theIndex.internalId()) {
76 return QIcon(":pictures/params_folder.png");
79 return QIcon(":pictures/constr_folder.png");
82 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
83 std::string aGroup = theIndex.internalId() == ConstructObject ?
84 ModelAPI_ResultConstruction::group() : ModelAPI_ResultBody::group();
85 ObjectPtr anObject = aRootDoc->object(aGroup, theIndex.row());
86 if (anObject && anObject->data() && anObject->data()->mustBeUpdated()) {
87 return QIcon(":pictures/constr_object_modified.png");
89 return QIcon(":pictures/constr_object.png");
97 case Qt::ForegroundRole:
98 return QBrush(myItemsColor);
104 QVariant XGUI_TopDataModel::headerData(int section, Qt::Orientation orientation, int role) const
109 int XGUI_TopDataModel::rowCount(const QModelIndex& theParent) const
111 if (!theParent.isValid())
114 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
115 if (theParent.internalId() == ParamsFolder)
116 return aRootDoc->size(ModelAPI_ResultParameters::group());
118 if (theParent.internalId() == ConstructFolder)
119 return aRootDoc->size(ModelAPI_ResultConstruction::group());
121 if (theParent.internalId() == BodiesFolder)
122 return aRootDoc->size(ModelAPI_ResultBody::group());
126 int XGUI_TopDataModel::columnCount(const QModelIndex &parent) const
131 QModelIndex XGUI_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) BodiesFolder);
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() == BodiesFolder)
150 return createIndex(theRow, theColumn, (qint32) BodiesObject);
152 return QModelIndex();
155 QModelIndex XGUI_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) BodiesFolder);
170 return QModelIndex();
173 bool XGUI_TopDataModel::hasChildren(const QModelIndex& theParent) const
175 return rowCount(theParent) > 0;
178 ObjectPtr XGUI_TopDataModel::object(const QModelIndex& theIndex) const
180 switch (theIndex.internalId()) {
182 case ConstructFolder:
186 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
187 return aRootDoc->object(ModelAPI_ResultParameters::group(), theIndex.row());
189 case ConstructObject: {
190 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
191 return aRootDoc->object(ModelAPI_ResultConstruction::group(), theIndex.row());
194 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
195 return aRootDoc->object(ModelAPI_ResultBody::group(), theIndex.row());
201 QModelIndex XGUI_TopDataModel::findParent(const ObjectPtr& theObject) const
203 return findGroup(theObject->groupName().c_str());
206 QModelIndex XGUI_TopDataModel::findGroup(const std::string& theGroup) const
208 if (theGroup == ModelAPI_ResultParameters::group())
209 return createIndex(0, 0, (qint32) ParamsFolder);
210 if (theGroup == ModelAPI_ResultConstruction::group())
211 return createIndex(1, 0, (qint32) ConstructFolder);
212 if (theGroup == ModelAPI_ResultBody::group())
213 return createIndex(2, 0, (qint32) BodiesFolder);
214 return QModelIndex();
217 QModelIndex XGUI_TopDataModel::objectIndex(const ObjectPtr& theObject) const
221 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
222 std::string aGroup = theObject->groupName();
223 int aNb = aRootDoc->size(aGroup);
225 for (int i = 0; i < aNb; i++) {
226 if (aRootDoc->object(aGroup, i) == theObject) {
232 if (aGroup == ModelAPI_ResultParameters::group())
233 return createIndex(aRow, 0, (qint32) ParamObject);
234 if (aGroup == ModelAPI_ResultConstruction::group())
235 return createIndex(aRow, 0, (qint32) ConstructObject);
236 if (aGroup == ModelAPI_ResultBody::group())
237 return createIndex(aRow, 0, (qint32) BodiesObject);
243 //******************************************************************
244 //******************************************************************
245 //******************************************************************
246 XGUI_PartDataModel::XGUI_PartDataModel(QObject* theParent)
247 : XGUI_PartModel(theParent)
251 XGUI_PartDataModel::~XGUI_PartDataModel()
255 QVariant XGUI_PartDataModel::data(const QModelIndex& theIndex, int theRole) const
258 case Qt::DisplayRole:
260 switch (theIndex.internalId()) {
262 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
263 ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
265 return boost::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
268 return tr("Parameters") + QString(" (%1)").arg(rowCount(theIndex));
269 case ConstructFolder:
270 return tr("Constructions") + QString(" (%1)").arg(rowCount(theIndex));
272 return tr("Bodies") + QString(" (%1)").arg(rowCount(theIndex));
274 ObjectPtr aObject = partDocument()->object(ModelAPI_ResultParameters::group(),
277 return boost::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
279 case ConstructObject: {
280 ObjectPtr aObject = partDocument()->object(ModelAPI_ResultConstruction::group(),
283 return boost::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
286 ObjectPtr aObject = partDocument()->object(ModelAPI_ResultBody::group(), theIndex.row());
288 return aObject->data()->name().c_str();
290 case HistoryObject: {
291 ObjectPtr aObject = partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - 3);
293 return aObject->data()->name().c_str();
297 case Qt::DecorationRole:
299 switch (theIndex.internalId()) {
301 return QIcon(":pictures/part_ico.png");
303 return QIcon(":pictures/params_folder.png");
304 case ConstructFolder:
306 return QIcon(":pictures/constr_folder.png");
307 case ConstructObject:
309 std::string aGroup = theIndex.internalId() == ConstructObject ?
310 ModelAPI_ResultConstruction::group() : ModelAPI_ResultBody::group();
311 ObjectPtr anObject = partDocument()->object(aGroup, theIndex.row());
312 if (anObject && anObject->data() && anObject->data()->mustBeUpdated()) {
313 return QIcon(":pictures/constr_object_modified.png");
315 return QIcon(":pictures/constr_object.png");
317 case HistoryObject: {
318 ObjectPtr aObject = partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - 3);
319 FeaturePtr aFeature = boost::dynamic_pointer_cast<ModelAPI_Feature>(aObject);
321 return QIcon(XGUI_Workshop::featureIcon(aFeature->getKind()));
325 case Qt::ToolTipRole:
328 case Qt::ForegroundRole:
329 return QBrush(myItemsColor);
335 QVariant XGUI_PartDataModel::headerData(int section, Qt::Orientation orientation, int role) const
340 int XGUI_PartDataModel::rowCount(const QModelIndex& parent) const
342 if (!parent.isValid()) {
343 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
344 if (aRootDoc->object(ModelAPI_ResultPart::group(), myId))
349 switch (parent.internalId()) {
352 DocumentPtr aDoc = partDocument();
354 return 3 + aDoc->size(ModelAPI_Feature::group());
359 return partDocument()->size(ModelAPI_ResultParameters::group());
360 case ConstructFolder:
361 return partDocument()->size(ModelAPI_ResultConstruction::group());
363 return partDocument()->size(ModelAPI_ResultBody::group());
368 int XGUI_PartDataModel::columnCount(const QModelIndex &parent) const
373 QModelIndex XGUI_PartDataModel::index(int theRow, int theColumn, const QModelIndex &theParent) const
375 if (!theParent.isValid())
376 return createIndex(theRow, 0, (qint32) MyRoot);
378 int aId = (int) theParent.internalId();
383 return createIndex(0, 0, (qint32) ParamsFolder);
385 return createIndex(1, 0, (qint32) ConstructFolder);
387 return createIndex(2, 0, (qint32) BodiesFolder);
389 return createIndex(theRow, theColumn, (qint32) HistoryObject);
392 return createIndex(theRow, 0, (qint32) ParamObject);
393 case ConstructFolder:
394 return createIndex(theRow, 0, (qint32) ConstructObject);
396 return createIndex(theRow, 0, (qint32) BodiesObject);
398 return QModelIndex();
401 QModelIndex XGUI_PartDataModel::parent(const QModelIndex& theIndex) const
403 switch (theIndex.internalId()) {
405 return QModelIndex();
407 case ConstructFolder:
410 return createIndex(0, 0, (qint32) MyRoot);
412 return createIndex(0, 0, (qint32) ParamsFolder);
413 case ConstructObject:
414 return createIndex(1, 0, (qint32) ConstructFolder);
416 return createIndex(2, 0, (qint32) BodiesFolder);
418 return QModelIndex();
421 bool XGUI_PartDataModel::hasChildren(const QModelIndex& theParent) const
423 return rowCount(theParent) > 0;
426 DocumentPtr XGUI_PartDataModel::partDocument() const
428 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
429 ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
430 ResultPartPtr aPart = boost::dynamic_pointer_cast<ModelAPI_ResultPart>(aObject);
431 return aPart->partDoc();
434 ObjectPtr XGUI_PartDataModel::object(const QModelIndex& theIndex) const
436 switch (theIndex.internalId()) {
438 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
439 return aRootDoc->object(ModelAPI_ResultPart::group(), myId);
442 case ConstructFolder:
446 return partDocument()->object(ModelAPI_ResultParameters::group(), theIndex.row());
447 case ConstructObject:
448 return partDocument()->object(ModelAPI_ResultConstruction::group(), theIndex.row());
450 return partDocument()->object(ModelAPI_ResultBody::group(), theIndex.row());
452 return partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - 3);
457 bool XGUI_PartDataModel::hasDocument(const DocumentPtr& theDoc) const
459 return (partDocument() == theDoc);
462 QModelIndex XGUI_PartDataModel::findParent(const ObjectPtr& theObject) const
464 return findGroup(theObject->groupName().c_str());
467 QModelIndex XGUI_PartDataModel::findGroup(const std::string& theGroup) const
469 if (theGroup.compare(ModelAPI_ResultParameters::group()) == 0)
470 return createIndex(0, 0, (qint32) ParamsFolder);
471 if (theGroup.compare(ModelAPI_ResultConstruction::group()) == 0)
472 return createIndex(1, 0, (qint32) ConstructFolder);
473 if (theGroup.compare(ModelAPI_ResultBody::group()) == 0)
474 return createIndex(2, 0, (qint32) BodiesFolder);
475 return QModelIndex();
478 ResultPartPtr XGUI_PartDataModel::part() const
480 DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
481 ObjectPtr aObj = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
482 return boost::dynamic_pointer_cast<ModelAPI_ResultPart>(aObj);
485 QModelIndex XGUI_PartDataModel::objectIndex(const ObjectPtr& theObject) const
489 if (part() == theObject)
492 std::string aGroup = theObject->groupName();
493 DocumentPtr aDoc = theObject->document();
494 int aNb = aDoc->size(aGroup);
496 for (int i = 0; i < aNb; i++) {
497 if (aDoc->object(aGroup, i) == theObject) {
504 if (aGroup == ModelAPI_ResultParameters::group())
505 return createIndex(aRow, 0, (qint32) ParamObject);
506 else if (aGroup == ModelAPI_ResultConstruction::group())
507 return createIndex(aRow, 0, (qint32) ConstructObject);
508 else if (aGroup == ModelAPI_ResultBody::group())
509 return createIndex(aRow, 0, (qint32) BodiesObject);
511 return createIndex(aRow + 3, 0, (qint32) HistoryObject);