X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_TreeNodes.cpp;h=5e642c691aba56927ddd26dbe083d0db2579e517;hb=9fadaebe6d57d0836c7997ee60eb4cfdb67e2ffb;hp=4bff2cb95fffd5b168e06d53bdda7cbf016182fd;hpb=8e8c119bb9d386ae1dc3bc10b6ac0df24e7573f5;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_TreeNodes.cpp b/src/PartSet/PartSet_TreeNodes.cpp index 4bff2cb95..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) @@ -134,7 +135,9 @@ QVariant PartSet_ObjectNode::data(int theColumn, int theRole) const Qt::ItemFlags PartSet_ObjectNode::flags(int theColumn) const { - if (!myObject->isDisabled()) { + if (myObject->isDisabled()) { + return (theColumn == 2) ? Qt::ItemIsSelectable : aNullFlag; + } else { DocumentPtr aDoc = myObject->document(); SessionPtr aSession = ModelAPI_Session::get(); if (aSession->activeDocument() == aDoc) @@ -154,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; @@ -179,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) @@ -247,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(); @@ -254,18 +356,16 @@ void PartSet_FolderNode::update() return; // Remove extra sub-nodes - QTreeNodesList aDelList; int aIndex; - int aId = -1; - foreach(ModuleBase_ITreeNode* aNode, myChildren) { - aId++; + int aId = 0; + while (aId < myChildren.size()) { + ModuleBase_ITreeNode* aNode = myChildren.at(aId); aIndex = aDoc->index(aNode->object(), true); - if ((aIndex == -1) || (aId != aIndex)) - aDelList.append(aNode); - } - foreach(ModuleBase_ITreeNode* aNode, aDelList) { - myChildren.removeAll(aNode); - delete aNode; + if ((aIndex == -1) || (aId != aIndex)) { + myChildren.removeAll(aNode); + delete aNode; + } else + aId++; } // Add new nodes @@ -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; } @@ -337,19 +455,23 @@ QTreeNodesList PartSet_FolderNode::objectsDeleted(const DocumentPtr& theDoc, if ((theGroup.toStdString() == groupName()) && (theDoc == aDoc)) { QTreeNodesList aDelList; int aIndex; - int aId = -1; - foreach(ModuleBase_ITreeNode* aNode, myChildren) { - aId++; + int aId = 0; + bool aRemoved = false; + while (aId < myChildren.size()) { + ModuleBase_ITreeNode* aNode = myChildren.at(aId); aIndex = aDoc->index(aNode->object(), true); - if ((aIndex == -1) || (aId != aIndex)) - aDelList.append(aNode); - } - if (aDelList.size() > 0) { - foreach(ModuleBase_ITreeNode* aNode, aDelList) { + if ((aIndex == -1) || (aId != aIndex)) { myChildren.removeAll(aNode); delete aNode; - } + aRemoved = true; + } else + aId++; + } + if (aRemoved) aResult.append(this); + + foreach(ModuleBase_ITreeNode* aNode, myChildren) { + aResult.append(aNode->objectsDeleted(theDoc, theGroup)); } } return aResult; @@ -360,39 +482,47 @@ QTreeNodesList PartSet_FeatureFolderNode::objectCreated(const QObjectPtrList& th { QTreeNodesList aResult; // Process all folders - ModuleBase_ITreeNode* aFoder = 0; foreach(ModuleBase_ITreeNode* aNode, myChildren) { - aFoder = dynamic_cast(aNode); - if (!aFoder) - aFoder = dynamic_cast(aNode); - - if (aFoder) { // 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()) || (aObj->groupName() == ModelAPI_Folder::group())){ ModuleBase_ITreeNode* aNode = createNode(aObj); - aIdx = aDoc->index(aObj, true) + 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); - aResult.append(aNode); + aIdx = aDoc->index(aObj, true); + if (aIdx != -1) { + aIdx += aNb; + bool aHasObject = (aIdx < myChildren.size()) && (myChildren.at(aIdx)->object() == aObj); + if (!aHasObject) { + 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()) || @@ -422,24 +552,24 @@ QTreeNodesList PartSet_FeatureFolderNode::objectsDeleted(const DocumentPtr& theD bool isGroup = ((theGroup.toStdString() == ModelAPI_Feature::group()) || (theGroup.toStdString() == ModelAPI_Folder::group())); if ((theDoc == aDoc) && isGroup) { - QTreeNodesList aDelList; int aIndex; - int aId = -1; - foreach(ModuleBase_ITreeNode* aNode, myChildren) { - aId++; + int aId = 0; + bool aRemoved = false; + while (aId < myChildren.size()) { + ModuleBase_ITreeNode* aNode = myChildren.at(aId); if (aNode->object().get()) { aIndex = aDoc->index(aNode->object(), true); - if ((aIndex == -1) || (aId != aIndex)) - aDelList.append(aNode); + if ((aIndex == -1) || (aId != (aIndex + aNb))) { + myChildren.removeAll(aNode); + delete aNode; + aRemoved = true; + continue; + } } + aId++; } - if (aDelList.size() > 0) { - foreach(ModuleBase_ITreeNode* aNode, aDelList) { - myChildren.removeAll(aNode); - delete aNode; - } + if (aRemoved) aResult.append(this); - } } return aResult; } @@ -491,20 +621,19 @@ void PartSet_RootNode::update() int aNb = numberOfFolders(); // Remove extra sub-nodes - QTreeNodesList aDelList; int aIndex; - int aId = -1; - foreach(ModuleBase_ITreeNode* aNode, myChildren) { - aId++; + int aId = 0; + while (aId < myChildren.size()) { + ModuleBase_ITreeNode* aNode = myChildren.at(aId); if (aNode->object().get()) { aIndex = aDoc->index(aNode->object(), true); - if ((aIndex == -1) || (aId != (aIndex + aNb))) - aDelList.append(aNode); + if ((aIndex == -1) || (aId != (aIndex + aNb))) { + myChildren.removeAll(aNode); + delete aNode; + continue; + } } - } - foreach(ModuleBase_ITreeNode* aNode, aDelList) { - myChildren.removeAll(aNode); - delete aNode; + aId++; } // Add new nodes @@ -603,20 +732,19 @@ void PartSet_PartRootNode::update() int aRows = numberOfFolders(); // Remove extra sub-nodes - QTreeNodesList aDelList; int aIndex = -1; - int aId = -1; - foreach(ModuleBase_ITreeNode* aNode, myChildren) { - aId++; + int aId = 0; + while (aId < myChildren.size()) { + ModuleBase_ITreeNode* aNode = myChildren.at(aId); if (aNode->object().get()) { aIndex = aDoc->index(aNode->object(), true); - if ((aIndex == -1) || (aId != (aIndex + aRows))) - aDelList.append(aNode); + if ((aIndex == -1) || (aId != (aIndex + aRows))) { + myChildren.removeAll(aNode); + delete aNode; + continue; + } } - } - foreach(ModuleBase_ITreeNode* aNode, aDelList) { - myChildren.removeAll(aNode); - delete aNode; + aId++; } std::string aGroup = ModelAPI_Feature::group(); @@ -758,21 +886,17 @@ void PartSet_ObjectFolderNode::update() DocumentPtr aDoc = myObject->document(); // Delete obsolete nodes - QTreeNodesList aDelList; - int aId = -1; - foreach(ModuleBase_ITreeNode* aNode, myChildren) { - aId++; + int aId = 0; + while (aId < myChildren.size()) { + 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)) { - aDelList.append(aNode); + myChildren.removeAll(aNode); + delete aNode; + continue; } - } else { - aDelList.append(aNode); } - } - foreach(ModuleBase_ITreeNode* aNode, aDelList) { - myChildren.removeAll(aNode); - delete aNode; + aId++; } // Add new nodes @@ -838,24 +962,22 @@ QTreeNodesList PartSet_ObjectFolderNode::objectsDeleted(const DocumentPtr& theDo } DocumentPtr aDoc = myObject->document(); // Delete obsolete nodes - QTreeNodesList aDelList; - int aId = -1; - foreach(ModuleBase_ITreeNode* aNode, myChildren) { - aId++; + bool aRemoved = false; + int aId = 0; + while (aId < myChildren.size()) { + 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)) { - aDelList.append(aNode); + myChildren.removeAll(aNode); + delete aNode; + aRemoved = true; + continue; } - } else { - aDelList.append(aNode); } + aId++; } - if (aDelList.size() > 0) { + if (aRemoved) { aResult.append(this); - foreach(ModuleBase_ITreeNode* aNode, aDelList) { - myChildren.removeAll(aNode); - delete aNode; - } } return aResult; } @@ -888,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