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());
113 int XGUI_TopDataModel::columnCount(const QModelIndex &parent) const
118 QModelIndex XGUI_TopDataModel::index(int theRow, int theColumn, const QModelIndex& theParent) const
120 if (!theParent.isValid()) {
123 return createIndex(theRow, theColumn, (qint32) ParamsFolder);
125 return createIndex(theRow, theColumn, (qint32) ConstructFolder);
128 if (theParent.internalId() == ParamsFolder)
129 return createIndex(theRow, theColumn, (qint32) ParamObject);
131 if (theParent.internalId() == ConstructFolder)
132 return createIndex(theRow, theColumn, (qint32) ConstructObject);
134 return QModelIndex();
137 QModelIndex XGUI_TopDataModel::parent(const QModelIndex& theIndex) const
139 int aId = (int)theIndex.internalId();
142 case ConstructFolder:
143 return QModelIndex();
145 return createIndex(0, 0, (qint32) ParamsFolder);
146 case ConstructObject:
147 return createIndex(1, 0, (qint32) ConstructFolder);
149 return QModelIndex();
152 bool XGUI_TopDataModel::hasChildren(const QModelIndex& theParent) const
154 return rowCount(theParent) > 0;
157 ObjectPtr XGUI_TopDataModel::object(const QModelIndex& theIndex) const
159 switch (theIndex.internalId()) {
161 case ConstructFolder:
165 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
166 return aRootDoc->object(ModelAPI_ResultParameters::group(), theIndex.row());
168 case ConstructObject:
170 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
171 return aRootDoc->object(ModelAPI_ResultConstruction::group(), theIndex.row());
178 QModelIndex XGUI_TopDataModel::findParent(const ObjectPtr& theObject) const
180 return findGroup(theObject->groupName().c_str());
183 QModelIndex XGUI_TopDataModel::findGroup(const std::string& theGroup) const
185 if (theGroup.compare(ModelAPI_ResultParameters::group()) == 0)
186 return createIndex(0, 0, (qint32) ParamsFolder);
187 if (theGroup.compare(ModelAPI_ResultConstruction::group()) == 0)
188 return createIndex(1, 0, (qint32) ConstructFolder);
189 return QModelIndex();
192 QModelIndex XGUI_TopDataModel::objectIndex(const ObjectPtr& theObject) const
196 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
197 std::string aGroup = theObject->groupName();
198 int aNb = aRootDoc->size(aGroup);
200 for (int i = 0; i < aNb; i++) {
201 if (aRootDoc->object(aGroup, i) == theObject) {
207 if (aGroup.compare(ModelAPI_ResultParameters::group()) == 0)
208 return createIndex(aRow, 0, (qint32) ParamObject);
209 if (aGroup.compare(ModelAPI_ResultConstruction::group()) == 0)
210 return createIndex(aRow, 0, (qint32) ConstructObject);
218 //******************************************************************
219 //******************************************************************
220 //******************************************************************
221 XGUI_PartDataModel::XGUI_PartDataModel(QObject* theParent)
222 : XGUI_PartModel(theParent)
227 XGUI_PartDataModel::~XGUI_PartDataModel()
231 QVariant XGUI_PartDataModel::data(const QModelIndex& theIndex, int theRole) const
234 case Qt::DisplayRole:
236 switch (theIndex.internalId()) {
239 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
240 ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
242 return boost::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
245 return tr("Parameters") + QString(" (%1)").arg(rowCount(theIndex));
246 case ConstructFolder:
247 return tr("Constructions") + QString(" (%1)").arg(rowCount(theIndex));
249 return tr("Bodies") + QString(" (%1)").arg(rowCount(theIndex));
252 ObjectPtr aObject = partDocument()->object(ModelAPI_ResultParameters::group(), theIndex.row());
254 return boost::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
256 case ConstructObject:
258 ObjectPtr aObject = partDocument()->object(ModelAPI_ResultConstruction::group(), theIndex.row());
260 return boost::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
264 ObjectPtr aObject = partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - 3);
266 return aObject->data()->name().c_str();
270 case Qt::DecorationRole:
272 switch (theIndex.internalId()) {
274 return QIcon(":pictures/part_ico.png");
276 return QIcon(":pictures/params_folder.png");
277 case ConstructFolder:
279 return QIcon(":pictures/constr_folder.png");
280 case ConstructObject:
281 return QIcon(":pictures/constr_object.png");
283 // ObjectPtr aObject = partDocument()->object(ModelAPI_ResultConstruction::group(), theIndex.row());
285 // return QIcon(XGUI_Workshop::featureIcon(aObject->getKind()));
289 ObjectPtr aObject = partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - 3);
290 FeaturePtr aFeature = boost::dynamic_pointer_cast<ModelAPI_Feature>(aObject);
292 return QIcon(XGUI_Workshop::featureIcon(aFeature->getKind()));
296 case Qt::ToolTipRole:
299 case Qt::ForegroundRole:
300 return QBrush(myItemsColor);
306 QVariant XGUI_PartDataModel::headerData(int section, Qt::Orientation orientation, int role) const
311 int XGUI_PartDataModel::rowCount(const QModelIndex& parent) const
313 if (!parent.isValid()) {
314 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
315 if (aRootDoc->object(ModelAPI_ResultPart::group(), myId))
320 switch (parent.internalId()) {
322 return 3 + partDocument()->size(ModelAPI_Feature::group());
324 return partDocument()->size(ModelAPI_ResultParameters::group());
325 case ConstructFolder:
326 return partDocument()->size(ModelAPI_ResultConstruction::group());
333 int XGUI_PartDataModel::columnCount(const QModelIndex &parent) const
338 QModelIndex XGUI_PartDataModel::index(int theRow, int theColumn, const QModelIndex &theParent) const
340 if (!theParent.isValid())
341 return createIndex(theRow, 0, (qint32) MyRoot);
343 int aId = (int)theParent.internalId();
348 return createIndex(0, 0, (qint32) ParamsFolder);
350 return createIndex(1, 0, (qint32) ConstructFolder);
352 return createIndex(2, 0, (qint32) BodiesFolder);
354 return createIndex(theRow, theColumn, (qint32) HistoryObject);
357 return createIndex(theRow, 0, (qint32) ParamObject);
358 case ConstructFolder:
359 return createIndex(theRow, 0, (qint32) ConstructObject);
361 return createIndex(theRow, 0, (qint32) BodiesObject);
363 return QModelIndex();
366 QModelIndex XGUI_PartDataModel::parent(const QModelIndex& theIndex) const
368 switch (theIndex.internalId()) {
370 return QModelIndex();
372 case ConstructFolder:
375 return createIndex(0, 0, (qint32) MyRoot);
377 return createIndex(0, 0, (qint32) ParamsFolder);
378 case ConstructObject:
379 return createIndex(1, 0, (qint32) ConstructFolder);
381 return QModelIndex();
384 bool XGUI_PartDataModel::hasChildren(const QModelIndex& theParent) const
386 return rowCount(theParent) > 0;
390 DocumentPtr XGUI_PartDataModel::partDocument() const
392 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
393 ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
394 return aObject->document();
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);*/