X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FPartSet%2FPartSet_TreeNodes.cpp;h=92d25db69152fea370540718a10e4e6f84b308b3;hb=d2d54415aa7bc73156a11016dbc79e0ca592ce6a;hp=5e642c691aba56927ddd26dbe083d0db2579e517;hpb=1e2eaa713f139d2617c80eba9ede62d4e9976bb7;p=modules%2Fshaper.git diff --git a/src/PartSet/PartSet_TreeNodes.cpp b/src/PartSet/PartSet_TreeNodes.cpp index 5e642c691..92d25db69 100644 --- a/src/PartSet/PartSet_TreeNodes.cpp +++ b/src/PartSet/PartSet_TreeNodes.cpp @@ -128,6 +128,8 @@ QVariant PartSet_ObjectNode::data(int theColumn, int theRole) const case 2: if (isCurrentFeature(myObject)) return QIcon(":pictures/arrow.png"); + else + return QIcon(); } } return PartSet_TreeNode::data(theColumn, theRole); @@ -159,21 +161,24 @@ PartSet_ObjectNode::VisibilityState PartSet_ObjectNode::visibilityState() const ModuleBase_IWorkshop* aWork = workshop(); ResultBodyPtr aCompRes = std::dynamic_pointer_cast(aResObj); if (aCompRes.get()) { - VisibilityState aState = aCompRes->numberOfSubs(true) == 0 ? - (aWork->isVisible(aCompRes) ? Visible : Hidden) : NoneState; std::list aResultsList; ModelAPI_Tools::allSubs(aCompRes, aResultsList); + VisibilityState aState = aResultsList.size() == 0 ? + (aWork->isVisible(aCompRes) ? Visible : Hidden) : NoneState; std::list::const_iterator aIt; - //for (int i = 0; i < aCompRes->numberOfSubs(true); i++) { + ResultBodyPtr aCompSub; 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; - else if (aState != aS) { - aState = SemiVisible; - break; + ResultPtr aSubRes = (*aIt); + aCompSub = std::dynamic_pointer_cast(aSubRes); + if (!(aCompSub.get() && aCompSub->numberOfSubs() > 0)) { + VisibilityState aS = aWork->isVisible(aSubRes) ? Visible : Hidden; + if (aState == NoneState) + aState = aS; + else if (aState != aS) { + aState = SemiVisible; + break; + } } } return aState; @@ -187,24 +192,99 @@ PartSet_ObjectNode::VisibilityState PartSet_ObjectNode::visibilityState() const return NoneState; } -void PartSet_ObjectNode::update() +int PartSet_ObjectNode::numberOfSubs() const { ResultBodyPtr aCompRes = std::dynamic_pointer_cast(myObject); - if (aCompRes.get()) { - int aNb = aCompRes->numberOfSubs(true); + if (aCompRes.get()) + return aCompRes->numberOfSubs(true); + else { + CompositeFeaturePtr aCompFeature = + std::dynamic_pointer_cast(myObject); + if (aCompFeature.get() && aCompFeature->data()->isValid()) + return aCompFeature->numberOfSubs(true); + else { + ResultFieldPtr aFieldRes = std::dynamic_pointer_cast(myObject); + if (aFieldRes.get()) + return aFieldRes->stepsSize(); + } + } + return 0; +} + + +ObjectPtr PartSet_ObjectNode::subObject(int theId) const +{ + ResultBodyPtr aCompRes = std::dynamic_pointer_cast(myObject); + if (aCompRes.get()) + return aCompRes->subResult(theId, true); + else { + CompositeFeaturePtr aCompFeature = + std::dynamic_pointer_cast(myObject); + if (aCompFeature.get()) + return aCompFeature->subFeature(theId, true); + } + return ObjectPtr(); +} + +void PartSet_ObjectNode::update() +{ + int aNb = numberOfSubs(); + if (aNb > 0) { + ResultFieldPtr aFieldRes = std::dynamic_pointer_cast(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; + } + } + else { + ObjectPtr aObj; + ModuleBase_ITreeNode* aNode; + int aId = 0; + while (aId < myChildren.size()) { + aNode = myChildren.at(aId); + aObj = subObject(aId); + if (aNode->object() != aObj) { + myChildren.removeAll(aNode); + delete aNode; + } + else + aId++; + } + } + ModuleBase_ITreeNode* aNode; - ResultBodyPtr aBody; + ObjectPtr 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); + 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(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 @@ -216,30 +296,49 @@ void PartSet_ObjectNode::update() aNode->update(); } } + else { + deleteChildren(); + } } QTreeNodesList PartSet_ObjectNode::objectCreated(const QObjectPtrList& theObjects) { QTreeNodesList aResult; - - ResultBodyPtr aCompRes = std::dynamic_pointer_cast(myObject); - if (aCompRes.get()) { - int aNb = aCompRes->numberOfSubs(true); + int aNb = numberOfSubs(); + if (aNb > 0) { ModuleBase_ITreeNode* aNode; - ResultBodyPtr aBody; + ResultFieldPtr aFieldRes = std::dynamic_pointer_cast(myObject); + ObjectPtr 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); + 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(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); } } foreach(ModuleBase_ITreeNode* aNode, myChildren) { @@ -249,27 +348,43 @@ QTreeNodesList PartSet_ObjectNode::objectCreated(const QObjectPtrList& theObject return aResult; } -QTreeNodesList PartSet_ObjectNode::objectsDeleted(const DocumentPtr& theDoc, const QString& theGroup) +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) + int aNb = numberOfSubs(); + if (aNb != myChildren.size()) { + if (aNb == 0) { + deleteChildren(); 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++; + } + else { + // Delete extra objects + bool isDeleted = false; + ObjectPtr aObj; + ModuleBase_ITreeNode* aNode; + int aId = 0; + while (aId < myChildren.size()) { + aNode = myChildren.at(aId); + aObj = subObject(aId); + if (aNode->object() != aObj) { + myChildren.removeAll(aNode); + delete aNode; + isDeleted = true; + } + else + aId++; + } + if (isDeleted) + aResult.append(this); + int i = 0; + ObjectPtr aBody; + foreach(ModuleBase_ITreeNode* aNode, myChildren) { + aBody = subObject(i); + ((PartSet_ObjectNode*)aNode)->setObject(aBody); + aResult.append(aNode->objectsDeleted(theDoc, theGroup)); + i++; + } } } return aResult; @@ -327,6 +442,28 @@ QVariant PartSet_FolderNode::data(int theColumn, int theRole) const } } } + if ((theColumn == 2) && (theRole == Qt::DecorationRole)) { + if (document().get()) { + SessionPtr aSession = ModelAPI_Session::get(); + if (document() != aSession->activeDocument()) + return QIcon(); + + FeaturePtr aFeature = document()->currentFeature(true); + if (!aFeature.get()) { // There is no current feature + ModuleBase_ITreeNode* aLastFolder = 0; + foreach(ModuleBase_ITreeNode* aNode, parent()->children()) { + if (aNode->type() == PartSet_FolderNode::typeId()) + aLastFolder = aNode; + else + break; + } + if (aLastFolder == this) + return QIcon(":pictures/arrow.png"); + else + return QIcon(); + } + } + } return PartSet_TreeNode::data(theColumn, theRole); } @@ -424,6 +561,7 @@ QTreeNodesList PartSet_FolderNode::objectCreated(const QObjectPtrList& theObject ModuleBase_ITreeNode* aNode = createNode(aObj); aNewNodes[aIdx] = aNode; aResult.append(aNode); + aNode->update(); } } } @@ -457,19 +595,23 @@ QTreeNodesList PartSet_FolderNode::objectsDeleted(const DocumentPtr& theDoc, int aIndex; int aId = 0; bool aRemoved = false; + bool aToSort = false; while (aId < myChildren.size()) { ModuleBase_ITreeNode* aNode = myChildren.at(aId); aIndex = aDoc->index(aNode->object(), true); - if ((aIndex == -1) || (aId != aIndex)) { + aToSort |= ((aIndex != -1) && (aId != aIndex)); + if (aIndex == -1) { myChildren.removeAll(aNode); delete aNode; aRemoved = true; - } else + } + else aId++; } if (aRemoved) aResult.append(this); - + if (aToSort) + sortChildren(); foreach(ModuleBase_ITreeNode* aNode, myChildren) { aResult.append(aNode->objectsDeleted(theDoc, theGroup)); } @@ -481,12 +623,6 @@ QTreeNodesList PartSet_FolderNode::objectsDeleted(const DocumentPtr& theDoc, QTreeNodesList PartSet_FeatureFolderNode::objectCreated(const QObjectPtrList& theObjects) { QTreeNodesList aResult; - // Process all folders - foreach(ModuleBase_ITreeNode* aNode, myChildren) { - if (aNode->type() == PartSet_FolderNode::typeId()) { // aFolder node - aResult.append(aNode->objectCreated(theObjects)); - } - } // Process the root sub-objects DocumentPtr aDoc = document(); int aIdx = -1; @@ -496,14 +632,15 @@ QTreeNodesList PartSet_FeatureFolderNode::objectCreated(const QObjectPtrList& th 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); if (aIdx != -1) { + ModuleBase_ITreeNode* aNode = createNode(aObj); aIdx += aNb; bool aHasObject = (aIdx < myChildren.size()) && (myChildren.at(aIdx)->object() == aObj); if (!aHasObject) { aNewNodes[aIdx] = aNode; aResult.append(aNode); + aNode->update(); } } } @@ -525,9 +662,7 @@ QTreeNodesList PartSet_FeatureFolderNode::objectCreated(const QObjectPtrList& th // Update sub-folders foreach(ModuleBase_ITreeNode* aNode, myChildren) { - if ((aNode->type() == PartSet_ObjectFolderNode::typeId()) || - (aNode->type() == PartSet_PartRootNode::typeId())) - aResult.append(aNode->objectCreated(theObjects)); + aResult.append(aNode->objectCreated(theObjects)); } return aResult; } @@ -555,11 +690,13 @@ QTreeNodesList PartSet_FeatureFolderNode::objectsDeleted(const DocumentPtr& theD int aIndex; int aId = 0; bool aRemoved = false; + bool aToSort = 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 + aNb))) { + aToSort |= ((aIndex != -1) && (aId != (aIndex + aNb))); + if (aIndex == -1) { myChildren.removeAll(aNode); delete aNode; aRemoved = true; @@ -570,6 +707,8 @@ QTreeNodesList PartSet_FeatureFolderNode::objectsDeleted(const DocumentPtr& theD } if (aRemoved) aResult.append(this); + if (aToSort) + sortChildren(); } return aResult; } @@ -733,7 +872,7 @@ void PartSet_PartRootNode::update() // Remove extra sub-nodes int aIndex = -1; - int aId = 0; + int aId = aRows; while (aId < myChildren.size()) { ModuleBase_ITreeNode* aNode = myChildren.at(aId); if (aNode->object().get()) { @@ -784,20 +923,33 @@ QVariant PartSet_PartRootNode::data(int theColumn, int theRole) const case 1: switch (theRole) { case Qt::DisplayRole: + { + ResultPartPtr aPartRes = getPartResult(myObject); + if (aPartRes.get()) { + if (aPartRes->partDoc().get() == NULL) + return QString(myObject->data()->name().c_str()) + " (Not loaded)"; + } return QString(myObject->data()->name().c_str()); + } case Qt::DecorationRole: return ModuleBase_IconFactory::get()->getIcon(myObject); } case 2: - if (theRole == Qt::DecorationRole) + if (theRole == Qt::DecorationRole) { if (isCurrentFeature(myObject)) return QIcon(":pictures/arrow.png"); + else + return QIcon(); + } } return PartSet_TreeNode::data(theColumn, theRole); } Qt::ItemFlags PartSet_PartRootNode::flags(int theColumn) const { + if (myObject->isDisabled()) + return (theColumn == 2) ? Qt::ItemIsSelectable : aDefaultFlag; + SessionPtr aSession = ModelAPI_Session::get(); DocumentPtr aActiveDoc = aSession->activeDocument(); if ((aActiveDoc == document()) || (myObject->document() == aActiveDoc)) @@ -885,32 +1037,42 @@ void PartSet_ObjectFolderNode::update() } DocumentPtr aDoc = myObject->document(); - // Delete obsolete nodes - 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)) { + if (aNbItems < myChildren.size()) { + // Delete obsolete nodes + int aId = 0; + int aNbOfFeatures = aDoc->size(ModelAPI_Feature::group(), true); + while (aId < myChildren.size()) { + ModuleBase_ITreeNode* aNode = myChildren.at(aId); + if ((aFirst + aId) < aNbOfFeatures) { + if (aNode->object() != aDoc->object(ModelAPI_Feature::group(), aFirst + aId)) { + myChildren.removeAll(aNode); + delete aNode; + continue; + } + } + else { myChildren.removeAll(aNode); delete aNode; continue; } + aId++; } - aId++; } - - // Add new nodes - ModuleBase_ITreeNode* aNode; - for (int i = 0; i < aNbItems; i++) { - ObjectPtr aObj = aDoc->object(ModelAPI_Feature::group(), aFirst + i); - if (i < myChildren.size()) { - if (aObj != myChildren.at(i)->object()) { + if (aNbItems > myChildren.size()) { + // Add new nodes + ModuleBase_ITreeNode* aNode; + for (int i = 0; i < aNbItems; i++) { + ObjectPtr aObj = aDoc->object(ModelAPI_Feature::group(), aFirst + i); + if (i < myChildren.size()) { + if (aObj != myChildren.at(i)->object()) { + aNode = new PartSet_ObjectNode(aObj, this); + myChildren.insert(i, aNode); + } + } + else { aNode = new PartSet_ObjectNode(aObj, this); - myChildren.insert(i, aNode); + myChildren.append(aNode); } - } else { - aNode = new PartSet_ObjectNode(aObj, this); - myChildren.append(aNode); } } } @@ -960,13 +1122,17 @@ QTreeNodesList PartSet_ObjectFolderNode::objectsDeleted(const DocumentPtr& theDo if (!aNbItems) { return aResult; } + if (aNbItems >= myChildren.size()) // Nothing was deleted here + return aResult; + DocumentPtr aDoc = myObject->document(); // Delete obsolete nodes bool aRemoved = false; int aId = 0; + int aNbOfFeatures = aDoc->size(ModelAPI_Feature::group(), true); while (aId < myChildren.size()) { ModuleBase_ITreeNode* aNode = myChildren.at(aId); - if ((aFirst + aId) < aDoc->size(ModelAPI_Feature::group(), true)) { + if ((aFirst + aId) < aNbOfFeatures) { if (aNode->object() != aDoc->object(ModelAPI_Feature::group(), aFirst + aId)) { myChildren.removeAll(aNode); delete aNode; @@ -974,6 +1140,12 @@ QTreeNodesList PartSet_ObjectFolderNode::objectsDeleted(const DocumentPtr& theDo continue; } } + else { + myChildren.removeAll(aNode); + delete aNode; + aRemoved = true; + continue; + } aId++; } if (aRemoved) { @@ -1013,78 +1185,14 @@ void PartSet_ObjectFolderNode::getFirstAndLastIndex(int& theFirst, int& theLast) ////////////////////////////////////////////////////////////////////////////////// -//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 +QVariant PartSet_StepNode::data(int theColumn, int theRole) const +{ + if ((theColumn == 1) && (theRole == Qt::DisplayRole)) { + ModelAPI_ResultField::ModelAPI_FieldStep* aStep = + dynamic_cast(myEntity); + + return "Step " + QString::number(aStep->id() + 1) + " " + + aStep->field()->textLine(aStep->id()).c_str(); + } + return PartSet_TreeNode::data(theColumn, theRole); +}