X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModelAPI%2FModelAPI_Feature.cpp;h=3c78c82d0a254403579b4068b47877724efb30d6;hb=4af82842098757e6e7f4f28e2eb744d184bb2b3e;hp=3002d889e840e5358a867786c069d17b1a23e13a;hpb=83bbce5aee090aed21034874cd38c0c838f1733f;p=modules%2Fshaper.git diff --git a/src/ModelAPI/ModelAPI_Feature.cpp b/src/ModelAPI/ModelAPI_Feature.cpp index 3002d889e..3c78c82d0 100644 --- a/src/ModelAPI/ModelAPI_Feature.cpp +++ b/src/ModelAPI/ModelAPI_Feature.cpp @@ -29,7 +29,6 @@ std::shared_ptr ModelAPI_Feature::lastResult() void ModelAPI_Feature::setResult(const std::shared_ptr& theResult) { - static Events_Loop* aLoop = Events_Loop::loop(); static Events_ID EVENT_UPD = Events_Loop::eventByName(EVENT_OBJECT_UPDATED); static const ModelAPI_EventCreator* aECreator = ModelAPI_EventCreator::get(); @@ -45,7 +44,7 @@ void ModelAPI_Feature::setResult(const std::shared_ptr& theResu } else { myResults.push_back(theResult); } - // in any case result decomes enabled + // in any case result becomes enabled theResult->setDisabled(theResult, false); } @@ -67,15 +66,42 @@ void ModelAPI_Feature::setResult(const std::shared_ptr& theResu void ModelAPI_Feature::removeResult(const std::shared_ptr& theResult) { theResult->setDisabled(theResult, true); + // flush visualisation changes + static Events_Loop* aLoop = Events_Loop::loop(); + static Events_ID aRedispEvent = aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY); + aLoop->flush(aRedispEvent); } -void ModelAPI_Feature::removeResults(const int theSinceIndex) +void ModelAPI_Feature::eraseResultFromList(const std::shared_ptr& theResult) +{ + std::list >::iterator aResIter = myResults.begin(); + for(; aResIter != myResults.end(); aResIter++) { + ResultPtr aRes = *aResIter; + if (aRes == theResult) { + std::string aGroup = aRes->groupName(); + aRes->data()->erase(); + myResults.erase(aResIter); + + static Events_Loop* aLoop = Events_Loop::loop(); + static Events_ID EVENT_DISP = aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY); + static const ModelAPI_EventCreator* aECreator = ModelAPI_EventCreator::get(); + ModelAPI_EventCreator::get()->sendDeleted(document(), aGroup); + aECreator->sendUpdated(aRes, EVENT_DISP); + break; + } + } +} + +void ModelAPI_Feature::removeResults(const int theSinceIndex, const bool theFlush) { std::list >::iterator aResIter = myResults.begin(); for(int anIndex = 0; anIndex < theSinceIndex && aResIter != myResults.end(); anIndex++) aResIter++; + + std::string aGroup; std::list >::iterator aNextIter = aResIter; while( aNextIter != myResults.end()) { + aGroup = (*aNextIter)->groupName(); // remove previously erased results: to enable later if needed only actual (of history change) if (theSinceIndex == 0 && (*aNextIter)->isDisabled()) { aNextIter = myResults.erase(aNextIter); @@ -84,6 +110,14 @@ void ModelAPI_Feature::removeResults(const int theSinceIndex) aNextIter++; } } + if (!aGroup.empty() && theFlush) { + // flush visualisation changes + static Events_Loop* aLoop = Events_Loop::loop(); + static Events_ID aRedispEvent = aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY); + aLoop->flush(aRedispEvent); + static Events_ID aDelEvent = aLoop->eventByName(EVENT_OBJECT_DELETED); + aLoop->flush(aDelEvent); + } } void ModelAPI_Feature::eraseResults() @@ -100,15 +134,20 @@ const std::string& ModelAPI_Feature::documentToAdd() void ModelAPI_Feature::erase() { + // if this is the current feature, make the upper feature as current before removing + if (document().get() && document()->currentFeature(false).get() == this) { + document()->setCurrentFeatureUp(); + } + static Events_Loop* aLoop = Events_Loop::loop(); static Events_ID EVENT_DISP = aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY); static const ModelAPI_EventCreator* aECreator = ModelAPI_EventCreator::get(); while (!myResults.empty()) { // remove one by one with messages std::shared_ptr aRes = *(myResults.begin()); - myResults.erase(myResults.begin()); - aECreator->sendDeleted(aRes->document(), aRes->groupName()); - aECreator->sendUpdated(aRes, EVENT_DISP); + aRes->setDisabled(aRes, true); // to avoid activation of the Part result + if (!myResults.empty()) // disabling result may erase the list (on undo of Part, issue 665) + myResults.erase(myResults.begin()); } ModelAPI_Object::erase(); } @@ -131,7 +170,6 @@ FeaturePtr ModelAPI_Feature::feature(ObjectPtr theObject) return aFeature; } - bool ModelAPI_Feature::isMacro() const { return false; @@ -142,12 +180,12 @@ bool ModelAPI_Feature::setDisabled(const bool theFlag) if (myIsDisabled != theFlag) { myIsDisabled = theFlag; if (myIsDisabled) { - eraseResults(); + removeResults(0, false); // flush will be in setCurrentFeature } else { // enable all disabled previously results std::list >::iterator aResIter = myResults.begin(); for(; aResIter != myResults.end(); aResIter++) { - (*aResIter)->setDisabled(*aResIter, false); // just enable results + (*aResIter)->setDisabled(*aResIter, false); } } return true;