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_Data.h>
8 #include <ModelAPI_AttributeDocRef.h>
9 #include <ModelAPI_Object.h>
15 //FeaturePtr featureObj(const FeaturePtr& theFeature)
17 // ObjectPtr aObject = boost::dynamic_pointer_cast<ModelAPI_Object>(theFeature);
19 // return aObject->featureRef();
24 XGUI_TopDataModel::XGUI_TopDataModel(const DocumentPtr& theDocument, QObject* theParent)
25 : XGUI_FeaturesModel(theDocument, theParent)
29 XGUI_TopDataModel::~XGUI_TopDataModel()
34 QVariant XGUI_TopDataModel::data(const QModelIndex& theIndex, int theRole) const
39 switch (theIndex.internalId()) {
41 return tr("Parameters") + QString(" (%1)").arg(rowCount(theIndex));
44 FeaturePtr aFeature = myDocument->feature(PARAMETERS_GROUP, theIndex.row(), true);
46 return aFeature->data()->getName().c_str();
49 return tr("Constructions") + QString(" (%1)").arg(rowCount(theIndex));
52 FeaturePtr aFeature = myDocument->feature(CONSTRUCTIONS_GROUP, theIndex.row(), true);
54 return aFeature->data()->getName().c_str();
59 case Qt::DecorationRole:
61 switch (theIndex.internalId()) {
63 return QIcon(":pictures/params_folder.png");
65 return QIcon(":pictures/constr_folder.png");
68 FeaturePtr aFeature = myDocument->feature(CONSTRUCTIONS_GROUP, theIndex.row(), true);
70 return QIcon(XGUI_Workshop::featureIcon(aFeature->getKind()));
78 case Qt::ForegroundRole:
79 return QBrush(myItemsColor);
85 QVariant XGUI_TopDataModel::headerData(int section, Qt::Orientation orientation, int role) const
90 int XGUI_TopDataModel::rowCount(const QModelIndex& theParent) const
92 if (!theParent.isValid())
95 if (theParent.internalId() == ParamsFolder)
96 return myDocument->size(PARAMETERS_GROUP);
98 if (theParent.internalId() == ConstructFolder)
99 return myDocument->size(CONSTRUCTIONS_GROUP);
104 int XGUI_TopDataModel::columnCount(const QModelIndex &parent) const
109 QModelIndex XGUI_TopDataModel::index(int theRow, int theColumn, const QModelIndex& theParent) const
111 if (!theParent.isValid()) {
114 return createIndex(theRow, theColumn, (qint32) ParamsFolder);
116 return createIndex(theRow, theColumn, (qint32) ConstructFolder);
119 if (theParent.internalId() == ParamsFolder)
120 return createIndex(theRow, theColumn, (qint32) ParamObject);
122 if (theParent.internalId() == ConstructFolder)
123 return createIndex(theRow, theColumn, (qint32) ConstructObject);
125 return QModelIndex();
128 QModelIndex XGUI_TopDataModel::parent(const QModelIndex& theIndex) const
130 int aId = (int)theIndex.internalId();
133 case ConstructFolder:
134 return QModelIndex();
136 return createIndex(0, 0, (qint32) ParamsFolder);
137 case ConstructObject:
138 return createIndex(1, 0, (qint32) ConstructFolder);
140 return QModelIndex();
143 bool XGUI_TopDataModel::hasChildren(const QModelIndex& theParent) const
145 return rowCount(theParent) > 0;
148 FeaturePtr XGUI_TopDataModel::feature(const QModelIndex& theIndex) const
150 switch (theIndex.internalId()) {
152 case ConstructFolder:
155 return myDocument->feature(PARAMETERS_GROUP, theIndex.row(), true);
156 case ConstructObject:
157 return myDocument->feature(CONSTRUCTIONS_GROUP, theIndex.row(), true);
163 QModelIndex XGUI_TopDataModel::findParent(const FeaturePtr& theFeature) const
165 return findGroup(theFeature->getGroup().c_str());
168 QModelIndex XGUI_TopDataModel::findGroup(const std::string& theGroup) const
170 if (theGroup.compare(PARAMETERS_GROUP) == 0)
171 return createIndex(0, 0, (qint32) ParamsFolder);
172 if (theGroup.compare(CONSTRUCTIONS_GROUP) == 0)
173 return createIndex(1, 0, (qint32) ConstructFolder);
174 return QModelIndex();
177 QModelIndex XGUI_TopDataModel::featureIndex(const FeaturePtr& theFeature) const
181 std::string aGroup = theFeature->getGroup();
182 int aNb = myDocument->size(aGroup);
184 for (int i = 0; i < aNb; i++) {
185 if (myDocument->feature(aGroup, i, true) == theFeature) {
191 if (aGroup.compare(PARAMETERS_GROUP) == 0)
192 return createIndex(aRow, 0, (qint32) ParamObject);
193 if (aGroup.compare(CONSTRUCTIONS_GROUP) == 0)
194 return createIndex(aRow, 0, (qint32) ConstructObject);
202 //******************************************************************
203 //******************************************************************
204 //******************************************************************
205 XGUI_PartDataModel::XGUI_PartDataModel(const DocumentPtr& theDocument, QObject* theParent)
206 : XGUI_PartModel(theDocument, theParent)
211 XGUI_PartDataModel::~XGUI_PartDataModel()
215 QVariant XGUI_PartDataModel::data(const QModelIndex& theIndex, int theRole) const
218 case Qt::DisplayRole:
220 switch (theIndex.internalId()) {
223 FeaturePtr aFeature = myDocument->feature(PARTS_GROUP, myId, true);
225 return aFeature->data()->getName().c_str();
228 return tr("Parameters") + QString(" (%1)").arg(rowCount(theIndex));
229 case ConstructFolder:
230 return tr("Constructions") + QString(" (%1)").arg(rowCount(theIndex));
232 return tr("Bodies") + QString(" (%1)").arg(rowCount(theIndex));
235 FeaturePtr aFeature = featureDocument()->feature(PARAMETERS_GROUP, theIndex.row(), true);
237 return aFeature->data()->getName().c_str();
239 case ConstructObject:
241 FeaturePtr aFeature = featureDocument()->feature(CONSTRUCTIONS_GROUP, theIndex.row(), true);
243 return aFeature->data()->getName().c_str();
247 FeaturePtr aFeature = featureDocument()->feature(FEATURES_GROUP, theIndex.row() - 3, true);
249 return aFeature->data()->getName().c_str();
253 case Qt::DecorationRole:
255 switch (theIndex.internalId()) {
257 return QIcon(":pictures/part_ico.png");
259 return QIcon(":pictures/params_folder.png");
260 case ConstructFolder:
262 return QIcon(":pictures/constr_folder.png");
263 case ConstructObject:
265 FeaturePtr aFeature = featureDocument()->feature(CONSTRUCTIONS_GROUP, theIndex.row(), true);
267 return QIcon(XGUI_Workshop::featureIcon(aFeature->getKind()));
271 FeaturePtr aFeature = featureDocument()->feature(FEATURES_GROUP, theIndex.row() - 3, true);
273 return QIcon(XGUI_Workshop::featureIcon(aFeature->getKind()));
277 case Qt::ToolTipRole:
280 case Qt::ForegroundRole:
281 return QBrush(myItemsColor);
287 QVariant XGUI_PartDataModel::headerData(int section, Qt::Orientation orientation, int role) const
292 int XGUI_PartDataModel::rowCount(const QModelIndex& parent) const
294 if (!parent.isValid())
295 if (myDocument->feature(PARTS_GROUP, myId, true))
299 switch (parent.internalId()) {
301 return 3 + featureDocument()->size(FEATURES_GROUP);
303 return featureDocument()->size(PARAMETERS_GROUP);
304 case ConstructFolder:
305 return featureDocument()->size(CONSTRUCTIONS_GROUP);
312 int XGUI_PartDataModel::columnCount(const QModelIndex &parent) const
317 QModelIndex XGUI_PartDataModel::index(int theRow, int theColumn, const QModelIndex &theParent) const
319 if (!theParent.isValid())
320 return createIndex(theRow, 0, (qint32) MyRoot);
322 int aId = (int)theParent.internalId();
327 return createIndex(0, 0, (qint32) ParamsFolder);
329 return createIndex(1, 0, (qint32) ConstructFolder);
331 return createIndex(2, 0, (qint32) BodiesFolder);
333 return createIndex(theRow, theColumn, (qint32) HistoryObject);
336 return createIndex(theRow, 0, (qint32) ParamObject);
337 case ConstructFolder:
338 return createIndex(theRow, 0, (qint32) ConstructObject);
340 return createIndex(theRow, 0, (qint32) BodiesObject);
342 return QModelIndex();
345 QModelIndex XGUI_PartDataModel::parent(const QModelIndex& theIndex) const
347 switch (theIndex.internalId()) {
349 return QModelIndex();
351 case ConstructFolder:
354 return createIndex(0, 0, (qint32) MyRoot);
356 return createIndex(0, 0, (qint32) ParamsFolder);
357 case ConstructObject:
358 return createIndex(1, 0, (qint32) ConstructFolder);
360 return QModelIndex();
363 bool XGUI_PartDataModel::hasChildren(const QModelIndex& theParent) const
365 return rowCount(theParent) > 0;
369 DocumentPtr XGUI_PartDataModel::featureDocument() const
371 FeaturePtr aFeature = myDocument->feature(PARTS_GROUP, myId, true);
372 return aFeature->data()->docRef("PartDocument")->value();
375 FeaturePtr XGUI_PartDataModel::feature(const QModelIndex& theIndex) const
377 switch (theIndex.internalId()) {
379 if (theIndex.row() < 3) {
380 return myDocument->feature(PARTS_GROUP, myId, true);
382 return featureDocument()->feature(FEATURES_GROUP, theIndex.row() - 3, true);
384 case ConstructFolder:
388 return featureDocument()->feature(PARAMETERS_GROUP, theIndex.row(), true);
389 case ConstructObject:
390 return featureDocument()->feature(CONSTRUCTIONS_GROUP, theIndex.row(), true);
392 // return featureDocument()->feature(CONSTRUCTIONS_GROUP, theIndex.row(), true);
397 bool XGUI_PartDataModel::hasDocument(const DocumentPtr& theDoc) const
399 return (featureDocument() == theDoc);
403 QModelIndex XGUI_PartDataModel::findParent(const FeaturePtr& theFeature) const
405 return findGroup(theFeature->getGroup().c_str());
408 QModelIndex XGUI_PartDataModel::findGroup(const std::string& theGroup) const
410 if (theGroup.compare(PARAMETERS_GROUP) == 0)
411 return createIndex(0, 0, (qint32) ParamsFolder);
412 if (theGroup.compare(CONSTRUCTIONS_GROUP) == 0)
413 return createIndex(1, 0, (qint32) ConstructFolder);
414 return QModelIndex();
417 FeaturePtr XGUI_PartDataModel::part() const
419 return myDocument->feature(PARTS_GROUP, myId, true);
422 QModelIndex XGUI_PartDataModel::featureIndex(const FeaturePtr& theFeature) const
426 if (part() == theFeature)
429 std::string aGroup = theFeature->getGroup();
430 int aNb = myDocument->size(aGroup);
432 for (int i = 0; i < aNb; i++) {
433 if (myDocument->feature(aGroup, i, true) == theFeature) {
439 if (aGroup.compare(PARAMETERS_GROUP) == 0)
440 return createIndex(aRow, 0, (qint32) ParamObject);
441 if (aGroup.compare(CONSTRUCTIONS_GROUP) == 0)
442 return createIndex(aRow, 0, (qint32) ConstructObject);