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 = featureObj(myDocument->feature(PARAMETERS_GROUP, theIndex.row()));
46 return aFeature->data()->getName().c_str();
49 return tr("Constructions") + QString(" (%1)").arg(rowCount(theIndex));
52 FeaturePtr aFeature = featureObj(myDocument->feature(CONSTRUCTIONS_GROUP, theIndex.row()));
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 = featureObj(myDocument->feature(CONSTRUCTIONS_GROUP, theIndex.row()));
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 featureObj(myDocument->feature(PARAMETERS_GROUP, theIndex.row()));
156 case ConstructObject:
157 return featureObj(myDocument->feature(CONSTRUCTIONS_GROUP, theIndex.row()));
163 QModelIndex XGUI_TopDataModel::findParent(const FeaturePtr& theFeature) const
165 QString aGroup(theFeature->getGroup().c_str());
167 if (theFeature->getGroup().compare(PARAMETERS_GROUP) == 0)
168 return createIndex(0, 0, (qint32) ParamsFolder);
169 if (theFeature->getGroup().compare(CONSTRUCTIONS_GROUP) == 0)
170 return createIndex(1, 0, (qint32) ConstructFolder);
171 return QModelIndex();
174 QModelIndex XGUI_TopDataModel::findGroup(const std::string& theGroup) const
176 if (theGroup.compare(PARAMETERS_GROUP) == 0)
177 return createIndex(0, 0, (qint32) ParamsFolder);
178 if (theGroup.compare(CONSTRUCTIONS_GROUP) == 0)
179 return createIndex(1, 0, (qint32) ConstructFolder);
180 return QModelIndex();
184 //******************************************************************
185 //******************************************************************
186 //******************************************************************
187 XGUI_PartDataModel::XGUI_PartDataModel(const DocumentPtr& theDocument, QObject* theParent)
188 : XGUI_PartModel(theDocument, theParent)
193 XGUI_PartDataModel::~XGUI_PartDataModel()
197 QVariant XGUI_PartDataModel::data(const QModelIndex& theIndex, int theRole) const
200 case Qt::DisplayRole:
202 switch (theIndex.internalId()) {
205 FeaturePtr aFeature = featureObj(myDocument->feature(PARTS_GROUP, myId));
207 return aFeature->data()->getName().c_str();
210 return tr("Parameters") + QString(" (%1)").arg(rowCount(theIndex));
211 case ConstructFolder:
212 return tr("Constructions") + QString(" (%1)").arg(rowCount(theIndex));
214 return tr("Bodies") + QString(" (%1)").arg(rowCount(theIndex));
217 FeaturePtr aFeature = featureObj(featureDocument()->feature(PARAMETERS_GROUP, theIndex.row()));
219 return aFeature->data()->getName().c_str();
221 case ConstructObject:
223 FeaturePtr aFeature = featureObj(featureDocument()->feature(CONSTRUCTIONS_GROUP, theIndex.row()));
225 return aFeature->data()->getName().c_str();
229 FeaturePtr aFeature = featureObj(featureDocument()->feature(FEATURES_GROUP, theIndex.row() - 3));
231 return aFeature->data()->getName().c_str();
235 case Qt::DecorationRole:
237 switch (theIndex.internalId()) {
239 return QIcon(":pictures/part_ico.png");
241 return QIcon(":pictures/params_folder.png");
242 case ConstructFolder:
244 return QIcon(":pictures/constr_folder.png");
245 case ConstructObject:
247 FeaturePtr aFeature = featureObj(featureDocument()->feature(CONSTRUCTIONS_GROUP, theIndex.row()));
249 return QIcon(XGUI_Workshop::featureIcon(aFeature->getKind()));
253 FeaturePtr aFeature = featureDocument()->feature(FEATURES_GROUP, theIndex.row() - 3);
255 return QIcon(XGUI_Workshop::featureIcon(aFeature->getKind()));
259 case Qt::ToolTipRole:
262 case Qt::ForegroundRole:
263 return QBrush(myItemsColor);
269 QVariant XGUI_PartDataModel::headerData(int section, Qt::Orientation orientation, int role) const
274 int XGUI_PartDataModel::rowCount(const QModelIndex& parent) const
276 if (!parent.isValid())
277 if (myDocument->feature(PARTS_GROUP, myId))
281 switch (parent.internalId()) {
283 return 3 + featureDocument()->size(FEATURES_GROUP);
285 return featureDocument()->size(PARAMETERS_GROUP);
286 case ConstructFolder:
287 return featureDocument()->size(CONSTRUCTIONS_GROUP);
294 int XGUI_PartDataModel::columnCount(const QModelIndex &parent) const
299 QModelIndex XGUI_PartDataModel::index(int theRow, int theColumn, const QModelIndex &theParent) const
301 if (!theParent.isValid())
302 return createIndex(theRow, 0, (qint32) MyRoot);
304 int aId = (int)theParent.internalId();
309 return createIndex(0, 0, (qint32) ParamsFolder);
311 return createIndex(1, 0, (qint32) ConstructFolder);
313 return createIndex(2, 0, (qint32) BodiesFolder);
315 return createIndex(theRow, theColumn, (qint32) HistoryObject);
318 return createIndex(theRow, 0, (qint32) ParamObject);
319 case ConstructFolder:
320 return createIndex(theRow, 0, (qint32) ConstructObject);
322 return createIndex(theRow, 0, (qint32) BodieswObject);
324 return QModelIndex();
327 QModelIndex XGUI_PartDataModel::parent(const QModelIndex& theIndex) const
329 switch (theIndex.internalId()) {
331 return QModelIndex();
333 case ConstructFolder:
336 return createIndex(0, 0, (qint32) MyRoot);
338 return createIndex(0, 0, (qint32) ParamsFolder);
339 case ConstructObject:
340 return createIndex(1, 0, (qint32) ConstructFolder);
342 return QModelIndex();
345 bool XGUI_PartDataModel::hasChildren(const QModelIndex& theParent) const
347 return rowCount(theParent) > 0;
351 DocumentPtr XGUI_PartDataModel::featureDocument() const
353 FeaturePtr aFeature = featureObj(myDocument->feature(PARTS_GROUP, myId));
354 return aFeature->data()->docRef("PartDocument")->value();
357 FeaturePtr XGUI_PartDataModel::feature(const QModelIndex& theIndex) const
359 switch (theIndex.internalId()) {
361 if (theIndex.row() < 3) {
362 return featureObj(myDocument->feature(PARTS_GROUP, myId));
364 return featureDocument()->feature(FEATURES_GROUP, theIndex.row() - 3);
366 case ConstructFolder:
369 return featureObj(featureDocument()->feature(PARAMETERS_GROUP, theIndex.row()));
370 case ConstructObject:
371 return featureObj(featureDocument()->feature(CONSTRUCTIONS_GROUP, theIndex.row()));
376 bool XGUI_PartDataModel::hasDocument(const DocumentPtr& theDoc) const
378 return (featureDocument() == theDoc);
382 QModelIndex XGUI_PartDataModel::findParent(const FeaturePtr& theFeature) const
384 QString aGroup(theFeature->getGroup().c_str());
386 if (theFeature->getGroup().compare(PARAMETERS_GROUP) == 0)
387 return createIndex(0, 0, (qint32) ParamsFolder);
388 if (theFeature->getGroup().compare(CONSTRUCTIONS_GROUP) == 0)
389 return createIndex(1, 0, (qint32) ConstructFolder);
390 return QModelIndex();
393 QModelIndex XGUI_PartDataModel::findGroup(const std::string& theGroup) const
395 if (theGroup.compare(PARAMETERS_GROUP) == 0)
396 return createIndex(0, 0, (qint32) ParamsFolder);
397 if (theGroup.compare(CONSTRUCTIONS_GROUP) == 0)
398 return createIndex(1, 0, (qint32) ConstructFolder);
399 return QModelIndex();
402 FeaturePtr XGUI_PartDataModel::part() const
404 return featureObj(myDocument->feature(PARTS_GROUP, myId));