X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FPartSet%2FPartSet_TreeNodes.cpp;h=5e642c691aba56927ddd26dbe083d0db2579e517;hb=9fadaebe6d57d0836c7997ee60eb4cfdb67e2ffb;hp=0e5b92ecf6a75148086179023a9fc4eed152fc28;hpb=9517aa47003c2c0677dc7afec3f2c9e0e1f5a2b4;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_TreeNodes.cpp b/src/PartSet/PartSet_TreeNodes.cpp index 0e5b92ecf..5e642c691 100644 --- a/src/PartSet/PartSet_TreeNodes.cpp +++ b/src/PartSet/PartSet_TreeNodes.cpp @@ -33,13 +33,14 @@ #include #include #include -#include +#include #include #include #include #include #include +#include #define ACTIVE_COLOR QColor(Qt::black) @@ -156,12 +157,17 @@ PartSet_ObjectNode::VisibilityState PartSet_ObjectNode::visibilityState() const ResultPtr aResObj = std::dynamic_pointer_cast(myObject); if (aResObj.get()) { ModuleBase_IWorkshop* aWork = workshop(); - ResultCompSolidPtr aCompRes = std::dynamic_pointer_cast(aResObj); + ResultBodyPtr aCompRes = std::dynamic_pointer_cast(aResObj); if (aCompRes.get()) { VisibilityState aState = aCompRes->numberOfSubs(true) == 0 ? (aWork->isVisible(aCompRes) ? Visible : Hidden) : NoneState; - for (int i = 0; i < aCompRes->numberOfSubs(true); i++) { - ResultPtr aSubRes = aCompRes->subResult(i, true); + std::list aResultsList; + ModelAPI_Tools::allSubs(aCompRes, aResultsList); + + std::list::const_iterator aIt; + //for (int i = 0; i < aCompRes->numberOfSubs(true); i++) { + for (aIt = aResultsList.cbegin(); aIt != aResultsList.cend(); aIt++) { + ResultPtr aSubRes = (*aIt); // aCompRes->subResult(i, true); VisibilityState aS = aWork->isVisible(aSubRes) ? Visible : Hidden; if (aState == NoneState) aState = aS; @@ -181,7 +187,93 @@ PartSet_ObjectNode::VisibilityState PartSet_ObjectNode::visibilityState() const return NoneState; } +void PartSet_ObjectNode::update() +{ + ResultBodyPtr aCompRes = std::dynamic_pointer_cast(myObject); + if (aCompRes.get()) { + int aNb = aCompRes->numberOfSubs(true); + ModuleBase_ITreeNode* aNode; + ResultBodyPtr aBody; + int i; + for (i = 0; i < aNb; i++) { + aBody = aCompRes->subResult(i, true); + 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); + } + } + // Delete extra objects + while (myChildren.size() > aNb) { + aNode = myChildren.takeLast(); + delete aNode; + } + foreach(ModuleBase_ITreeNode* aNode, myChildren) { + aNode->update(); + } + } +} + +QTreeNodesList PartSet_ObjectNode::objectCreated(const QObjectPtrList& theObjects) +{ + QTreeNodesList aResult; + ResultBodyPtr aCompRes = std::dynamic_pointer_cast(myObject); + if (aCompRes.get()) { + int aNb = aCompRes->numberOfSubs(true); + ModuleBase_ITreeNode* aNode; + ResultBodyPtr aBody; + int i; + for (i = 0; i < aNb; i++) { + aBody = aCompRes->subResult(i, true); + 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); + } + } + foreach(ModuleBase_ITreeNode* aNode, myChildren) { + aResult.append(aNode->objectCreated(theObjects)); + } + } + return aResult; +} + +QTreeNodesList PartSet_ObjectNode::objectsDeleted(const DocumentPtr& theDoc, const QString& theGroup) +{ + QTreeNodesList aResult; + ResultBodyPtr aCompRes = std::dynamic_pointer_cast(myObject); + if (aCompRes.get()) { + int aNb = aCompRes->numberOfSubs(true); + ModuleBase_ITreeNode* aNode; + // Delete extra objects + bool isDeleted = false; + while (myChildren.size() > aNb) { + aNode = myChildren.takeLast(); + delete aNode; + isDeleted = true; + } + if (isDeleted) + aResult.append(this); + int i = 0; + foreach(ModuleBase_ITreeNode* aNode, myChildren) { + ((PartSet_ObjectNode*)aNode)->setObject(aCompRes->subResult(i, true)); + aResult.append(aNode->objectsDeleted(theDoc, theGroup)); + i++; + } + } + return aResult; +} ////////////////////////////////////////////////////////////////////////////////// PartSet_FolderNode::PartSet_FolderNode(ModuleBase_ITreeNode* theParent, FolderType theType) @@ -249,6 +341,14 @@ Qt::ItemFlags PartSet_FolderNode::flags(int theColumn) const return aDefaultFlag; } +ModuleBase_ITreeNode* PartSet_FolderNode::createNode(const ObjectPtr& theObj) +{ + //ResultCompSolidPtr aCompRes = std::dynamic_pointer_cast(theObj); + //if (aCompRes.get()) + // return new PartSet_CompsolidNode(theObj, this); + return new PartSet_ObjectNode(theObj, this); +} + void PartSet_FolderNode::update() { DocumentPtr aDoc = document(); @@ -275,14 +375,18 @@ void PartSet_FolderNode::update() ObjectPtr aObj = aDoc->object(aGroup, i, true); if (i < myChildren.size()) { if (myChildren.at(i)->object() != aObj) { - PartSet_ObjectNode* aNode = new PartSet_ObjectNode(aObj, this); + ModuleBase_ITreeNode* aNode = createNode(aObj); myChildren.insert(i, aNode); } } else { - PartSet_ObjectNode* aNode = new PartSet_ObjectNode(aObj, this); + ModuleBase_ITreeNode* aNode = createNode(aObj); myChildren.append(aNode); } } + + foreach(ModuleBase_ITreeNode* aNode, myChildren) { + aNode->update(); + } } std::string PartSet_FolderNode::groupName() const @@ -310,22 +414,36 @@ QTreeNodesList PartSet_FolderNode::objectCreated(const QObjectPtrList& theObject std::string aName = groupName(); DocumentPtr aDoc = document(); int aIdx = -1; + QMap aNewNodes; foreach(ObjectPtr aObj, theObjects) { if ((aObj->document() == aDoc) && (aObj->groupName() == aName)) { aIdx = aDoc->index(aObj, true); if (aIdx != -1) { bool aHasObject = (aIdx < myChildren.size()) && (myChildren.at(aIdx)->object() == aObj); if (!aHasObject) { - PartSet_ObjectNode* aNode = new PartSet_ObjectNode(aObj, this); + ModuleBase_ITreeNode* aNode = createNode(aObj); + aNewNodes[aIdx] = aNode; aResult.append(aNode); - if (aIdx < myChildren.size()) - myChildren.insert(aIdx, aNode); - else - myChildren.append(aNode); } } } } + // Add nodes in correct order + int i; + for (i = 0; i < myChildren.size(); i++) { + if (aNewNodes.contains(i)) { + myChildren.insert(i, aNewNodes[i]); + aNewNodes.remove(i); + } + } + while (aNewNodes.size()) { + i = myChildren.size(); + myChildren.append(aNewNodes[i]); + aNewNodes.remove(i); + } + foreach(ModuleBase_ITreeNode* aNode, myChildren) { + aResult.append(aNode->objectCreated(theObjects)); + } return aResult; } @@ -351,6 +469,10 @@ QTreeNodesList PartSet_FolderNode::objectsDeleted(const DocumentPtr& theDoc, } if (aRemoved) aResult.append(this); + + foreach(ModuleBase_ITreeNode* aNode, myChildren) { + aResult.append(aNode->objectsDeleted(theDoc, theGroup)); + } } return aResult; } @@ -360,19 +482,16 @@ QTreeNodesList PartSet_FeatureFolderNode::objectCreated(const QObjectPtrList& th { QTreeNodesList aResult; // Process all folders - ModuleBase_ITreeNode* aFoder = 0; foreach(ModuleBase_ITreeNode* aNode, myChildren) { - if ((aNode->type() == PartSet_FolderNode::typeId()) || - (aNode->type() == PartSet_PartRootNode::typeId())) { // aFolder node - QTreeNodesList aList = aNode->objectCreated(theObjects); - if (aList.size() > 0) - aResult.append(aList); + if (aNode->type() == PartSet_FolderNode::typeId()) { // aFolder node + aResult.append(aNode->objectCreated(theObjects)); } } // Process the root sub-objects DocumentPtr aDoc = document(); int aIdx = -1; int aNb = numberOfFolders(); + QMap aNewNodes; foreach(ObjectPtr aObj, theObjects) { if (aDoc == aObj->document()) { if ((aObj->groupName() == ModelAPI_Feature::group()) || @@ -383,16 +502,27 @@ QTreeNodesList PartSet_FeatureFolderNode::objectCreated(const QObjectPtrList& th aIdx += aNb; bool aHasObject = (aIdx < myChildren.size()) && (myChildren.at(aIdx)->object() == aObj); if (!aHasObject) { - if (aIdx < myChildren.size()) - myChildren.insert(aIdx, aNode); - else - myChildren.append(aNode); + aNewNodes[aIdx] = aNode; aResult.append(aNode); } } } } } + // To add in correct order + int i; + for (i = 0; i < myChildren.size(); i++) { + if (aNewNodes.contains(i)) { + myChildren.insert(i, aNewNodes[i]); + aNewNodes.remove(i); + } + } + while (aNewNodes.size()) { + i = myChildren.size(); + myChildren.append(aNewNodes[i]); + aNewNodes.remove(i); + } + // Update sub-folders foreach(ModuleBase_ITreeNode* aNode, myChildren) { if ((aNode->type() == PartSet_ObjectFolderNode::typeId()) || @@ -835,7 +965,7 @@ QTreeNodesList PartSet_ObjectFolderNode::objectsDeleted(const DocumentPtr& theDo bool aRemoved = false; int aId = 0; while (aId < myChildren.size()) { - ModuleBase_ITreeNode* aNode = myChildren.at(1); + ModuleBase_ITreeNode* aNode = myChildren.at(aId); if ((aFirst + aId) < aDoc->size(ModelAPI_Feature::group(), true)) { if (aNode->object() != aDoc->object(ModelAPI_Feature::group(), aFirst + aId)) { myChildren.removeAll(aNode); @@ -880,3 +1010,81 @@ void PartSet_ObjectFolderNode::getFirstAndLastIndex(int& theFirst, int& theLast) theFirst = aDoc->index(aFirstFeatureInFolder); theLast = aDoc->index(aLastFeatureInFolder); } + + +////////////////////////////////////////////////////////////////////////////////// +//PartSet_CompsolidNode::PartSet_CompsolidNode(const ObjectPtr& theObj, +// ModuleBase_ITreeNode* theParent) : PartSet_ObjectNode(theObj, theParent) +//{ +// update(); +//} + +//void PartSet_CompsolidNode::update() +//{ +// ResultCompSolidPtr aCompRes = std::dynamic_pointer_cast(myObject); +// int aNb = aCompRes->numberOfSubs(true); +// ModuleBase_ITreeNode* aNode; +// ResultBodyPtr aBody; +// int i; +// for (i = 0; i < aNb; i++) { +// aBody = aCompRes->subResult(i, true); +// 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); +// } +// } +// // Delete extra objects +// while (myChildren.size() > aNb) { +// aNode = myChildren.takeLast(); +// delete aNode; +// } +//} +// +//QTreeNodesList PartSet_CompsolidNode::objectCreated(const QObjectPtrList& theObjects) +//{ +// QTreeNodesList aResult; +// +// ResultCompSolidPtr aCompRes = std::dynamic_pointer_cast(myObject); +// int aNb = aCompRes->numberOfSubs(true); +// ModuleBase_ITreeNode* aNode; +// ResultBodyPtr aBody; +// int i; +// for (i = 0; i < aNb; i++) { +// aBody = aCompRes->subResult(i, true); +// 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); +// } +// } +// return aResult; +//} +// +//QTreeNodesList PartSet_CompsolidNode::objectsDeleted(const DocumentPtr& theDoc, const QString& theGroup) +//{ +// QTreeNodesList aResult; +// ResultCompSolidPtr aCompRes = std::dynamic_pointer_cast(myObject); +// int aNb = aCompRes->numberOfSubs(true); +// ModuleBase_ITreeNode* aNode; +// // Delete extra objects +// bool isDeleted = false; +// while (myChildren.size() > aNb) { +// aNode = myChildren.takeLast(); +// delete aNode; +// isDeleted = true; +// } +// if (isDeleted) +// aResult.append(this); +// return aResult; +//} \ No newline at end of file