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");
74 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
75 ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultConstruction::group(), theIndex.row());
77 return QIcon(XGUI_Workshop::featureIcon(aObject->getKind()));
85 case Qt::ForegroundRole:
86 return QBrush(myItemsColor);
92 QVariant XGUI_TopDataModel::headerData(int section, Qt::Orientation orientation, int role) const
97 int XGUI_TopDataModel::rowCount(const QModelIndex& theParent) const
99 if (!theParent.isValid())
102 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
103 if (theParent.internalId() == ParamsFolder)
104 return aRootDoc->size(ModelAPI_ResultParameters::group());
106 if (theParent.internalId() == ConstructFolder)
107 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)->getName().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:
281 ObjectPtr aObject = partDocument()->object(ModelAPI_ResultConstruction::group(), theIndex.row());
283 return QIcon(XGUI_Workshop::featureIcon(aObject->getKind()));
287 ObjectPtr aObject = partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - 3);
289 return QIcon(XGUI_Workshop::featureIcon(aObject->getKind()));
293 case Qt::ToolTipRole:
296 case Qt::ForegroundRole:
297 return QBrush(myItemsColor);
303 QVariant XGUI_PartDataModel::headerData(int section, Qt::Orientation orientation, int role) const
308 int XGUI_PartDataModel::rowCount(const QModelIndex& parent) const
310 if (!parent.isValid()) {
311 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
312 if (aRootDoc->object(ModelAPI_ResultPart::group(), myId))
317 switch (parent.internalId()) {
319 return 3 + partDocument()->size(ModelAPI_Feature::group());
321 return partDocument()->size(ModelAPI_ResultParameters::group());
322 case ConstructFolder:
323 return partDocument()->size(ModelAPI_ResultConstruction::group());
330 int XGUI_PartDataModel::columnCount(const QModelIndex &parent) const
335 QModelIndex XGUI_PartDataModel::index(int theRow, int theColumn, const QModelIndex &theParent) const
337 if (!theParent.isValid())
338 return createIndex(theRow, 0, (qint32) MyRoot);
340 int aId = (int)theParent.internalId();
345 return createIndex(0, 0, (qint32) ParamsFolder);
347 return createIndex(1, 0, (qint32) ConstructFolder);
349 return createIndex(2, 0, (qint32) BodiesFolder);
351 return createIndex(theRow, theColumn, (qint32) HistoryObject);
354 return createIndex(theRow, 0, (qint32) ParamObject);
355 case ConstructFolder:
356 return createIndex(theRow, 0, (qint32) ConstructObject);
358 return createIndex(theRow, 0, (qint32) BodiesObject);
360 return QModelIndex();
363 QModelIndex XGUI_PartDataModel::parent(const QModelIndex& theIndex) const
365 switch (theIndex.internalId()) {
367 return QModelIndex();
369 case ConstructFolder:
372 return createIndex(0, 0, (qint32) MyRoot);
374 return createIndex(0, 0, (qint32) ParamsFolder);
375 case ConstructObject:
376 return createIndex(1, 0, (qint32) ConstructFolder);
378 return QModelIndex();
381 bool XGUI_PartDataModel::hasChildren(const QModelIndex& theParent) const
383 return rowCount(theParent) > 0;
387 DocumentPtr XGUI_PartDataModel::partDocument() const
389 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
390 ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
391 return aObject->data()->docRef("PartDocument")->value();
394 ObjectPtr XGUI_PartDataModel::object(const QModelIndex& theIndex) const
396 switch (theIndex.internalId()) {
399 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
400 return aRootDoc->object(ModelAPI_ResultPart::group(), myId);
403 case ConstructFolder:
407 return partDocument()->object(ModelAPI_ResultParameters::group(), theIndex.row());
408 case ConstructObject:
409 return partDocument()->object(ModelAPI_ResultConstruction::group(), theIndex.row());
411 // return partDocument()->feature(ModelAPI_ResultConstruction::group(), theIndex.row());
413 return partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - 3);
418 bool XGUI_PartDataModel::hasDocument(const DocumentPtr& theDoc) const
420 return (partDocument() == theDoc);
424 QModelIndex XGUI_PartDataModel::findParent(const ObjectPtr& theObject) const
426 return findGroup(theObject->groupName().c_str());
429 QModelIndex XGUI_PartDataModel::findGroup(const std::string& theGroup) const
431 if (theGroup.compare(ModelAPI_ResultParameters::group()) == 0)
432 return createIndex(0, 0, (qint32) ParamsFolder);
433 if (theGroup.compare(ModelAPI_ResultConstruction::group()) == 0)
434 return createIndex(1, 0, (qint32) ConstructFolder);
435 return QModelIndex();
438 ObjectPtr XGUI_PartDataModel::part() const
440 DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
441 return aRootDoc->object(ModelAPI_ResultPart::group(), myId);
444 QModelIndex XGUI_PartDataModel::objectIndex(const ObjectPtr& theObject) const
448 if (part() == theObject)
451 //std::string aGroup = theFeature->getGroup();
452 DocumentPtr aDoc = theObject->document();
453 int aNb = aDoc->size(ModelAPI_Feature::group());
455 for (int i = 0; i < aNb; i++) {
456 if (aDoc->object(ModelAPI_Feature::group(), i) == theObject) {
462 return createIndex(aRow + 3, 0, (qint32) HistoryObject);
463 /* if (aGroup.compare(ModelAPI_ResultParameters::group()) == 0)
464 return createIndex(aRow, 0, (qint32) ParamObject);
465 if (aGroup.compare(ModelAPI_ResultConstruction::group()) == 0)
466 return createIndex(aRow, 0, (qint32) ConstructObject);*/