X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_WorkshopListener.cpp;h=4f8d3c09c8b398875849778538fbb057a7c1c3af;hb=4de8d53fef7532b6843d79c970f55ad46f98da62;hp=7701c221b70b1375a1764282380bbd044b4063f3;hpb=39bb14c5ae7df11b8c788ab0037ba5b893267204;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_WorkshopListener.cpp b/src/XGUI/XGUI_WorkshopListener.cpp old mode 100755 new mode 100644 index 7701c221b..4f8d3c09c --- a/src/XGUI/XGUI_WorkshopListener.cpp +++ b/src/XGUI/XGUI_WorkshopListener.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// Copyright (C) 2014-2024 CEA, EDF // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -12,10 +12,9 @@ // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or -// email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // #include "XGUI_WorkshopListener.h" @@ -39,6 +38,7 @@ #include #include #include +#include #include #include @@ -50,6 +50,9 @@ #include #include +#include +#include + #include "XGUI_ActionsMgr.h" #include "XGUI_Displayer.h" #include "XGUI_ErrorMgr.h" @@ -57,7 +60,6 @@ #include "XGUI_OperationMgr.h" #include "XGUI_ModuleConnector.h" #include "XGUI_PropertyPanel.h" - #include "XGUI_QtEvents.h" #include "XGUI_SalomeConnector.h" #include "XGUI_SelectionMgr.h" @@ -73,6 +75,10 @@ #include #endif +#ifdef WIN32 +#pragma warning(disable : 4189) // for declaration of unused variables (MAYBE_UNUSED) +#endif + //#define DEBUG_FEATURE_CREATED //#define DEBUG_FEATURE_REDISPLAY //#define DEBUG_FEATURE_UPDATED @@ -86,7 +92,6 @@ XGUI_WorkshopListener::XGUI_WorkshopListener(XGUI_Workshop* theWorkshop) : myWorkshop(theWorkshop), myUpdatePrefs(false) { - XGUI_OperationMgr* anOperationMgr = workshop()->operationMgr(); } //****************************************************** @@ -103,6 +108,7 @@ void XGUI_WorkshopListener::initializeEventListening() aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_UPDATED)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_CREATED)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); + aLoop->registerListener(this, Events_Loop::eventByName(EVENT_VISUAL_ATTRIBUTES)); aLoop->registerListener(this, Events_LongOp::eventID()); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_PLUGIN_LOADED)); @@ -115,6 +121,7 @@ void XGUI_WorkshopListener::initializeEventListening() aLoop->registerListener(this, Events_Loop::eventByName("AbortOperation")); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_AUTOMATIC_RECOMPUTATION_ENABLE)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_AUTOMATIC_RECOMPUTATION_DISABLE)); + aLoop->registerListener(this, ModelAPI_ObjectRenamedMessage::eventId()); } //****************************************************** @@ -149,8 +156,32 @@ void XGUI_WorkshopListener::processEvent(const std::shared_ptr& // Redisplay feature else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY)) { std::shared_ptr aUpdMsg = - std::dynamic_pointer_cast(theMessage); + std::dynamic_pointer_cast(theMessage); onFeatureRedisplayMsg(aUpdMsg); + } + else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_VISUAL_ATTRIBUTES)) { + std::shared_ptr aUpdMsg = + std::dynamic_pointer_cast(theMessage); + std::set aObjList = aUpdMsg->objects(); + std::set::const_iterator aIt; + std::list::const_iterator aResIt; + XGUI_Displayer* aDisplayer = workshop()->displayer(); + AISObjectPtr aAIS; + for (aIt = aObjList.begin(); aIt != aObjList.end(); ++aIt) { + FeaturePtr aFeature = std::dynamic_pointer_cast(*aIt); + if (aFeature) { + aAIS = aDisplayer->getAISObject(aFeature); + if (aAIS.get()) + workshop()->module()->customizePresentation(aFeature, aAIS); + + std::list aResults = aFeature->results(); + for (aResIt = aResults.begin(); aResIt != aResults.end(); ++aResIt) { + aAIS = aDisplayer->getAISObject(*aResIt); + if (aAIS.get()) + workshop()->module()->customizePresentation(*aResIt, aAIS); + } + } + } } else if (theMessage->eventID() == Events_Loop::eventByName(EVENT_EMPTY_AIS_PRESENTATION)) { std::shared_ptr aUpdMsg = std::dynamic_pointer_cast(theMessage); @@ -163,10 +194,14 @@ void XGUI_WorkshopListener::processEvent(const std::shared_ptr& if (aWidgetSelector) workshop()->selector()->setSelected(aWidgetSelector->getAttributeSelection()); } - } else if (theMessage->eventID() == Events_Loop::eventByName("FinishOperation")/* || - theMessage->eventID() == Events_Loop::eventByName("AbortOperation")*/) - workshop()->facesPanel()->reset(false); // do not flush redisplay, it is flushed after event - + } + else if (theMessage->eventID() == Events_Loop::eventByName("FinishOperation")/* || + theMessage->eventID() == Events_Loop::eventByName("AbortOperation")*/) + { + XGUI_FacesPanel* aFacesPanel = workshop()->facesPanel(); + if (aFacesPanel) + aFacesPanel->reset(false); // do not flush redisplay, it is flushed after event + } //Update property panel on corresponding message. If there is no current operation (no //property panel), or received message has different feature to the current - do nothing. else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_UPDATED)) { @@ -186,11 +221,16 @@ void XGUI_WorkshopListener::processEvent(const std::shared_ptr& // the viewer's update context is unblocked, the viewer's update works XGUI_Displayer* aDisplayer = workshop()->displayer(); aDisplayer->enableUpdateViewer(true); - } else if ((theMessage->eventID() == + } + else if ((theMessage->eventID() == Events_Loop::eventByName(EVENT_AUTOMATIC_RECOMPUTATION_ENABLE)) || (theMessage->eventID() == Events_Loop::eventByName(EVENT_AUTOMATIC_RECOMPUTATION_DISABLE))) { myWorkshop->updateAutoComputeState(); + } + else if (theMessage->eventID() == ModelAPI_ObjectRenamedMessage::eventId()) { + myWorkshop->updateGroupsText(); + myWorkshop->displayer()->updateViewer(); } else { //Show error dialog if error message received. std::shared_ptr anIngfoMsg = @@ -273,6 +313,7 @@ void XGUI_WorkshopListener:: // Hide the object if it is invalid or concealed one bool aHide = !aObj->data() || !aObj->data()->isValid() || aObj->isDisabled() || (!aObj->isDisplayed()); + if (!aHide) { // check that this is not hidden result ResultPtr aRes = std::dynamic_pointer_cast(aObj); aHide = aRes && aRes->isConcealed(); @@ -348,16 +389,19 @@ void XGUI_WorkshopListener:: } } } + // this processing should be moved in another place in order to do not cause problems in // flush messages chain //if (aHiddenObjects.size() > 0) // myWorkshop->module()->processHiddenObject(aHiddenObjects); - bool isCustomized = customizeCurrentObject(anObjects, aRedisplayed); + bool isCustomized = customizeFeature(anObjects, aRedisplayed); if (aRedisplayed || isCustomized) { Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_EMPTY_AIS_PRESENTATION)); - aDisplayer->updateViewer(); + // Do not update viewer here because it can be called in a loop + // In this case Update has to be called after redisplay event + //aDisplayer->updateViewer(); } } @@ -365,6 +409,14 @@ void XGUI_WorkshopListener:: void XGUI_WorkshopListener:: onFeatureCreatedMsg(const std::shared_ptr& theMsg) { + bool isLoadedScript = false; + SUIT_Session* aSession = SUIT_Session::session(); + if (aSession) + { + QVariant aVar = aSession->activeApplication()->property("IsLoadedScript"); + isLoadedScript = !aVar.isNull() && aVar.toBool(); + } + std::set anObjects = theMsg->objects(); std::set::const_iterator aIt; #ifdef DEBUG_FEATURE_CREATED @@ -385,42 +437,26 @@ void XGUI_WorkshopListener:: #ifdef DEBUG_RESULT_COMPSOLID ResultPtr aRes = std::dynamic_pointer_cast(anObject); if (aRes.get()) { - ResultCompSolidPtr aCompSolidRes = std::dynamic_pointer_cast(aRes); + ResultCompSolidPtr aCompSolidRes = + std::dynamic_pointer_cast(aRes); if (aCompSolidRes.get()) { - qDebug(QString("COMPSOLID, numberOfSubs = %1") - .arg(aCompSolidRes->numberOfSubs()).toStdString().c_str()); + qDebug(QString("COMPSOLID, numberOfSubs = %1") + .arg(aCompSolidRes->numberOfSubs()).toStdString().c_str()); } if (ModelAPI_Tools::compSolidOwner(aRes)) qDebug("COMPSOLID sub-object"); } #endif - // the validity of the data should be checked here in order to avoid display of the objects, - // which were created, then deleted, but flush for the creation event happens after that - // we should not display disabled objects - bool aHide = !anObject->data()->isValid() || - anObject->isDisabled() || - !anObject->isDisplayed(); - if (!aHide) { // check that this is not hidden result - ResultPtr aRes = std::dynamic_pointer_cast(anObject); - bool isConcealed = aRes && aRes->isConcealed(); - aHide = aRes && aRes->isConcealed(); - // Hide the presentation with an empty shape. But isDisplayed state of the object should not - // be changed to the object becomes visible when the shape becomes not empty - if (!aHide && aRes.get()) - aHide = !aRes->shape().get() || aRes->shape()->isNull(); - } - if (!aHide) { - // setDisplayed has to be called in order to synchronize internal state of the object - // with list of displayed objects - if (myWorkshop->module()->canDisplayObject(anObject)) { - anObject->setDisplayed(true); - aDisplayed = displayObject(anObject); - } else - anObject->setDisplayed(false); - } + + ResultBodyPtr aRes = std::dynamic_pointer_cast(anObject); + if (aRes.get() && aRes->numberOfSubs() > 0) + for (int anIndex = 0; anIndex < aRes->numberOfSubs(); ++anIndex) + setDisplayed(aRes->subResult(anIndex), isLoadedScript, aDisplayed); + else + setDisplayed(anObject, isLoadedScript, aDisplayed); } - bool isCustomized = customizeCurrentObject(anObjects, aDisplayed); + MAYBE_UNUSED bool isCustomized = customizeFeature(anObjects, aDisplayed); //if (myObjectBrowser) // myObjectBrowser->processEvent(theMsg); @@ -494,11 +530,10 @@ bool XGUI_WorkshopListener::displayObject(ObjectPtr theObj) return aDisplayed; XGUI_Displayer* aDisplayer = aWorkshop->displayer(); - int aNb = aDisplayer->objectsCount(); return aDisplayer->display(theObj, false); } -bool XGUI_WorkshopListener::customizeCurrentObject(const std::set& theObjects, +bool XGUI_WorkshopListener::customizeFeature(const std::set& theObjects, bool theForceRedisplay) { XGUI_OperationMgr* anOperationMgr = workshop()->operationMgr(); @@ -518,11 +553,11 @@ bool XGUI_WorkshopListener::customizeCurrentObject(const std::set& th // the feature is hidden, but arguments of the feature are modified // e.g. extrusion is hidden(h=0) but sketch is chosen if (theForceRedisplay || theObjects.find(aCurrentFeature) != theObjects.end()) { - aCustomized = myWorkshop->module()->customizeObject(aCurrentFeature, + aCustomized = myWorkshop->module()->customizeFeature(aCurrentFeature, ModuleBase_IModule::CustomizeArguments, false) || aCustomized; - aCustomized = myWorkshop->module()->customizeObject(aCurrentFeature, + aCustomized = myWorkshop->module()->customizeFeature(aCurrentFeature, ModuleBase_IModule::CustomizeResults, false) || aCustomized; - aCustomized = myWorkshop->module()->customizeObject(aCurrentFeature, + aCustomized = myWorkshop->module()->customizeFeature(aCurrentFeature, ModuleBase_IModule::CustomizeHighlightedObjects, false) || aCustomized; } } @@ -533,3 +568,37 @@ XGUI_Workshop* XGUI_WorkshopListener::workshop() const { return myWorkshop; } + + +void XGUI_WorkshopListener::setDisplayed( + ObjectPtr theObject, const bool theIsLoadedScript, bool& theDisplayed) +{ + if (theIsLoadedScript) { + theObject->setDisplayed(theDisplayed); + return; + } + // the validity of the data should be checked here in order to avoid display of the objects, + // which were created, then deleted, but flush for the creation event happens after that + // we should not display disabled objects + bool aHide = !theObject->data()->isValid() || + theObject->isDisabled() || + !theObject->isDisplayed(); + if (!aHide) { // check that this is not hidden result + ResultPtr aRes = std::dynamic_pointer_cast(theObject); + aHide = aRes && aRes->isConcealed(); + // Hide the presentation with an empty shape. But isDisplayed state of the object should not + // be changed to the object becomes visible when the shape becomes not empty + if (!aHide && aRes.get()) + aHide = !aRes->shape().get() || aRes->shape()->isNull(); + } + if (!aHide) { + // setDisplayed has to be called in order to synchronize internal state of the object + // with list of displayed objects + if (myWorkshop->module()->canDisplayObject(theObject)) { + theObject->setDisplayed(true); + theDisplayed = displayObject(theObject); + } + else + theObject->setDisplayed(false); + } +}