Salome HOME
Support of additional attributes if ModelWidget and features
[modules/shaper.git] / src / PartSet / PartSet_TopDataModel.cpp
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D -->
2
3 #include "PartSet_TopDataModel.h"
4 #include "PartSet_Module.h"
5 #include "PartSet_DocumentDataModel.h"
6
7 #include <ModelAPI_Session.h>
8 #include <ModelAPI_Document.h>
9 #include <ModelAPI_Feature.h>
10 #include <ModelAPI_Result.h>
11 #include <ModelAPI_Data.h>
12 #include <ModelAPI_AttributeDocRef.h>
13 #include <ModelAPI_Object.h>
14 #include <ModelAPI_ResultPart.h>
15 #include <ModelAPI_ResultConstruction.h>
16 #include <ModelAPI_ResultParameter.h>
17 #include <ModelAPI_ResultBody.h>
18 #include <ModelAPI_ResultGroup.h>
19 #include <ModelAPI_AttributeDouble.h>
20 #include <ModelAPI_Events.h>
21
22 #include <Events_Loop.h>
23
24 #include <QIcon>
25 #include <QBrush>
26
27
28 PartSet_TopDataModel::PartSet_TopDataModel(QObject* theParent)
29     : PartSet_FeaturesModel(theParent)
30 {
31 }
32
33 PartSet_TopDataModel::~PartSet_TopDataModel()
34 {
35 }
36
37 QVariant PartSet_TopDataModel::data(const QModelIndex& theIndex, int theRole) const
38 {
39   if (theIndex.column() == 1)
40     return QVariant();
41
42   switch (theRole) {
43     case Qt::DisplayRole:
44       // return a name
45       switch (theIndex.internalId()) {
46         case ParamsFolder:
47           return tr("Parameters") + QString(" (%1)").arg(rowCount(theIndex));
48         case ParamObject: {
49           DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
50           ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultParameter::group(), theIndex.row());
51           if (aObject) {
52             ResultParameterPtr aParam = std::dynamic_pointer_cast<ModelAPI_ResultParameter>(aObject);
53             AttributeDoublePtr aValueAttribute = aParam->data()->real(ModelAPI_ResultParameter::VALUE());
54             QString aVal = QString::number(aValueAttribute->value());
55             QString aTitle = QString(aObject->data()->name().c_str());
56             return aTitle + " = " + aVal;
57           }
58         }
59           break;
60         case ConstructFolder:
61           return tr("Constructions") + QString(" (%1)").arg(rowCount(theIndex));
62         case ConstructObject: {
63           DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
64           ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultConstruction::group(),
65                                                theIndex.row());
66           if (aObject)
67             return aObject->data()->name().c_str();
68         }
69           break;
70         //case GroupsFolder:
71         //  return tr("Groups") + QString(" (%1)").arg(rowCount(theIndex));
72         //case GroupObject: {
73         //  DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
74         //  ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultGroup::group(),
75         //                                       theIndex.row());
76         //  if (aObject)
77         //    return aObject->data()->name().c_str();
78         //}
79         //  break;
80       }
81       break;
82
83     case Qt::DecorationRole:
84       {
85       // return an Icon
86       switch (theIndex.internalId()) {
87         case ParamsFolder:
88           return QIcon(":pictures/params_folder.png");
89         case ConstructFolder:
90           return QIcon(":pictures/constr_folder.png");
91         case ConstructObject:
92           return QIcon(":pictures/constr_object.png");
93         //case GroupsFolder:
94         //  return QIcon(":pictures/constr_folder.png");
95         }
96       }
97       break;
98
99     case Qt::ToolTipRole:
100       // return Tooltip
101       break;
102     case Qt::ForegroundRole:
103       return QBrush(myItemsColor);
104       break;
105   }
106   return QVariant();
107 }
108
109 QVariant PartSet_TopDataModel::headerData(int section, Qt::Orientation orientation, int role) const
110 {
111   return QVariant();
112 }
113
114 int PartSet_TopDataModel::rowCount(const QModelIndex& theParent) const
115 {
116   if (!theParent.isValid())
117     return 2;  // In case of groups using it has to be +1
118
119   DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
120   if (theParent.internalId() == ParamsFolder)
121     return aRootDoc->size(ModelAPI_ResultParameter::group());
122
123   if (theParent.internalId() == ConstructFolder)
124     return aRootDoc->size(ModelAPI_ResultConstruction::group());
125
126   //if (theParent.internalId() == GroupsFolder)
127   //  return aRootDoc->size(ModelAPI_ResultGroup::group());
128
129   return 0;
130 }
131
132 int PartSet_TopDataModel::columnCount(const QModelIndex &parent) const
133 {
134   return 1;
135 }
136
137 QModelIndex PartSet_TopDataModel::index(int theRow, int theColumn, const QModelIndex& theParent) const
138 {
139   if (!theParent.isValid()) {
140     switch (theRow) {
141       case 0:
142         return createIndex(theRow, theColumn, (qint32) ParamsFolder);
143       case 1:
144         return createIndex(theRow, theColumn, (qint32) ConstructFolder);
145       //case 2:
146       //  return createIndex(theRow, theColumn, (qint32) GroupsFolder);
147     }
148   } else {
149     if (theParent.internalId() == ParamsFolder)
150       return createIndex(theRow, theColumn, (qint32) ParamObject);
151
152     if (theParent.internalId() == ConstructFolder)
153       return createIndex(theRow, theColumn, (qint32) ConstructObject);
154
155     //if (theParent.internalId() == GroupsFolder)
156     //  return createIndex(theRow, theColumn, (qint32) GroupObject);
157   }
158   return QModelIndex();
159 }
160
161 QModelIndex PartSet_TopDataModel::parent(const QModelIndex& theIndex) const
162 {
163   int aId = (int) theIndex.internalId();
164   switch (aId) {
165     case ParamsFolder:
166     case ConstructFolder:
167     //case GroupsFolder:
168       return QModelIndex();
169     case ParamObject:
170       return createIndex(0, 0, (qint32) ParamsFolder);
171     case ConstructObject:
172       return createIndex(1, 0, (qint32) ConstructFolder);
173     //case GroupObject:
174     //  return createIndex(2, 0, (qint32) GroupsFolder);
175   }
176   return QModelIndex();
177 }
178
179 bool PartSet_TopDataModel::hasChildren(const QModelIndex& theParent) const
180 {
181   return rowCount(theParent) > 0;
182 }
183
184 ObjectPtr PartSet_TopDataModel::object(const QModelIndex& theIndex) const
185 {
186   switch (theIndex.internalId()) {
187     case ParamsFolder:
188     case ConstructFolder:
189       return ObjectPtr();
190     case ParamObject: {
191       DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
192       return aRootDoc->object(ModelAPI_ResultParameter::group(), theIndex.row());
193     }
194     case ConstructObject: {
195       DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
196       return aRootDoc->object(ModelAPI_ResultConstruction::group(), theIndex.row());
197     }
198     //case GroupObject: {
199     //  DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
200     //  return aRootDoc->object(ModelAPI_ResultGroup::group(), theIndex.row());
201     //}
202   }
203   return ObjectPtr();
204 }
205
206 QModelIndex PartSet_TopDataModel::findParent(const ObjectPtr& theObject) const
207 {
208   return findGroup(theObject->groupName().c_str());
209 }
210
211 QModelIndex PartSet_TopDataModel::findGroup(const std::string& theGroup) const
212 {
213   if (theGroup == ModelAPI_ResultParameter::group())
214     return createIndex(0, 0, (qint32) ParamsFolder);
215   if (theGroup == ModelAPI_ResultConstruction::group())
216     return createIndex(1, 0, (qint32) ConstructFolder);
217   //if (theGroup == ModelAPI_ResultGroup::group())
218   //  return createIndex(2, 0, (qint32) ConstructFolder);
219   return QModelIndex();
220 }
221
222 QModelIndex PartSet_TopDataModel::objectIndex(const ObjectPtr& theObject) const
223 {
224   QModelIndex aIndex;
225   if (theObject) {
226     DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument();
227     std::string aGroup = theObject->groupName();
228     int aNb = aRootDoc->size(aGroup);
229     int aRow = -1;
230     for (int i = 0; i < aNb; i++) {
231       if (aRootDoc->object(aGroup, i) == theObject) {
232         aRow = i;
233         break;
234       }
235     }
236     if (aRow != -1) {
237       if (aGroup == ModelAPI_ResultParameter::group())
238         return createIndex(aRow, 0, (qint32) ParamObject);
239       if (aGroup == ModelAPI_ResultConstruction::group())
240         return createIndex(aRow, 0, (qint32) ConstructObject);
241       //if (aGroup == ModelAPI_ResultGroup::group())
242       //  return createIndex(aRow, 0, (qint32) GroupObject);
243     }
244   }
245   return aIndex;
246 }
247