X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModelAPI%2FModelAPI_Feature.cpp;h=5b9d7e3d4e0f3da971bd37d24dd6347179928f9f;hb=f5c7bb3100ed321392da42f61c2ab505833ec61a;hp=1fe0244f0d91aa4a654cf10bdf77d4a00668f4f3;hpb=a38f270b638caaae45d18674b48b8b7479e2ee26;p=modules%2Fshaper.git diff --git a/src/ModelAPI/ModelAPI_Feature.cpp b/src/ModelAPI/ModelAPI_Feature.cpp index 1fe0244f0..5b9d7e3d4 100644 --- a/src/ModelAPI/ModelAPI_Feature.cpp +++ b/src/ModelAPI/ModelAPI_Feature.cpp @@ -17,7 +17,7 @@ const std::list >& ModelAPI_Feature::results() return myResults; } -std::shared_ptr ModelAPI_Feature::firstResult() +std::shared_ptr ModelAPI_Feature::firstResult() const { return myResults.empty() ? std::shared_ptr() : *(myResults.begin()); } @@ -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(); @@ -47,9 +46,6 @@ void ModelAPI_Feature::setResult(const std::shared_ptr& theResu } // in any case result becomes enabled theResult->setDisabled(theResult, false); - // flush vidualisation changes - static Events_ID aRedispEvent = aLoop->eventByName(EVENT_OBJECT_TO_REDISPLAY); - aLoop->flush(aRedispEvent); } void ModelAPI_Feature::setResult(const std::shared_ptr& theResult, @@ -65,10 +61,6 @@ void ModelAPI_Feature::setResult(const std::shared_ptr& theResu *aResIter = theResult; } theResult->setDisabled(theResult, false); - // 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::removeResult(const std::shared_ptr& theResult) @@ -80,26 +72,52 @@ void ModelAPI_Feature::removeResult(const std::shared_ptr& theR aLoop->flush(aRedispEvent); } +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->setDisabled(aRes, true); // for complex results to disable all subs + 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(); + aECreator->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); - } else { + //if (theSinceIndex == 0 && (*aNextIter)->isDisabled()) { + // aNextIter = myResults.erase(aNextIter); + //} else { (*aNextIter)->setDisabled(*aNextIter, true); // just disable results aNextIter++; - } + //} } - if (theFlush) { + 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); } } @@ -117,15 +135,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(); } @@ -171,12 +194,37 @@ bool ModelAPI_Feature::setDisabled(const bool theFlag) return false; } -bool ModelAPI_Feature::isDisabled() const +bool ModelAPI_Feature::isDisabled() { return myIsDisabled; } +bool ModelAPI_Feature::setStable(const bool theFlag) +{ + if (myIsStable != theFlag) { + myIsStable = theFlag; + // send an event about the stability change (editing is started/finished) + static Events_Loop* aLoop = Events_Loop::loop(); + static Events_ID EVENT_STAB = aLoop->eventByName(EVENT_STABILITY_CHANGED); + std::shared_ptr aMessage(new Events_Message(EVENT_STAB, this)); + aLoop->send(aMessage, false); + return true; + } + return false; +} + +bool ModelAPI_Feature::isStable() +{ + return myIsStable; +} + bool ModelAPI_Feature::isPreviewNeeded() const { return true; } + +void ModelAPI_Feature::init() +{ + myIsDisabled = false; + myIsStable = true; +}