X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_PartDataModel.cpp;h=c180617e72fafede6bdf045c00a32e867b7c64b0;hb=ed165fd07e71c11885fdc5f475a8522a5914e00d;hp=4f8423f467634fcd188ac81f492b49879251e2af;hpb=00740b42f9c46511b2c880857372e37195cae304;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_PartDataModel.cpp b/src/XGUI/XGUI_PartDataModel.cpp index 4f8423f46..c180617e7 100644 --- a/src/XGUI/XGUI_PartDataModel.cpp +++ b/src/XGUI/XGUI_PartDataModel.cpp @@ -1,62 +1,86 @@ #include "XGUI_PartDataModel.h" +#include "XGUI_Workshop.h" -#include -#include +#include #include #include -#include +#include +#include #include +#include +#include +#include +#include +#include #include - -XGUI_TopDataModel::XGUI_TopDataModel(const std::shared_ptr& theDocument, QObject* theParent) - : XGUI_FeaturesModel(theDocument, theParent) +#include + +//ObjectPtr featureObj(const ObjectPtr& theFeature) +//{ +// ObjectPtr aObject = boost::dynamic_pointer_cast(theFeature); +// if (aObject) +// return aObject->featureRef(); +// return theFeature; +//} + +XGUI_TopDataModel::XGUI_TopDataModel(QObject* theParent) + : XGUI_FeaturesModel(theParent) { } - + XGUI_TopDataModel::~XGUI_TopDataModel() { } - QVariant XGUI_TopDataModel::data(const QModelIndex& theIndex, int theRole) const { switch (theRole) { - case Qt::DisplayRole: - // return a name - switch (theIndex.internalId()) { - case ParamsFolder: - return tr("Parameters"); - case ParamObject: - { - std::shared_ptr aFeature = myDocument->feature(PARAMETERS_GROUP, theIndex.row()); - return aFeature->data()->getName().c_str(); - } - case ConstructFolder: - return tr("Constructions"); - case ConstructObject: - { - std::shared_ptr aFeature = myDocument->feature(CONSTRUCTIONS_GROUP, theIndex.row()); - return aFeature->data()->getName().c_str(); + case Qt::DisplayRole: + // return a name + switch (theIndex.internalId()) { + case ParamsFolder: + return tr("Parameters") + QString(" (%1)").arg(rowCount(theIndex)); + case ParamObject: { + DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument(); + ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultParameters::group(), theIndex.row()); + if (aObject) + return aObject->data()->name().c_str(); + } + break; + case ConstructFolder: + return tr("Constructions") + QString(" (%1)").arg(rowCount(theIndex)); + case ConstructObject: { + DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument(); + ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultConstruction::group(), + theIndex.row()); + if (aObject) + return aObject->data()->name().c_str(); + } + break; } - } - break; - - case Qt::DecorationRole: - // return an Icon - switch (theIndex.internalId()) { - case ParamsFolder: - return QIcon(":pictures/params_folder.png"); - case ConstructFolder: - return QIcon(":pictures/constr_folder.png"); - case ConstructObject: - return QIcon(":pictures/point_ico.png"); - } - break; + break; - case Qt::ToolTipRole: - // return Tooltip - break; + case Qt::DecorationRole: + { + // return an Icon + switch (theIndex.internalId()) { + case ParamsFolder: + return QIcon(":pictures/params_folder.png"); + case ConstructFolder: + return QIcon(":pictures/constr_folder.png"); + case ConstructObject: + return QIcon(":pictures/constr_object.png"); + } + } + break; + + case Qt::ToolTipRole: + // return Tooltip + break; + case Qt::ForegroundRole: + return QBrush(myItemsColor); + break; } return QVariant(); } @@ -68,14 +92,15 @@ QVariant XGUI_TopDataModel::headerData(int section, Qt::Orientation orientation, int XGUI_TopDataModel::rowCount(const QModelIndex& theParent) const { - if (!theParent.isValid()) + if (!theParent.isValid()) return 2; + DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument(); 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()); return 0; } @@ -89,32 +114,32 @@ QModelIndex XGUI_TopDataModel::index(int theRow, int theColumn, const QModelInde { if (!theParent.isValid()) { switch (theRow) { - case 0: - return createIndex(theRow, theColumn, (quintptr) ParamsFolder); - case 1: - return createIndex(theRow, theColumn, (quintptr) ConstructFolder); + case 0: + return createIndex(theRow, theColumn, (qint32) ParamsFolder); + case 1: + return createIndex(theRow, theColumn, (qint32) ConstructFolder); } } 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); } return QModelIndex(); } QModelIndex XGUI_TopDataModel::parent(const QModelIndex& theIndex) const { - int aId = (int)theIndex.internalId(); + int aId = (int) theIndex.internalId(); switch (aId) { - case ParamsFolder: - case ConstructFolder: - return QModelIndex(); - case ParamObject: - return createIndex(0, 0, (quintptr) ParamsFolder); - case ConstructObject: - return createIndex(1, 0, (quintptr) ConstructFolder); + case ParamsFolder: + case ConstructFolder: + return QModelIndex(); + case ParamObject: + return createIndex(0, 0, (qint32) ParamsFolder); + case ConstructObject: + return createIndex(1, 0, (qint32) ConstructFolder); } return QModelIndex(); } @@ -124,30 +149,70 @@ bool XGUI_TopDataModel::hasChildren(const QModelIndex& theParent) const 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 ParamObject: - return myDocument->feature(PARAMETERS_GROUP, theIndex.row()); - case ConstructObject: - return myDocument->feature(CONSTRUCTIONS_GROUP, theIndex.row()); + case ParamsFolder: + case ConstructFolder: + return ObjectPtr(); + case ParamObject: { + DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument(); + return aRootDoc->object(ModelAPI_ResultParameters::group(), theIndex.row()); + } + case ConstructObject: { + DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument(); + return aRootDoc->object(ModelAPI_ResultConstruction::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); + return QModelIndex(); +} + +QModelIndex XGUI_TopDataModel::objectIndex(const ObjectPtr& theObject) const +{ + QModelIndex aIndex; + if (theObject) { + DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument(); + 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); + } + } + return aIndex; +} //****************************************************************** //****************************************************************** //****************************************************************** -XGUI_PartDataModel::XGUI_PartDataModel(const std::shared_ptr& theDocument, QObject* theParent) - : XGUI_PartModel(theDocument, theParent) +XGUI_PartDataModel::XGUI_PartDataModel(QObject* theParent) + : XGUI_PartModel(theParent) { } - XGUI_PartDataModel::~XGUI_PartDataModel() { } @@ -155,48 +220,79 @@ XGUI_PartDataModel::~XGUI_PartDataModel() QVariant XGUI_PartDataModel::data(const QModelIndex& theIndex, int theRole) const { switch (theRole) { - case Qt::DisplayRole: - // return a name - switch (theIndex.internalId()) { - case MyRoot: - { - std::shared_ptr aFeature = myDocument->feature(PARTS_GROUP, myId); - return aFeature->data()->getName().c_str(); + case Qt::DisplayRole: + // return a name + switch (theIndex.internalId()) { + case MyRoot: { + DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument(); + ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), myId); + if (aObject) + return boost::dynamic_pointer_cast(aObject)->data()->name().c_str(); + } + case ParamsFolder: + return tr("Parameters") + QString(" (%1)").arg(rowCount(theIndex)); + case ConstructFolder: + return tr("Constructions") + QString(" (%1)").arg(rowCount(theIndex)); + case BodiesFolder: + return tr("Bodies") + QString(" (%1)").arg(rowCount(theIndex)); + case ParamObject: { + ObjectPtr aObject = partDocument()->object(ModelAPI_ResultParameters::group(), + theIndex.row()); + if (aObject) + return boost::dynamic_pointer_cast(aObject)->data()->name().c_str(); + } + case ConstructObject: { + ObjectPtr aObject = partDocument()->object(ModelAPI_ResultConstruction::group(), + theIndex.row()); + if (aObject) + return boost::dynamic_pointer_cast(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(); + } } - case ParamsFolder: - return tr("Parameters"); - case ConstructFolder: - return tr("Constructions"); - case ParamObject: - { - std::shared_ptr aFeature = - featureDocument()->feature(PARAMETERS_GROUP, theIndex.row()); - return aFeature->data()->getName().c_str(); - } - case ConstructObject: - { - std::shared_ptr aFeature = - featureDocument()->feature(CONSTRUCTIONS_GROUP, theIndex.row()); - return aFeature->data()->getName().c_str(); + break; + case Qt::DecorationRole: + // return an Icon + switch (theIndex.internalId()) { + case MyRoot: + return QIcon(":pictures/part_ico.png"); + case ParamsFolder: + return QIcon(":pictures/params_folder.png"); + case ConstructFolder: + case BodiesFolder: + return QIcon(":pictures/constr_folder.png"); + case ConstructObject: + case BodiesObject: { + std::string aGroup = theIndex.internalId() == ConstructObject ? + ModelAPI_ResultConstruction::group() : ModelAPI_ResultBody::group(); + ObjectPtr anObject = partDocument()->object(aGroup, theIndex.row()); + if (anObject && anObject->data() && anObject->data()->mustBeUpdated()) { + return QIcon(":pictures/constr_object_modified.png"); + } + return QIcon(":pictures/constr_object.png"); + } + case HistoryObject: { + ObjectPtr aObject = partDocument()->object(ModelAPI_Feature::group(), theIndex.row() - 3); + FeaturePtr aFeature = boost::dynamic_pointer_cast(aObject); + if (aFeature) + return QIcon(XGUI_Workshop::featureIcon(aFeature->getKind())); + } } - } - break; - case Qt::DecorationRole: - // return an Icon - switch (theIndex.internalId()) { - case MyRoot: - return QIcon(":pictures/part_ico.png"); - case ParamsFolder: - return QIcon(":pictures/params_folder.png"); - case ConstructFolder: - return QIcon(":pictures/constr_folder.png"); - case ConstructObject: - return QIcon(":pictures/point_ico.png"); - } - break; - case Qt::ToolTipRole: - // return Tooltip - break; + break; + case Qt::ToolTipRole: + // return Tooltip + break; + case Qt::ForegroundRole: + return QBrush(myItemsColor); + break; } return QVariant(); } @@ -208,18 +304,28 @@ QVariant XGUI_PartDataModel::headerData(int section, Qt::Orientation orientation int XGUI_PartDataModel::rowCount(const QModelIndex& parent) const { - if (!parent.isValid()) - if (myDocument->feature(PARTS_GROUP, myId)) + if (!parent.isValid()) { + DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument(); + if (aRootDoc->object(ModelAPI_ResultPart::group(), myId)) return 1; - else + else return 0; + } switch (parent.internalId()) { - case MyRoot: - return 2; - case ParamsFolder: - return featureDocument()->featuresIterator(PARAMETERS_GROUP)->numIterationsLeft(); - case ConstructFolder: - return featureDocument()->featuresIterator(CONSTRUCTIONS_GROUP)->numIterationsLeft(); + case MyRoot: + { + DocumentPtr aDoc = partDocument(); + if (aDoc) + return 3 + aDoc->size(ModelAPI_Feature::group()); + else + return 0; + } + case ParamsFolder: + return partDocument()->size(ModelAPI_ResultParameters::group()); + case ConstructFolder: + return partDocument()->size(ModelAPI_ResultConstruction::group()); + case BodiesFolder: + return partDocument()->size(ModelAPI_ResultBody::group()); } return 0; } @@ -232,21 +338,27 @@ int XGUI_PartDataModel::columnCount(const QModelIndex &parent) const 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(); + int aId = (int) theParent.internalId(); switch (aId) { - case MyRoot: - switch (theRow) { - case 0: - return createIndex(0, 0, (quintptr) ParamsFolder); - case 1: - return createIndex(1, 0, (quintptr) ConstructFolder); - } - case ParamsFolder: - return createIndex(theRow, 0, (quintptr) ParamObject); - case ConstructFolder: - return createIndex(theRow, 0, (quintptr) ConstructObject); + case MyRoot: + switch (theRow) { + case 0: + return createIndex(0, 0, (qint32) ParamsFolder); + case 1: + 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, (qint32) ParamObject); + case ConstructFolder: + return createIndex(theRow, 0, (qint32) ConstructObject); + case BodiesFolder: + return createIndex(theRow, 0, (qint32) BodiesObject); } return QModelIndex(); } @@ -254,15 +366,19 @@ QModelIndex XGUI_PartDataModel::index(int theRow, int theColumn, const QModelInd QModelIndex XGUI_PartDataModel::parent(const QModelIndex& theIndex) const { switch (theIndex.internalId()) { - case MyRoot: - return QModelIndex(); - case ParamsFolder: - case ConstructFolder: - return createIndex(0, 0, (quintptr) MyRoot); - case ParamObject: - return createIndex(0, 0, (quintptr) ParamsFolder); - case ConstructObject: - return createIndex(1, 0, (quintptr) ConstructFolder); + case MyRoot: + return QModelIndex(); + case ParamsFolder: + case ConstructFolder: + case BodiesFolder: + case HistoryObject: + return createIndex(0, 0, (qint32) MyRoot); + case ParamObject: + return createIndex(0, 0, (qint32) ParamsFolder); + case ConstructObject: + return createIndex(1, 0, (qint32) ConstructFolder); + case BodiesObject: + return createIndex(2, 0, (qint32) BodiesFolder); } return QModelIndex(); } @@ -272,25 +388,92 @@ bool XGUI_PartDataModel::hasChildren(const QModelIndex& theParent) const return rowCount(theParent) > 0; } - -std::shared_ptr XGUI_PartDataModel::featureDocument() const +DocumentPtr XGUI_PartDataModel::partDocument() const { - std::shared_ptr aFeature = myDocument->feature(PARTS_GROUP, myId); - return aFeature->data()->docRef("PartDocument")->value(); + DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument(); + ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), myId); + ResultPartPtr aPart = boost::dynamic_pointer_cast(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); - case ParamsFolder: - case ConstructFolder: - return 0; - case ParamObject: - return featureDocument()->feature(PARAMETERS_GROUP, theIndex.row()); - case ConstructObject: - return featureDocument()->feature(CONSTRUCTIONS_GROUP, theIndex.row()); + case MyRoot: { + DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument(); + return aRootDoc->object(ModelAPI_ResultPart::group(), myId); + } + case ParamsFolder: + case ConstructFolder: + case BodiesFolder: + return ObjectPtr(); + case ParamObject: + return partDocument()->object(ModelAPI_ResultParameters::group(), theIndex.row()); + case ConstructObject: + 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_Session::get()->moduleDocument(); + ObjectPtr aObj = aRootDoc->object(ModelAPI_ResultPart::group(), myId); + return boost::dynamic_pointer_cast(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; }