1 #include "XGUI_PartDataModel.h"
2 #include "XGUI_Workshop.h"
4 #include <ModelAPI_PluginManager.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_PluginManager::get()->rootDocument();
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_PluginManager::get()->rootDocument();
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_PluginManager::get()->rootDocument();
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 return QIcon(":pictures/constr_object.png");
89 case Qt::ForegroundRole:
90 return QBrush(myItemsColor);
96 QVariant XGUI_TopDataModel::headerData(int section, Qt::Orientation orientation, int role) const
101 int XGUI_TopDataModel::rowCount(const QModelIndex& theParent) const
103 if (!theParent.isValid())
106 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
107 if (theParent.internalId() == ParamsFolder)
108 return aRootDoc->size(ModelAPI_ResultParameters::group());
110 if (theParent.internalId() == ConstructFolder)
111 return aRootDoc->size(ModelAPI_ResultConstruction::group());
113 if (theParent.internalId() == BodiesFolder)
114 return aRootDoc->size(ModelAPI_ResultBody::group());
118 int XGUI_TopDataModel::columnCount(const QModelIndex &parent) const
123 QModelIndex XGUI_TopDataModel::index(int theRow, int theColumn, const QModelIndex& theParent) const
125 if (!theParent.isValid()) {
128 return createIndex(theRow, theColumn, (qint32) ParamsFolder);
130 return createIndex(theRow, theColumn, (qint32) ConstructFolder);
132 return createIndex(theRow, theColumn, (qint32) BodiesFolder);
135 if (theParent.internalId() == ParamsFolder)
136 return createIndex(theRow, theColumn, (qint32) ParamObject);
138 if (theParent.internalId() == ConstructFolder)
139 return createIndex(theRow, theColumn, (qint32) ConstructObject);
141 if (theParent.internalId() == BodiesFolder)
142 return createIndex(theRow, theColumn, (qint32) BodiesObject);
144 return QModelIndex();
147 QModelIndex XGUI_TopDataModel::parent(const QModelIndex& theIndex) const
149 int aId = (int) theIndex.internalId();
152 case ConstructFolder:
154 return QModelIndex();
156 return createIndex(0, 0, (qint32) ParamsFolder);
157 case ConstructObject:
158 return createIndex(1, 0, (qint32) ConstructFolder);
160 return createIndex(2, 0, (qint32) BodiesFolder);
162 return QModelIndex();
165 bool XGUI_TopDataModel::hasChildren(const QModelIndex& theParent) const
167 return rowCount(theParent) > 0;
170 ObjectPtr XGUI_TopDataModel::object(const QModelIndex& theIndex) const
172 switch (theIndex.internalId()) {
174 case ConstructFolder:
178 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
179 return aRootDoc->object(ModelAPI_ResultParameters::group(), theIndex.row());
181 case ConstructObject: {
182 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
183 return aRootDoc->object(ModelAPI_ResultConstruction::group(), theIndex.row());
186 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
187 return aRootDoc->object(ModelAPI_ResultBody::group(), theIndex.row());
193 QModelIndex XGUI_TopDataModel::findParent(const ObjectPtr& theObject) const
195 return findGroup(theObject->groupName().c_str());
198 QModelIndex XGUI_TopDataModel::findGroup(const std::string& theGroup) const
200 if (theGroup == ModelAPI_ResultParameters::group())
201 return createIndex(0, 0, (qint32) ParamsFolder);
202 if (theGroup == ModelAPI_ResultConstruction::group())
203 return createIndex(1, 0, (qint32) ConstructFolder);
204 if (theGroup == ModelAPI_ResultBody::group())
205 return createIndex(2, 0, (qint32) BodiesFolder);
206 return QModelIndex();
209 QModelIndex XGUI_TopDataModel::objectIndex(const ObjectPtr& theObject) const
213 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
214 std::string aGroup = theObject->groupName();
215 int aNb = aRootDoc->size(aGroup);
217 for (int i = 0; i < aNb; i++) {
218 if (aRootDoc->object(aGroup, i) == theObject) {
224 if (aGroup == ModelAPI_ResultParameters::group())
225 return createIndex(aRow, 0, (qint32) ParamObject);
226 if (aGroup == ModelAPI_ResultConstruction::group())
227 return createIndex(aRow, 0, (qint32) ConstructObject);
228 if (aGroup == ModelAPI_ResultBody::group())
229 return createIndex(aRow, 0, (qint32) BodiesObject);
235 //******************************************************************
236 //******************************************************************
237 //******************************************************************
238 XGUI_PartDataModel::XGUI_PartDataModel(QObject* theParent)
239 : XGUI_PartModel(theParent)
243 XGUI_PartDataModel::~XGUI_PartDataModel()
247 QVariant XGUI_PartDataModel::data(const QModelIndex& theIndex, int theRole) const
250 case Qt::DisplayRole:
252 switch (theIndex.internalId()) {
254 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
255 ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
257 return boost::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
260 return tr("Parameters") + QString(" (%1)").arg(rowCount(theIndex));
261 case ConstructFolder:
262 return tr("Constructions") + QString(" (%1)").arg(rowCount(theIndex));
264 return tr("Bodies") + QString(" (%1)").arg(rowCount(theIndex));
266 ObjectPtr aObject = partDocument()->object(ModelAPI_ResultParameters::group(),
269 return boost::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
271 case ConstructObject: {
272 ObjectPtr aObject = partDocument()->object(ModelAPI_ResultConstruction::group(),
275 return boost::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
278 ObjectPtr aObject = partDocument()->object(ModelAPI_ResultBody::group(), theIndex.row());
280 return aObject->data()->name().c_str();
282 case HistoryObject: {
283 ObjectPtr aObject = partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - 3);
285 return aObject->data()->name().c_str();
289 case Qt::DecorationRole:
291 switch (theIndex.internalId()) {
293 return QIcon(":pictures/part_ico.png");
295 return QIcon(":pictures/params_folder.png");
296 case ConstructFolder:
298 return QIcon(":pictures/constr_folder.png");
299 case ConstructObject:
301 return QIcon(":pictures/constr_object.png");
302 case HistoryObject: {
303 ObjectPtr aObject = partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - 3);
304 FeaturePtr aFeature = boost::dynamic_pointer_cast<ModelAPI_Feature>(aObject);
306 return QIcon(XGUI_Workshop::featureIcon(aFeature->getKind()));
310 case Qt::ToolTipRole:
313 case Qt::ForegroundRole:
314 return QBrush(myItemsColor);
320 QVariant XGUI_PartDataModel::headerData(int section, Qt::Orientation orientation, int role) const
325 int XGUI_PartDataModel::rowCount(const QModelIndex& parent) const
327 if (!parent.isValid()) {
328 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
329 if (aRootDoc->object(ModelAPI_ResultPart::group(), myId))
334 switch (parent.internalId()) {
337 DocumentPtr aDoc = partDocument();
339 return 3 + aDoc->size(ModelAPI_Feature::group());
344 return partDocument()->size(ModelAPI_ResultParameters::group());
345 case ConstructFolder:
346 return partDocument()->size(ModelAPI_ResultConstruction::group());
348 return partDocument()->size(ModelAPI_ResultBody::group());
353 int XGUI_PartDataModel::columnCount(const QModelIndex &parent) const
358 QModelIndex XGUI_PartDataModel::index(int theRow, int theColumn, const QModelIndex &theParent) const
360 if (!theParent.isValid())
361 return createIndex(theRow, 0, (qint32) MyRoot);
363 int aId = (int) theParent.internalId();
368 return createIndex(0, 0, (qint32) ParamsFolder);
370 return createIndex(1, 0, (qint32) ConstructFolder);
372 return createIndex(2, 0, (qint32) BodiesFolder);
374 return createIndex(theRow, theColumn, (qint32) HistoryObject);
377 return createIndex(theRow, 0, (qint32) ParamObject);
378 case ConstructFolder:
379 return createIndex(theRow, 0, (qint32) ConstructObject);
381 return createIndex(theRow, 0, (qint32) BodiesObject);
383 return QModelIndex();
386 QModelIndex XGUI_PartDataModel::parent(const QModelIndex& theIndex) const
388 switch (theIndex.internalId()) {
390 return QModelIndex();
392 case ConstructFolder:
395 return createIndex(0, 0, (qint32) MyRoot);
397 return createIndex(0, 0, (qint32) ParamsFolder);
398 case ConstructObject:
399 return createIndex(1, 0, (qint32) ConstructFolder);
401 return createIndex(2, 0, (qint32) BodiesFolder);
403 return QModelIndex();
406 bool XGUI_PartDataModel::hasChildren(const QModelIndex& theParent) const
408 return rowCount(theParent) > 0;
411 DocumentPtr XGUI_PartDataModel::partDocument() const
413 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
414 ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
415 ResultPartPtr aPart = boost::dynamic_pointer_cast<ModelAPI_ResultPart>(aObject);
416 return aPart->partDoc();
419 ObjectPtr XGUI_PartDataModel::object(const QModelIndex& theIndex) const
421 switch (theIndex.internalId()) {
423 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
424 return aRootDoc->object(ModelAPI_ResultPart::group(), myId);
427 case ConstructFolder:
431 return partDocument()->object(ModelAPI_ResultParameters::group(), theIndex.row());
432 case ConstructObject:
433 return partDocument()->object(ModelAPI_ResultConstruction::group(), theIndex.row());
435 return partDocument()->object(ModelAPI_ResultBody::group(), theIndex.row());
437 return partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - 3);
442 bool XGUI_PartDataModel::hasDocument(const DocumentPtr& theDoc) const
444 return (partDocument() == theDoc);
447 QModelIndex XGUI_PartDataModel::findParent(const ObjectPtr& theObject) const
449 return findGroup(theObject->groupName().c_str());
452 QModelIndex XGUI_PartDataModel::findGroup(const std::string& theGroup) const
454 if (theGroup.compare(ModelAPI_ResultParameters::group()) == 0)
455 return createIndex(0, 0, (qint32) ParamsFolder);
456 if (theGroup.compare(ModelAPI_ResultConstruction::group()) == 0)
457 return createIndex(1, 0, (qint32) ConstructFolder);
458 if (theGroup.compare(ModelAPI_ResultBody::group()) == 0)
459 return createIndex(2, 0, (qint32) BodiesFolder);
460 return QModelIndex();
463 ResultPartPtr XGUI_PartDataModel::part() const
465 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
466 ObjectPtr aObj = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
467 return boost::dynamic_pointer_cast<ModelAPI_ResultPart>(aObj);
470 QModelIndex XGUI_PartDataModel::objectIndex(const ObjectPtr& theObject) const
474 if (part() == theObject)
477 std::string aGroup = theObject->groupName();
478 DocumentPtr aDoc = theObject->document();
479 int aNb = aDoc->size(aGroup);
481 for (int i = 0; i < aNb; i++) {
482 if (aDoc->object(aGroup, i) == theObject) {
489 if (aGroup == ModelAPI_ResultParameters::group())
490 return createIndex(aRow, 0, (qint32) ParamObject);
491 else if (aGroup == ModelAPI_ResultConstruction::group())
492 return createIndex(aRow, 0, (qint32) ConstructObject);
493 else if (aGroup == ModelAPI_ResultBody::group())
494 return createIndex(aRow, 0, (qint32) BodiesObject);
496 return createIndex(aRow + 3, 0, (qint32) HistoryObject);