#include "XGUI_PartDataModel.h"
+#include "XGUI_Workshop.h"
#include <ModelAPI_PluginManager.h>
-#include <ModelAPI_Iterator.h>
#include <ModelAPI_Document.h>
#include <ModelAPI_Feature.h>
-#include <ModelAPI_Object.h>
+#include <ModelAPI_Result.h>
+#include <ModelAPI_Data.h>
#include <ModelAPI_AttributeDocRef.h>
+#include <ModelAPI_Object.h>
+#include <ModelAPI_ResultPart.h>
+#include <ModelAPI_ResultConstruction.h>
+#include <ModelAPI_ResultParameters.h>
+#include <ModelAPI_ResultBody.h>
#include <QIcon>
+#include <QBrush>
+
+
+//ObjectPtr featureObj(const ObjectPtr& theFeature)
+//{
+// ObjectPtr aObject = boost::dynamic_pointer_cast<ModelAPI_Object>(theFeature);
+// if (aObject)
+// return aObject->featureRef();
+// return theFeature;
+//}
-XGUI_TopDataModel::XGUI_TopDataModel(const std::shared_ptr<ModelAPI_Document>& theDocument, QObject* theParent)
- : XGUI_FeaturesModel(theDocument, theParent)
+
+XGUI_TopDataModel::XGUI_TopDataModel(QObject* theParent)
+ : XGUI_FeaturesModel(theParent)
{
}
// return a name
switch (theIndex.internalId()) {
case ParamsFolder:
- return tr("Parameters");
+ return tr("Parameters") + QString(" (%1)").arg(rowCount(theIndex));
case ParamObject:
{
- std::shared_ptr<ModelAPI_Feature> aFeature = myDocument->feature(PARAMETERS_GROUP, theIndex.row());
- return aFeature->data()->getName().c_str();
+ DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
+ ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultParameters::group(), theIndex.row());
+ if (aObject)
+ return aObject->data()->name().c_str();
}
+ break;
case ConstructFolder:
- return tr("Constructions");
+ return tr("Constructions") + QString(" (%1)").arg(rowCount(theIndex));
case ConstructObject:
{
- std::shared_ptr<ModelAPI_Feature> aFeature = myDocument->feature(CONSTRUCTIONS_GROUP, theIndex.row());
- return aFeature->data()->getName().c_str();
+ DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
+ ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultConstruction::group(), theIndex.row());
+ if (aObject)
+ return aObject->data()->name().c_str();
+ }
+ break;
+ case BodiesFolder:
+ return tr("Bodies") + QString(" (%1)").arg(rowCount(theIndex));
+ case BodiesObject:
+ {
+ DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
+ ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultBody::group(), theIndex.row());
+ if (aObject)
+ return aObject->data()->name().c_str();
}
}
break;
// return an Icon
switch (theIndex.internalId()) {
case ParamsFolder:
- return QIcon(":pictures/params_folder.png");
+ return QIcon(":pictures/params_folder.png");
+ case BodiesFolder:
case ConstructFolder:
- return QIcon(":pictures/constr_folder.png");
+ return QIcon(":pictures/constr_folder.png");
case ConstructObject:
- return QIcon(":pictures/point_ico.png");
+ case BodiesObject:
+ return QIcon(":pictures/constr_object.png");
}
break;
case Qt::ToolTipRole:
// return Tooltip
break;
+ case Qt::ForegroundRole:
+ return QBrush(myItemsColor);
+ break;
}
return QVariant();
}
int XGUI_TopDataModel::rowCount(const QModelIndex& theParent) const
{
if (!theParent.isValid())
- return 2;
+ return 3;
+ DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
if (theParent.internalId() == ParamsFolder)
- return myDocument->featuresIterator(PARAMETERS_GROUP)->numIterationsLeft();
+ return aRootDoc->size(ModelAPI_ResultParameters::group());
if (theParent.internalId() == ConstructFolder)
- return myDocument->featuresIterator(CONSTRUCTIONS_GROUP)->numIterationsLeft();
+ return aRootDoc->size(ModelAPI_ResultConstruction::group());
+ if (theParent.internalId() == BodiesFolder)
+ return aRootDoc->size(ModelAPI_ResultBody::group());
return 0;
}
if (!theParent.isValid()) {
switch (theRow) {
case 0:
- return createIndex(theRow, theColumn, (quintptr) ParamsFolder);
+ return createIndex(theRow, theColumn, (qint32) ParamsFolder);
case 1:
- return createIndex(theRow, theColumn, (quintptr) ConstructFolder);
+ return createIndex(theRow, theColumn, (qint32) ConstructFolder);
+ case 2:
+ return createIndex(theRow, theColumn, (qint32) BodiesFolder);
}
} else {
if (theParent.internalId() == ParamsFolder)
- return createIndex(theRow, theColumn, (quintptr) ParamObject);
+ return createIndex(theRow, theColumn, (qint32) ParamObject);
if (theParent.internalId() == ConstructFolder)
- return createIndex(theRow, theColumn, (quintptr) ConstructObject);
+ return createIndex(theRow, theColumn, (qint32) ConstructObject);
+
+ if (theParent.internalId() == BodiesFolder)
+ return createIndex(theRow, theColumn, (qint32) BodiesObject);
}
return QModelIndex();
}
switch (aId) {
case ParamsFolder:
case ConstructFolder:
+ case BodiesFolder:
return QModelIndex();
case ParamObject:
- return createIndex(0, 0, (quintptr) ParamsFolder);
+ return createIndex(0, 0, (qint32) ParamsFolder);
case ConstructObject:
- return createIndex(1, 0, (quintptr) ConstructFolder);
+ return createIndex(1, 0, (qint32) ConstructFolder);
+ case BodiesObject:
+ return createIndex(2, 0, (qint32) BodiesFolder);
}
return QModelIndex();
}
return rowCount(theParent) > 0;
}
-FeaturePtr XGUI_TopDataModel::feature(const QModelIndex& theIndex) const
+ObjectPtr XGUI_TopDataModel::object(const QModelIndex& theIndex) const
{
switch (theIndex.internalId()) {
case ParamsFolder:
case ConstructFolder:
- return 0;
+ case BodiesFolder:
+ return ObjectPtr();
case ParamObject:
- return myDocument->feature(PARAMETERS_GROUP, theIndex.row());
+ {
+ DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
+ return aRootDoc->object(ModelAPI_ResultParameters::group(), theIndex.row());
+ }
case ConstructObject:
- return myDocument->feature(CONSTRUCTIONS_GROUP, theIndex.row());
+ {
+ DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
+ return aRootDoc->object(ModelAPI_ResultConstruction::group(), theIndex.row());
+ }
+ case BodiesObject:
+ {
+ DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
+ return aRootDoc->object(ModelAPI_ResultBody::group(), theIndex.row());
+ }
}
- return 0;
+ return ObjectPtr();
}
+QModelIndex XGUI_TopDataModel::findParent(const ObjectPtr& theObject) const
+{
+ return findGroup(theObject->groupName().c_str());
+}
+
+QModelIndex XGUI_TopDataModel::findGroup(const std::string& theGroup) const
+{
+ if (theGroup == ModelAPI_ResultParameters::group())
+ return createIndex(0, 0, (qint32) ParamsFolder);
+ if (theGroup == ModelAPI_ResultConstruction::group())
+ return createIndex(1, 0, (qint32) ConstructFolder);
+ if (theGroup == ModelAPI_ResultBody::group())
+ return createIndex(2, 0, (qint32) BodiesFolder);
+ return QModelIndex();
+}
+
+QModelIndex XGUI_TopDataModel::objectIndex(const ObjectPtr& theObject) const
+{
+ QModelIndex aIndex;
+ if (theObject) {
+ DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
+ std::string aGroup = theObject->groupName();
+ int aNb = aRootDoc->size(aGroup);
+ int aRow = -1;
+ for (int i = 0; i < aNb; i++) {
+ if (aRootDoc->object(aGroup, i) == theObject) {
+ aRow = i;
+ break;
+ }
+ }
+ if (aRow != -1) {
+ if (aGroup == ModelAPI_ResultParameters::group())
+ return createIndex(aRow, 0, (qint32) ParamObject);
+ if (aGroup == ModelAPI_ResultConstruction::group())
+ return createIndex(aRow, 0, (qint32) ConstructObject);
+ if (aGroup == ModelAPI_ResultBody::group())
+ return createIndex(aRow, 0, (qint32) BodiesObject);
+ }
+ }
+ return aIndex;
+}
+
+
+
//******************************************************************
//******************************************************************
//******************************************************************
-XGUI_PartDataModel::XGUI_PartDataModel(const std::shared_ptr<ModelAPI_Document>& theDocument, QObject* theParent)
- : XGUI_PartModel(theDocument, theParent)
+XGUI_PartDataModel::XGUI_PartDataModel(QObject* theParent)
+ : XGUI_PartModel(theParent)
{
}
switch (theIndex.internalId()) {
case MyRoot:
{
- std::shared_ptr<ModelAPI_Feature> aFeature = myDocument->feature(PARTS_GROUP, myId);
- return aFeature->data()->getName().c_str();
+ DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
+ ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
+ if (aObject)
+ return boost::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
}
case ParamsFolder:
- return tr("Parameters");
+ return tr("Parameters") + QString(" (%1)").arg(rowCount(theIndex));
case ConstructFolder:
- return tr("Constructions");
+ return tr("Constructions") + QString(" (%1)").arg(rowCount(theIndex));
+ case BodiesFolder:
+ return tr("Bodies") + QString(" (%1)").arg(rowCount(theIndex));
case ParamObject:
{
- std::shared_ptr<ModelAPI_Feature> aFeature =
- featureDocument()->feature(PARAMETERS_GROUP, theIndex.row());
- return aFeature->data()->getName().c_str();
+ ObjectPtr aObject = partDocument()->object(ModelAPI_ResultParameters::group(), theIndex.row());
+ if (aObject)
+ return boost::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
}
case ConstructObject:
{
- std::shared_ptr<ModelAPI_Feature> aFeature =
- featureDocument()->feature(CONSTRUCTIONS_GROUP, theIndex.row());
- return aFeature->data()->getName().c_str();
+ ObjectPtr aObject = partDocument()->object(ModelAPI_ResultConstruction::group(), theIndex.row());
+ if (aObject)
+ return boost::dynamic_pointer_cast<ModelAPI_Object>(aObject)->data()->name().c_str();
+ }
+ case BodiesObject:
+ {
+ ObjectPtr aObject = partDocument()->object(ModelAPI_ResultBody::group(), theIndex.row());
+ if (aObject)
+ return aObject->data()->name().c_str();
+ }
+ case HistoryObject:
+ {
+ ObjectPtr aObject = partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - 3);
+ if (aObject)
+ return aObject->data()->name().c_str();
}
}
break;
case ParamsFolder:
return QIcon(":pictures/params_folder.png");
case ConstructFolder:
+ case BodiesFolder:
return QIcon(":pictures/constr_folder.png");
case ConstructObject:
- return QIcon(":pictures/point_ico.png");
+ case BodiesObject:
+ return QIcon(":pictures/constr_object.png");
+ case HistoryObject:
+ {
+ ObjectPtr aObject = partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - 3);
+ FeaturePtr aFeature = boost::dynamic_pointer_cast<ModelAPI_Feature>(aObject);
+ if (aFeature)
+ return QIcon(XGUI_Workshop::featureIcon(aFeature->getKind()));
+ }
}
break;
case Qt::ToolTipRole:
// return Tooltip
break;
+ case Qt::ForegroundRole:
+ return QBrush(myItemsColor);
+ break;
}
return QVariant();
}
int XGUI_PartDataModel::rowCount(const QModelIndex& parent) const
{
- if (!parent.isValid())
- if (myDocument->feature(PARTS_GROUP, myId))
+ if (!parent.isValid()) {
+ DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
+ if (aRootDoc->object(ModelAPI_ResultPart::group(), myId))
return 1;
else
return 0;
+ }
switch (parent.internalId()) {
case MyRoot:
- return 2;
+ return 3 + partDocument()->size(ModelAPI_Feature::group());
case ParamsFolder:
- return featureDocument()->featuresIterator(PARAMETERS_GROUP)->numIterationsLeft();
+ return partDocument()->size(ModelAPI_ResultParameters::group());
case ConstructFolder:
- return featureDocument()->featuresIterator(CONSTRUCTIONS_GROUP)->numIterationsLeft();
+ return partDocument()->size(ModelAPI_ResultConstruction::group());
+ case BodiesFolder:
+ return partDocument()->size(ModelAPI_ResultBody::group());
}
return 0;
}
QModelIndex XGUI_PartDataModel::index(int theRow, int theColumn, const QModelIndex &theParent) const
{
if (!theParent.isValid())
- return createIndex(theRow, 0, (quintptr) MyRoot);
+ return createIndex(theRow, 0, (qint32) MyRoot);
int aId = (int)theParent.internalId();
switch (aId) {
case MyRoot:
switch (theRow) {
case 0:
- return createIndex(0, 0, (quintptr) ParamsFolder);
+ return createIndex(0, 0, (qint32) ParamsFolder);
case 1:
- return createIndex(1, 0, (quintptr) ConstructFolder);
+ return createIndex(1, 0, (qint32) ConstructFolder);
+ case 2:
+ return createIndex(2, 0, (qint32) BodiesFolder);
+ default:
+ return createIndex(theRow, theColumn, (qint32) HistoryObject);
}
case ParamsFolder:
- return createIndex(theRow, 0, (quintptr) ParamObject);
+ return createIndex(theRow, 0, (qint32) ParamObject);
case ConstructFolder:
- return createIndex(theRow, 0, (quintptr) ConstructObject);
+ return createIndex(theRow, 0, (qint32) ConstructObject);
+ case BodiesFolder:
+ return createIndex(theRow, 0, (qint32) BodiesObject);
}
return QModelIndex();
}
return QModelIndex();
case ParamsFolder:
case ConstructFolder:
- return createIndex(0, 0, (quintptr) MyRoot);
+ case BodiesFolder:
+ case HistoryObject:
+ return createIndex(0, 0, (qint32) MyRoot);
case ParamObject:
- return createIndex(0, 0, (quintptr) ParamsFolder);
+ return createIndex(0, 0, (qint32) ParamsFolder);
case ConstructObject:
- return createIndex(1, 0, (quintptr) ConstructFolder);
+ return createIndex(1, 0, (qint32) ConstructFolder);
+ case BodiesObject:
+ return createIndex(2, 0, (qint32) BodiesFolder);
}
return QModelIndex();
}
}
-std::shared_ptr<ModelAPI_Document> XGUI_PartDataModel::featureDocument() const
+DocumentPtr XGUI_PartDataModel::partDocument() const
{
- std::shared_ptr<ModelAPI_Feature> aFeature = myDocument->feature(PARTS_GROUP, myId);
- return aFeature->data()->docRef("PartDocument")->value();
+ DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
+ ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
+ ResultPartPtr aPart = boost::dynamic_pointer_cast<ModelAPI_ResultPart>(aObject);
+ return aPart->partDoc();
}
-
-FeaturePtr XGUI_PartDataModel::feature(const QModelIndex& theIndex) const
+
+ObjectPtr XGUI_PartDataModel::object(const QModelIndex& theIndex) const
{
switch (theIndex.internalId()) {
case MyRoot:
- return myDocument->feature(PARTS_GROUP, myId);
+ {
+ DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
+ return aRootDoc->object(ModelAPI_ResultPart::group(), myId);
+ }
case ParamsFolder:
case ConstructFolder:
- return 0;
+ case BodiesFolder:
+ return ObjectPtr();
case ParamObject:
- return featureDocument()->feature(PARAMETERS_GROUP, theIndex.row());
+ return partDocument()->object(ModelAPI_ResultParameters::group(), theIndex.row());
case ConstructObject:
- return featureDocument()->feature(CONSTRUCTIONS_GROUP, theIndex.row());
+ return partDocument()->object(ModelAPI_ResultConstruction::group(), theIndex.row());
+ case BodiesObject:
+ return partDocument()->object(ModelAPI_ResultBody::group(), theIndex.row());
+ case HistoryObject:
+ return partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - 3);
}
- return 0;
+ return ObjectPtr();
+}
+
+bool XGUI_PartDataModel::hasDocument(const DocumentPtr& theDoc) const
+{
+ return (partDocument() == theDoc);
+}
+
+
+QModelIndex XGUI_PartDataModel::findParent(const ObjectPtr& theObject) const
+{
+ return findGroup(theObject->groupName().c_str());
+}
+
+QModelIndex XGUI_PartDataModel::findGroup(const std::string& theGroup) const
+{
+ if (theGroup.compare(ModelAPI_ResultParameters::group()) == 0)
+ return createIndex(0, 0, (qint32) ParamsFolder);
+ if (theGroup.compare(ModelAPI_ResultConstruction::group()) == 0)
+ return createIndex(1, 0, (qint32) ConstructFolder);
+ if (theGroup.compare(ModelAPI_ResultBody::group()) == 0)
+ return createIndex(2, 0, (qint32) BodiesFolder);
+ return QModelIndex();
+}
+
+ResultPartPtr XGUI_PartDataModel::part() const
+{
+ DocumentPtr aRootDoc = ModelAPI_PluginManager::get()->rootDocument();
+ ObjectPtr aObj = aRootDoc->object(ModelAPI_ResultPart::group(), myId);
+ return boost::dynamic_pointer_cast<ModelAPI_ResultPart>(aObj);
+}
+
+QModelIndex XGUI_PartDataModel::objectIndex(const ObjectPtr& theObject) const
+{
+ QModelIndex aIndex;
+ if (theObject) {
+ if (part() == theObject)
+ return aIndex;
+
+ std::string aGroup = theObject->groupName();
+ DocumentPtr aDoc = theObject->document();
+ int aNb = aDoc->size(aGroup);
+ int aRow = -1;
+ for (int i = 0; i < aNb; i++) {
+ if (aDoc->object(aGroup, i) == theObject) {
+ aRow = i;
+ break;
+ }
+ }
+ if (aRow == -1)
+ return aIndex;
+ if (aGroup == ModelAPI_ResultParameters::group())
+ return createIndex(aRow, 0, (qint32) ParamObject);
+ else if (aGroup == ModelAPI_ResultConstruction::group())
+ return createIndex(aRow, 0, (qint32) ConstructObject);
+ else if (aGroup == ModelAPI_ResultBody::group())
+ return createIndex(aRow, 0, (qint32) BodiesObject);
+ else
+ return createIndex(aRow + 3, 0, (qint32) HistoryObject);
+ }
+ return aIndex;
}