return NoneState;
}
-void PartSet_ObjectNode::update()
+int PartSet_ObjectNode::numberOfSubs() const
+{
+ ResultBodyPtr aCompRes = std::dynamic_pointer_cast<ModelAPI_ResultBody>(myObject);
+ if (aCompRes.get())
+ return aCompRes->numberOfSubs(true);
+ else {
+ CompositeFeaturePtr aCompFeature =
+ std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(myObject);
+ if (aCompFeature.get())
+ return aCompFeature->numberOfSubs(true);
+ else {
+ ResultFieldPtr aFieldRes = std::dynamic_pointer_cast<ModelAPI_ResultField>(myObject);
+ if (aFieldRes.get())
+ return aFieldRes->stepsSize();
+ }
+ }
+ return 0;
+}
+
+
+ObjectPtr PartSet_ObjectNode::subObject(int theId) const
{
- CompositeFeaturePtr aCompFeature;
ResultBodyPtr aCompRes = std::dynamic_pointer_cast<ModelAPI_ResultBody>(myObject);
- int aNb = 0;
if (aCompRes.get())
- aNb = aCompRes->numberOfSubs(true);
+ return aCompRes->subResult(theId, true);
else {
- aCompFeature = std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(myObject);
+ CompositeFeaturePtr aCompFeature =
+ std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(myObject);
if (aCompFeature.get())
- aNb = aCompFeature->numberOfSubs(true);
+ return aCompFeature->subFeature(theId, true);
}
+ return ObjectPtr();
+}
+void PartSet_ObjectNode::update()
+{
+ int aNb = numberOfSubs();
if (aNb > 0) {
+ ResultFieldPtr aFieldRes = std::dynamic_pointer_cast<ModelAPI_ResultField>(myObject);
+
+ // If the object is a field result then delete extra sub-objects
+ if (aFieldRes.get()) {
+ while (myChildren.size() > aNb) {
+ ModuleBase_ITreeNode* aNode = myChildren.last();
+ myChildren.removeAll(aNode);
+ delete aNode;
+ }
+ }
+
ModuleBase_ITreeNode* aNode;
ObjectPtr aBody;
int i;
for (i = 0; i < aNb; i++) {
- if (aCompRes.get())
- aBody = aCompRes->subResult(i, true);
- else
- aBody = aCompFeature->subFeature(i, true);
-
- if (i < myChildren.size()) {
- aNode = myChildren.at(i);
- if (aNode->object() != aBody) {
- ((PartSet_ObjectNode*)aNode)->setObject(aBody);
+ aBody = subObject(i);
+ if (aBody.get()) {
+ if (i < myChildren.size()) {
+ aNode = myChildren.at(i);
+ if (aNode->object() != aBody) {
+ ((PartSet_ObjectNode*)aNode)->setObject(aBody);
+ }
+ }
+ else {
+ aNode = new PartSet_ObjectNode(aBody, this);
+ myChildren.append(aNode);
+ }
+ }
+ else if (aFieldRes.get()) {
+ ModelAPI_ResultField::ModelAPI_FieldStep* aStep = aFieldRes->step(i);
+ if (i < myChildren.size()) {
+ PartSet_StepNode* aStepNode = static_cast<PartSet_StepNode*>(myChildren.at(i));
+ if (aStepNode->entity() != aStep) {
+ aStepNode->setEntity(aStep);
+ }
+ }
+ else {
+ aNode = new PartSet_StepNode(aStep, this);
+ myChildren.append(aNode);
}
- } else {
- aNode = new PartSet_ObjectNode(aBody, this);
- myChildren.append(aNode);
}
}
// Delete extra objects
QTreeNodesList PartSet_ObjectNode::objectCreated(const QObjectPtrList& theObjects)
{
QTreeNodesList aResult;
-
- CompositeFeaturePtr aCompFeature;
- ResultBodyPtr aCompRes = std::dynamic_pointer_cast<ModelAPI_ResultBody>(myObject);
- int aNb = 0;
- if (aCompRes.get())
- aNb = aCompRes->numberOfSubs(true);
- else {
- aCompFeature = std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(myObject);
- if (aCompFeature.get())
- aNb = aCompFeature->numberOfSubs(true);
- }
-
+ int aNb = numberOfSubs();
if (aNb > 0) {
ModuleBase_ITreeNode* aNode;
+ ResultFieldPtr aFieldRes = std::dynamic_pointer_cast<ModelAPI_ResultField>(myObject);
ObjectPtr aBody;
int i;
for (i = 0; i < aNb; i++) {
- if (aCompRes.get())
- aBody = aCompRes->subResult(i, true);
- else
- aBody = aCompFeature->subFeature(i, true);
-
- if (i < myChildren.size()) {
- aNode = myChildren.at(i);
- if (aNode->object() != aBody) {
- ((PartSet_ObjectNode*)aNode)->setObject(aBody);
+ aBody = subObject(i);
+ if (aBody.get()) {
+ if (i < myChildren.size()) {
+ aNode = myChildren.at(i);
+ if (aNode->object() != aBody) {
+ ((PartSet_ObjectNode*)aNode)->setObject(aBody);
+ aResult.append(aNode);
+ }
+ }
+ else {
+ aNode = new PartSet_ObjectNode(aBody, this);
+ myChildren.append(aNode);
aResult.append(aNode);
+ aNode->update();
+ }
+ }
+ else {
+ ModelAPI_ResultField::ModelAPI_FieldStep* aStep = aFieldRes->step(i);
+ if (i < myChildren.size()) {
+ PartSet_StepNode* aStepNode = static_cast<PartSet_StepNode*>(myChildren.at(i));
+ if (aStepNode->entity() != aStep) {
+ aStepNode->setEntity(aStep);
+ }
+ }
+ else {
+ aNode = new PartSet_StepNode(aStep, this);
+ myChildren.append(aNode);
}
- } else {
- aNode = new PartSet_ObjectNode(aBody, this);
- myChildren.append(aNode);
- aResult.append(aNode);
- aNode->update();
}
}
foreach(ModuleBase_ITreeNode* aNode, myChildren) {
const DocumentPtr& theDoc, const QString& theGroup)
{
QTreeNodesList aResult;
- CompositeFeaturePtr aCompFeature;
- ResultBodyPtr aCompRes = std::dynamic_pointer_cast<ModelAPI_ResultBody>(myObject);
- int aNb = 0;
- if (aCompRes.get())
- aNb = aCompRes->numberOfSubs(true);
- else {
- aCompFeature = std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(myObject);
- if (aCompFeature.get())
- aNb = aCompFeature->numberOfSubs(true);
- }
-
+ int aNb = numberOfSubs();
if (aNb > 0) {
ModuleBase_ITreeNode* aNode;
// Delete extra objects
int i = 0;
ObjectPtr aBody;
foreach(ModuleBase_ITreeNode* aNode, myChildren) {
- if (aCompRes.get())
- aBody = aCompRes->subResult(i, true);
- else
- aBody = aCompFeature->subFeature(i, true);
-
+ aBody = subObject(i);
((PartSet_ObjectNode*)aNode)->setObject(aBody);
aResult.append(aNode->objectsDeleted(theDoc, theGroup));
i++;
theFirst = aDoc->index(aFirstFeatureInFolder);
theLast = aDoc->index(aLastFeatureInFolder);
}
+
+
+//////////////////////////////////////////////////////////////////////////////////
+QVariant PartSet_StepNode::data(int theColumn, int theRole) const
+{
+ if ((theColumn == 1) && (theRole == Qt::DisplayRole)) {
+ ModelAPI_ResultField::ModelAPI_FieldStep* aStep =
+ dynamic_cast<ModelAPI_ResultField::ModelAPI_FieldStep*>(myEntity);
+
+ return "Step " + QString::number(aStep->id() + 1) + " " +
+ aStep->field()->textLine(aStep->id()).c_str();
+ }
+ return PartSet_TreeNode::data(theColumn, theRole);
+}
/// \param theGroup a name of group where objects were deleted
virtual QTreeNodesList objectsDeleted(const DocumentPtr& theDoc, const QString& theGroup);
+ /// Returns number of sub-objects of the current object
+ virtual int numberOfSubs() const;
+
+ virtual ObjectPtr subObject(int theId) const;
+
protected:
ObjectPtr myObject;
};
* \ingroup Modules
* Implementation of a node for compsolid representation
*/
-//class PartSet_CompsolidNode : public PartSet_ObjectNode
-//{
-//public:
-// PartSet_CompsolidNode(const ObjectPtr& theObj, ModuleBase_ITreeNode* theParent);
-//
-// static std::string typeId()
-// {
-// static std::string myType = "CompSolid";
-// return myType;
-// }
-//
-// virtual std::string type() const { return typeId(); }
-//
-// /// Updates sub-nodes of the node
-// virtual void update();
-//
-// /// Process creation of objects.
-// /// \param theObjects a list of created objects
-// /// \return a list of nodes which corresponds to the created objects
-// virtual QTreeNodesList objectCreated(const QObjectPtrList& theObjects);
-//
-// /// Process deletion of objects.
-// /// \param theDoc a document where objects were deleted
-// /// \param theGroup a name of group where objects were deleted
-// virtual QTreeNodesList objectsDeleted(const DocumentPtr& theDoc, const QString& theGroup);
-//
-//};
+class PartSet_StepNode : public PartSet_TreeNode
+{
+public:
+ PartSet_StepNode(ModelAPI_Entity* theEnt, ModuleBase_ITreeNode* theParent) :
+ PartSet_TreeNode(theParent), myEntity(theEnt) {}
+
+ static std::string typeId()
+ {
+ static std::string myType = "FieldStep";
+ return myType;
+ }
+
+ virtual std::string type() const { return typeId(); }
+
+ /// Returns the node representation according to theRole.
+ virtual QVariant data(int theColumn, int theRole) const;
+
+ ModelAPI_Entity* entity() const {
+ return myEntity;
+ }
+
+ void setEntity(ModelAPI_Entity* theEnt) {
+ myEntity = theEnt;
+ }
+
+private:
+ ModelAPI_Entity* myEntity;
+};
#endif
#include <ModuleBase_ITreeNode.h>
#include <ModelAPI_Session.h>
+#include <ModelAPI_ResultField.h>
#include <Config_FeatureMessage.h>
aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_UPDATED));
aLoop->registerListener(this, Events_Loop::eventByName(EVENT_ORDER_UPDATED));
aLoop->registerListener(this, Events_Loop::eventByName(EVENT_DOCUMENT_CHANGED));
+ aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY));
}
XGUI_DataModel::~XGUI_DataModel()
{
if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_CREATED)) {
std::shared_ptr<ModelAPI_ObjectUpdatedMessage> aUpdMsg =
- std::dynamic_pointer_cast<ModelAPI_ObjectUpdatedMessage>(theMessage);
+ std::dynamic_pointer_cast<ModelAPI_ObjectUpdatedMessage>(theMessage);
std::set<ObjectPtr> aObjects = aUpdMsg->objects();
QObjectPtrList aCreated;
std::set<ObjectPtr>::const_iterator aIt;
}
}
else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_DELETED)) {
- std::shared_ptr<ModelAPI_ObjectDeletedMessage> aUpdMsg =
- std::dynamic_pointer_cast<ModelAPI_ObjectDeletedMessage>(theMessage);
- const std::list<std::pair<std::shared_ptr<ModelAPI_Document>, std::string>>& aMsgGroups =
- aUpdMsg->groups();
- std::list<std::pair<std::shared_ptr<ModelAPI_Document>, std::string>>::const_iterator aIt;
- for (aIt = aMsgGroups.cbegin(); aIt != aMsgGroups.cend(); aIt++)
- QTreeNodesList aList = myRoot->objectsDeleted(aIt->first, aIt->second.c_str());
- rebuildDataTree();
+ std::shared_ptr<ModelAPI_ObjectDeletedMessage> aUpdMsg =
+ std::dynamic_pointer_cast<ModelAPI_ObjectDeletedMessage>(theMessage);
+ const std::list<std::pair<std::shared_ptr<ModelAPI_Document>, std::string>>& aMsgGroups =
+ aUpdMsg->groups();
+ std::list<std::pair<std::shared_ptr<ModelAPI_Document>, std::string>>::const_iterator aIt;
+ for (aIt = aMsgGroups.cbegin(); aIt != aMsgGroups.cend(); aIt++)
+ QTreeNodesList aList = myRoot->objectsDeleted(aIt->first, aIt->second.c_str());
+ rebuildDataTree();
}
else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_UPDATED)) {
std::shared_ptr<ModelAPI_ObjectUpdatedMessage> aUpdMsg =
if (aRebuildAll) {
myRoot->update();
rebuildDataTree();
- } else {
+ }
+ else {
foreach(ObjectPtr aObj, aCreated) {
ModuleBase_ITreeNode* aNode = myRoot->subNode(aObj);
if (aNode) {
+ int aOldNb = aNode->childrenCount();
+ aNode->update();
+ int aNewNb = aNode->childrenCount();
+
QModelIndex aFirstIdx = getIndex(aNode, 0);
QModelIndex aLastIdx = getIndex(aNode, 2);
+
+ if (aNewNb > aOldNb) {
+ insertRows(aOldNb - 1, aNewNb - aOldNb, aFirstIdx);
+ }
+ else if (aNewNb < aOldNb) {
+ removeRows(aNewNb - 1, aOldNb - aNewNb, aFirstIdx);
+ }
dataChanged(aFirstIdx, aLastIdx);
}
}
updateSubTree(aRoot);
}
}
+ else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY)) {
+ std::shared_ptr<ModelAPI_ObjectUpdatedMessage> aUpdMsg =
+ std::dynamic_pointer_cast<ModelAPI_ObjectUpdatedMessage>(theMessage);
+ std::set<ObjectPtr> aObjects = aUpdMsg->objects();
+
+ QObjectPtrList aCreated;
+ std::set<ObjectPtr>::const_iterator aIt;
+ bool aRebuildAll = false;
+ for (aIt = aObjects.cbegin(); aIt != aObjects.cend(); aIt++) {
+ ObjectPtr aObj = (*aIt);
+ if (aObj->groupName() == ModelAPI_ResultField::group()) {
+ aCreated.append(aObj);
+ }
+ }
+ foreach(ObjectPtr aObj, aCreated) {
+ ModuleBase_ITreeNode* aNode = myRoot->subNode(aObj);
+ if (aNode) {
+ int aOldNb = aNode->childrenCount();
+ aNode->update();
+ int aNewNb = aNode->childrenCount();
+
+ QModelIndex aFirstIdx = getIndex(aNode, 0);
+ QModelIndex aLastIdx = getIndex(aNode, 2);
+
+ if (aNewNb > aOldNb) {
+ insertRows(aOldNb - 1, aNewNb - aOldNb, aFirstIdx);
+ }
+ else if (aNewNb < aOldNb) {
+ removeRows(aNewNb - 1, aOldNb - aNewNb, aFirstIdx);
+ }
+ dataChanged(aFirstIdx, aLastIdx);
+ }
+ }
+ }
}
//******************************************************