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>
19 //ObjectPtr featureObj(const ObjectPtr& theFeature)
21 // ObjectPtr aObject = boost::dynamic_pointer_cast<ModelAPI_Object>(theFeature);
23 // return aObject->featureRef();
28 XGUI_TopDataModel::XGUI_TopDataModel(QObject* theParent)
29 : XGUI_FeaturesModel(theParent)
33 XGUI_TopDataModel::~XGUI_TopDataModel()
38 QVariant XGUI_TopDataModel::data(const QModelIndex& theIndex, int theRole) const
43 switch (theIndex.internalId()) {
45 return tr("Parameters") + QString(" (%1)").arg(rowCount(theIndex));
48 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
49 ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultParameters::group(), theIndex.row());
51 return boost::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
54 return tr("Constructions") + QString(" (%1)").arg(rowCount(theIndex));
57 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
58 ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultConstruction::group(), theIndex.row());
60 return boost::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
65 case Qt::DecorationRole:
67 switch (theIndex.internalId()) {
69 return QIcon(":pictures/params_folder.png");
71 return QIcon(":pictures/constr_folder.png");
73 return QIcon(":pictures/constr_object.png");
75 // DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
76 // ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultConstruction::group(), theIndex.row());
78 // return QIcon(XGUI_Workshop::featureIcon(aObject->getKind()));
86 case Qt::ForegroundRole:
87 return QBrush(myItemsColor);
93 QVariant XGUI_TopDataModel::headerData(int section, Qt::Orientation orientation, int role) const
98 int XGUI_TopDataModel::rowCount(const QModelIndex& theParent) const
100 if (!theParent.isValid())
103 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
104 if (theParent.internalId() == ParamsFolder)
105 return aRootDoc->size(ModelAPI_ResultParameters::group());
107 if (theParent.internalId() == ConstructFolder)
108 return aRootDoc->size(ModelAPI_ResultConstruction::group());
112 int XGUI_TopDataModel::columnCount(const QModelIndex &parent) const
117 QModelIndex XGUI_TopDataModel::index(int theRow, int theColumn, const QModelIndex& theParent) const
119 if (!theParent.isValid()) {
122 return createIndex(theRow, theColumn, (qint32) ParamsFolder);
124 return createIndex(theRow, theColumn, (qint32) ConstructFolder);
127 if (theParent.internalId() == ParamsFolder)
128 return createIndex(theRow, theColumn, (qint32) ParamObject);
130 if (theParent.internalId() == ConstructFolder)
131 return createIndex(theRow, theColumn, (qint32) ConstructObject);
133 return QModelIndex();
136 QModelIndex XGUI_TopDataModel::parent(const QModelIndex& theIndex) const
138 int aId = (int)theIndex.internalId();
141 case ConstructFolder:
142 return QModelIndex();
144 return createIndex(0, 0, (qint32) ParamsFolder);
145 case ConstructObject:
146 return createIndex(1, 0, (qint32) ConstructFolder);
148 return QModelIndex();
151 bool XGUI_TopDataModel::hasChildren(const QModelIndex& theParent) const
153 return rowCount(theParent) > 0;
156 ObjectPtr XGUI_TopDataModel::object(const QModelIndex& theIndex) const
158 switch (theIndex.internalId()) {
160 case ConstructFolder:
164 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
165 return aRootDoc->object(ModelAPI_ResultParameters::group(), theIndex.row());
167 case ConstructObject:
169 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
170 return aRootDoc->object(ModelAPI_ResultConstruction::group(), theIndex.row());
177 QModelIndex XGUI_TopDataModel::findParent(const ObjectPtr& theObject) const
179 return findGroup(theObject->groupName().c_str());
182 QModelIndex XGUI_TopDataModel::findGroup(const std::string& theGroup) const
184 if (theGroup.compare(ModelAPI_ResultParameters::group()) == 0)
185 return createIndex(0, 0, (qint32) ParamsFolder);
186 if (theGroup.compare(ModelAPI_ResultConstruction::group()) == 0)
187 return createIndex(1, 0, (qint32) ConstructFolder);
188 return QModelIndex();
191 QModelIndex XGUI_TopDataModel::objectIndex(const ObjectPtr& theObject) const
195 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
196 std::string aGroup = theObject->groupName();
197 int aNb = aRootDoc->size(aGroup);
199 for (int i = 0; i < aNb; i++) {
200 if (aRootDoc->object(aGroup, i) == theObject) {
206 if (aGroup.compare(ModelAPI_ResultParameters::group()) == 0)
207 return createIndex(aRow, 0, (qint32) ParamObject);
208 if (aGroup.compare(ModelAPI_ResultConstruction::group()) == 0)
209 return createIndex(aRow, 0, (qint32) ConstructObject);
217 //******************************************************************
218 //******************************************************************
219 //******************************************************************
220 XGUI_PartDataModel::XGUI_PartDataModel(QObject* theParent)
221 : XGUI_PartModel(theParent)
226 XGUI_PartDataModel::~XGUI_PartDataModel()
230 QVariant XGUI_PartDataModel::data(const QModelIndex& theIndex, int theRole) const
233 case Qt::DisplayRole:
235 switch (theIndex.internalId()) {
238 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
239 ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
241 return boost::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
244 return tr("Parameters") + QString(" (%1)").arg(rowCount(theIndex));
245 case ConstructFolder:
246 return tr("Constructions") + QString(" (%1)").arg(rowCount(theIndex));
248 return tr("Bodies") + QString(" (%1)").arg(rowCount(theIndex));
251 ObjectPtr aObject = partDocument()->object(ModelAPI_ResultParameters::group(), theIndex.row());
253 return boost::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
255 case ConstructObject:
257 ObjectPtr aObject = partDocument()->object(ModelAPI_ResultConstruction::group(), theIndex.row());
259 return boost::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
263 ObjectPtr aObject = partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - 3);
265 return aObject->data()->name().c_str();
269 case Qt::DecorationRole:
271 switch (theIndex.internalId()) {
273 return QIcon(":pictures/part_ico.png");
275 return QIcon(":pictures/params_folder.png");
276 case ConstructFolder:
278 return QIcon(":pictures/constr_folder.png");
279 case ConstructObject:
280 return QIcon(":pictures/constr_object.png");
282 // ObjectPtr aObject = partDocument()->object(ModelAPI_ResultConstruction::group(), theIndex.row());
284 // return QIcon(XGUI_Workshop::featureIcon(aObject->getKind()));
288 ObjectPtr aObject = partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - 3);
289 FeaturePtr aFeature = boost::dynamic_pointer_cast<ModelAPI_Feature>(aObject);
291 return QIcon(XGUI_Workshop::featureIcon(aFeature->getKind()));
295 case Qt::ToolTipRole:
298 case Qt::ForegroundRole:
299 return QBrush(myItemsColor);
305 QVariant XGUI_PartDataModel::headerData(int section, Qt::Orientation orientation, int role) const
310 int XGUI_PartDataModel::rowCount(const QModelIndex& parent) const
312 if (!parent.isValid()) {
313 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
314 if (aRootDoc->object(ModelAPI_ResultPart::group(), myId))
319 switch (parent.internalId()) {
321 return 3 + partDocument()->size(ModelAPI_Feature::group());
323 return partDocument()->size(ModelAPI_ResultParameters::group());
324 case ConstructFolder:
325 return partDocument()->size(ModelAPI_ResultConstruction::group());
332 int XGUI_PartDataModel::columnCount(const QModelIndex &parent) const
337 QModelIndex XGUI_PartDataModel::index(int theRow, int theColumn, const QModelIndex &theParent) const
339 if (!theParent.isValid())
340 return createIndex(theRow, 0, (qint32) MyRoot);
342 int aId = (int)theParent.internalId();
347 return createIndex(0, 0, (qint32) ParamsFolder);
349 return createIndex(1, 0, (qint32) ConstructFolder);
351 return createIndex(2, 0, (qint32) BodiesFolder);
353 return createIndex(theRow, theColumn, (qint32) HistoryObject);
356 return createIndex(theRow, 0, (qint32) ParamObject);
357 case ConstructFolder:
358 return createIndex(theRow, 0, (qint32) ConstructObject);
360 return createIndex(theRow, 0, (qint32) BodiesObject);
362 return QModelIndex();
365 QModelIndex XGUI_PartDataModel::parent(const QModelIndex& theIndex) const
367 switch (theIndex.internalId()) {
369 return QModelIndex();
371 case ConstructFolder:
374 return createIndex(0, 0, (qint32) MyRoot);
376 return createIndex(0, 0, (qint32) ParamsFolder);
377 case ConstructObject:
378 return createIndex(1, 0, (qint32) ConstructFolder);
380 return QModelIndex();
383 bool XGUI_PartDataModel::hasChildren(const QModelIndex& theParent) const
385 return rowCount(theParent) > 0;
389 DocumentPtr XGUI_PartDataModel::partDocument() const
391 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
392 ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
393 ResultPartPtr aPart = boost::dynamic_pointer_cast<ModelAPI_ResultPart>(aObject);
394 return aPart->partDoc();
397 ObjectPtr XGUI_PartDataModel::object(const QModelIndex& theIndex) const
399 switch (theIndex.internalId()) {
402 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
403 return aRootDoc->object(ModelAPI_ResultPart::group(), myId);
406 case ConstructFolder:
410 return partDocument()->object(ModelAPI_ResultParameters::group(), theIndex.row());
411 case ConstructObject:
412 return partDocument()->object(ModelAPI_ResultConstruction::group(), theIndex.row());
414 // return partDocument()->feature(ModelAPI_ResultConstruction::group(), theIndex.row());
416 return partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - 3);
421 bool XGUI_PartDataModel::hasDocument(const DocumentPtr& theDoc) const
423 return (partDocument() == theDoc);
427 QModelIndex XGUI_PartDataModel::findParent(const ObjectPtr& theObject) const
429 return findGroup(theObject->groupName().c_str());
432 QModelIndex XGUI_PartDataModel::findGroup(const std::string& theGroup) const
434 if (theGroup.compare(ModelAPI_ResultParameters::group()) == 0)
435 return createIndex(0, 0, (qint32) ParamsFolder);
436 if (theGroup.compare(ModelAPI_ResultConstruction::group()) == 0)
437 return createIndex(1, 0, (qint32) ConstructFolder);
438 return QModelIndex();
441 ResultPartPtr XGUI_PartDataModel::part() const
443 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
444 ObjectPtr aObj = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
445 return boost::dynamic_pointer_cast<ModelAPI_ResultPart>(aObj);
448 QModelIndex XGUI_PartDataModel::objectIndex(const ObjectPtr& theObject) const
452 if (part() == theObject)
455 //std::string aGroup = theFeature->getGroup();
456 DocumentPtr aDoc = theObject->document();
457 int aNb = aDoc->size(ModelAPI_Feature::group());
459 for (int i = 0; i < aNb; i++) {
460 if (aDoc->object(ModelAPI_Feature::group(), i) == theObject) {
466 return createIndex(aRow + 3, 0, (qint32) HistoryObject);
467 /* if (aGroup.compare(ModelAPI_ResultParameters::group()) == 0)
468 return createIndex(aRow, 0, (qint32) ParamObject);
469 if (aGroup.compare(ModelAPI_ResultConstruction::group()) == 0)
470 return createIndex(aRow, 0, (qint32) ConstructObject);*/