X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_WorkshopListener.cpp;h=570ebbf239ff1b2665e0369399d28ec5550ef27b;hb=b070f5d30325537aa8cf883a55f8d3315115c384;hp=685961c46fc2d5595cb3a117122ac0014066b2ea;hpb=1152a6ea27665deb0564e72c6c47ac10de91e5d9;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_WorkshopListener.cpp b/src/XGUI/XGUI_WorkshopListener.cpp index 685961c46..570ebbf23 100755 --- a/src/XGUI/XGUI_WorkshopListener.cpp +++ b/src/XGUI/XGUI_WorkshopListener.cpp @@ -3,6 +3,7 @@ #include "XGUI_WorkshopListener.h" #include "XGUI_Workshop.h" #include "XGUI_Displayer.h" +#include "XGUI_ErrorMgr.h" #include "XGUI_OperationMgr.h" #include "XGUI_SalomeConnector.h" #include "XGUI_ActionsMgr.h" @@ -37,6 +38,7 @@ #include #include +#include #include #include #include @@ -44,6 +46,7 @@ #include #include #include +#include #include #include @@ -57,11 +60,16 @@ //#define DEBUG_FEATURE_CREATED //#define DEBUG_FEATURE_REDISPLAY +//#define DEBUG_FEATURE_UPDATED +//#define DEBUG_RESULT_COMPSOLID XGUI_WorkshopListener::XGUI_WorkshopListener(ModuleBase_IWorkshop* theWorkshop) : myWorkshop(theWorkshop), myUpdatePrefs(false) { + XGUI_OperationMgr* anOperationMgr = workshop()->operationMgr(); + //connect(anOperationMgr, SIGNAL(nestedStateChanged(const std::string&, const bool)), + // this, SLOT(onNestedStateChanged(const std::string&, const bool))); } //****************************************************** @@ -83,6 +91,7 @@ void XGUI_WorkshopListener::initializeEventListening() aLoop->registerListener(this, Events_LongOp::eventID()); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_PLUGIN_LOADED)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_SELFILTER_LOADED)); + aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_ERROR_CHANGED)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_UPDATE_VIEWER_BLOCKED)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_UPDATE_VIEWER_UNBLOCKED)); @@ -152,7 +161,9 @@ void XGUI_WorkshopListener::processEvent(const std::shared_ptr& XGUI_OperationMgr* anOperationMgr = workshop()->operationMgr(); if (anOperationMgr->startOperation(anOperation)) { - workshop()->propertyPanel()->updateContentWidget(anOperation->feature()); + ModuleBase_OperationFeature* aFOperation = dynamic_cast(anOperation); + if (aFOperation) + workshop()->propertyPanel()->updateContentWidget(aFOperation->feature()); if (!anOperation->getDescription()->hasXmlRepresentation()) { if (anOperation->commit()) workshop()->updateCommandStatus(); @@ -177,6 +188,14 @@ void XGUI_WorkshopListener::processEvent(const std::shared_ptr& XGUI_Displayer* aDisplayer = workshop()->displayer(); aDisplayer->enableUpdateViewer(true); aDisplayer->updateViewer(); + } else if (theMessage->eventID() == Events_Loop::eventByName(EVENT_OBJECT_ERROR_CHANGED)) { + std::shared_ptr aUpdMsg = + std::dynamic_pointer_cast(theMessage); + std::set aObjects = aUpdMsg->objects(); + std::set::const_iterator aIt; + for (aIt = aObjects.begin(); aIt != aObjects.end(); ++aIt) { + workshop()->errorMgr()->updateActions(ModelAPI_Feature::feature(*aIt)); + } } else { //Show error dialog if error message received. std::shared_ptr anAppError = std::dynamic_pointer_cast(theMessage); @@ -194,22 +213,38 @@ void XGUI_WorkshopListener::processEvent(const std::shared_ptr& } //****************************************************** -void XGUI_WorkshopListener::onFeatureUpdatedMsg(const std::shared_ptr& theMsg) +void XGUI_WorkshopListener::onFeatureUpdatedMsg( + const std::shared_ptr& theMsg) { +#ifdef DEBUG_FEATURE_UPDATED + std::set aObjects = theMsg->objects(); + std::set::const_iterator aIt; + QStringList anInfo; + for (aIt = aObjects.begin(); aIt != aObjects.end(); ++aIt) { + anInfo.append(ModuleBase_Tools::objectInfo((*aIt))); + } + QString anInfoStr = anInfo.join(";\t"); + qDebug(QString("onFeatureUpdatedMsg: %1, %2").arg(aObjects.size()).arg(anInfoStr).toStdString().c_str()); +#endif std::set aFeatures = theMsg->objects(); XGUI_OperationMgr* anOperationMgr = workshop()->operationMgr(); if (anOperationMgr->hasOperation()) { - FeaturePtr aCurrentFeature = anOperationMgr->currentOperation()->feature(); - std::set::const_iterator aIt; - for (aIt = aFeatures.begin(); aIt != aFeatures.end(); ++aIt) { - ObjectPtr aNewFeature = (*aIt); - if (aNewFeature == aCurrentFeature) { - workshop()->propertyPanel()->updateContentWidget(aCurrentFeature); - break; + ModuleBase_OperationFeature* aFOperation = dynamic_cast + (anOperationMgr->currentOperation()); + if (aFOperation) { + FeaturePtr aCurrentFeature = aFOperation->feature(); + std::set::const_iterator aIt; + for (aIt = aFeatures.begin(); aIt != aFeatures.end(); ++aIt) { + ObjectPtr aNewFeature = (*aIt); + if (aNewFeature == aCurrentFeature) { + workshop()->propertyPanel()->updateContentWidget(aCurrentFeature); + break; + } } } } - anOperationMgr->onValidateOperation(); + //anOperationMgr->onValidateOperation(); + //if (myObjectBrowser) // myObjectBrowser->processEvent(theMsg); } @@ -231,6 +266,7 @@ void XGUI_WorkshopListener::onFeatureRedisplayMsg(const std::shared_ptrdisplayer(); + bool aRedisplayed = false; for (aIt = aObjects.begin(); aIt != aObjects.end(); ++aIt) { ObjectPtr aObj = (*aIt); @@ -241,14 +277,25 @@ void XGUI_WorkshopListener::onFeatureRedisplayMsg(const std::shared_ptr(aObj); aHide = aRes && aRes->isConcealed(); } +#ifdef DEBUG_RESULT_COMPSOLID + ResultPtr aRes = std::dynamic_pointer_cast(aObj); + if (aRes.get()) { + ResultCompSolidPtr aCompSolidRes = std::dynamic_pointer_cast(aRes); + if (aCompSolidRes.get()) { + qDebug(QString("COMPSOLID, numberOfSubs = %1").arg(aCompSolidRes->numberOfSubs()).toStdString().c_str()); + } + if (ModelAPI_Tools::compSolidOwner(aRes)) + qDebug("COMPSOLID sub-object"); + } +#endif if (aHide) { - aDisplayer->erase(aObj, false); + aRedisplayed = aDisplayer->erase(aObj, false) || aRedisplayed; #ifdef DEBUG_FEATURE_REDISPLAY // Redisplay the visible object or the object of the current operation bool isVisibleObject = aDisplayer->isVisible(aObj); QString anObjInfo = ModuleBase_Tools::objectInfo((aObj)); - qDebug(QString("visible=%1 : erase = %2").arg(isVisibleObject).arg(anObjInfo).toStdString().c_str()); + //qDebug(QString("visible=%1 : erase = %2").arg(isVisibleObject).arg(anObjInfo).toStdString().c_str()); #endif } else { @@ -271,22 +318,26 @@ void XGUI_WorkshopListener::onFeatureRedisplayMsg(const std::shared_ptr(aObj))) { - aDisplayer->erase(aObj, false); + aRedisplayed = aDisplayer->erase(aObj, false) || aRedisplayed; } else { - aDisplayer->redisplay(aObj, false); + aRedisplayed = aDisplayer->redisplay(aObj, false) || aRedisplayed; // Deactivate object of current operation from selection aWorkshop->deactivateActiveObject(aObj, false); } } else { // display object if the current operation has it if (displayObject(aObj)) { + aRedisplayed = true; // Deactivate object of current operation from selection aWorkshop->deactivateActiveObject(aObj, false); } } } } - aDisplayer->updateViewer(); + if (aRedisplayed) { + customizeCurrentObject(); + aDisplayer->updateViewer(); + } } //****************************************************** void XGUI_WorkshopListener::onFeatureCreatedMsg(const std::shared_ptr& theMsg) @@ -303,9 +354,21 @@ void XGUI_WorkshopListener::onFeatureCreatedMsg(const std::shared_ptr(anObject); + if (aRes.get()) { + ResultCompSolidPtr aCompSolidRes = std::dynamic_pointer_cast(aRes); + if (aCompSolidRes.get()) { + 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 @@ -317,20 +380,47 @@ void XGUI_WorkshopListener::onFeatureCreatedMsg(const std::shared_ptrmodule()->canDisplayObject(anObject)) { anObject->setDisplayed(true); - isDisplayed = displayObject(*aIt); + aDisplayed = displayObject(*aIt); } else anObject->setDisplayed(false); } } + //if (myObjectBrowser) // myObjectBrowser->processEvent(theMsg); - if (isDisplayed) + if (aDisplayed) { + customizeCurrentObject(); workshop()->displayer()->updateViewer(); + } //if (aHasPart) { // TODO: Avoid activate last part on loading of document // activateLastPart(); //} } +/*void XGUI_WorkshopListener::onNestedStateChanged(const std::string& theFeatureId, const bool theState) +{ + XGUI_Workshop* aWorkshop = workshop(); + + //one button is used for all features, which can have nested actions, so it is obtained from + // the action manager + //bool aActionToBeUpdated = aWorkshop->isFeatureOfNested(theFeatureId); + if (aWorkshop->isSalomeMode()) { + XGUI_SalomeConnector* aSalomeConnector = aWorkshop->salomeConnector(); + XGUI_ActionsMgr* anActionsMgr = aWorkshop->actionsMgr(); + if (aSalomeConnector->isFeatureOfNested(anActionsMgr->action(theFeatureId.c_str()))) + aActionToBeUpdated = true; + } else { + AppElements_MainMenu* aMenuBar = aWorkshop->mainWindow()->menuObject(); + AppElements_Command* aCommand = aMenuBar->feature(theFeatureId.c_str()); + if (aCommand && aCommand->button()->additionalButtonWidget()) + aActionToBeUpdated = true; + } + if (aActionToBeUpdated) { + QAction* anAcceptAllAction = aWorkshop->actionsMgr()->operationStateAction(XGUI_ActionsMgr::AcceptAll, NULL); + anAcceptAllAction->setEnabled(theState); + } +}*/ + bool XGUI_WorkshopListener::event(QEvent * theEvent) { PostponeMessageQtEvent* aPostponedEv = dynamic_cast(theEvent); @@ -365,12 +455,12 @@ void XGUI_WorkshopListener::addFeature(const std::shared_ptractionsWhenNested()); XGUI_OperationMgr* anOperationMgr = aWorkshop->operationMgr(); XGUI_ActionsMgr* anActionsMgr = aWorkshop->actionsMgr(); - if (aNestedActions.contains("accept")) { + if (aNestedActions.contains(FEATURE_WHEN_NESTED_ACCEPT)) { QAction* anAction = anActionsMgr->operationStateAction(XGUI_ActionsMgr::AcceptAll, NULL); connect(anAction, SIGNAL(triggered()), anOperationMgr, SLOT(commitAllOperations())); aNestedActList << anAction; } - if (aNestedActions.contains("abort")) { + if (aNestedActions.contains(FEATURE_WHEN_NESTED_ABORT)) { QAction* anAction = anActionsMgr->operationStateAction(XGUI_ActionsMgr::AbortAll, NULL); connect(anAction, SIGNAL(triggered()), anOperationMgr, SLOT(abortAllOperations())); aNestedActList << anAction; @@ -381,7 +471,7 @@ void XGUI_WorkshopListener::addFeature(const std::shared_ptrsalomeConnector(); QAction* aAction; if (isColumnButton) { - aAction = aSalomeConnector->addNestedFeature(aWchName, aFeatureInfo, aNestedActList); + aAction = aSalomeConnector->addFeatureOfNested(aWchName, aFeatureInfo, aNestedActList); } else { //Issue #650: in the SALOME mode the tooltip should be same as text aFeatureInfo.toolTip = aFeatureInfo.text; @@ -429,23 +519,50 @@ void XGUI_WorkshopListener::addFeature(const std::shared_ptr(theObj); + if (aRes.get() && (ModelAPI_Tools::hasSubResults(aRes) || ModelAPI_Tools::compSolidOwner(aRes))) { + ResultCompSolidPtr aCompSolidRes = std::dynamic_pointer_cast(aRes); + if (aCompSolidRes.get()) { + qDebug("COMPSOLID: displayObject"); + } + } +#endif + + bool aDisplayed = false; XGUI_Workshop* aWorkshop = workshop(); // do not display the object if it has sub objects. They should be displayed separately. if (!aWorkshop->module()->canDisplayObject(theObj) || ModelAPI_Tools::hasSubResults(std::dynamic_pointer_cast(theObj))) - return false; + return aDisplayed; XGUI_Displayer* aDisplayer = aWorkshop->displayer(); ResultBodyPtr aBody = std::dynamic_pointer_cast(theObj); if (aBody.get() != NULL) { int aNb = aDisplayer->objectsCount(); - aDisplayer->display(theObj, false); + aDisplayed = aDisplayer->display(theObj, false); if (aNb == 0) myWorkshop->viewer()->fitAll(); } else - aDisplayer->display(theObj, false); + aDisplayed = aDisplayer->display(theObj, false); + + return aDisplayed; +} - return true; +bool XGUI_WorkshopListener::customizeCurrentObject() +{ + bool aCustomized = false; + XGUI_OperationMgr* anOperationMgr = workshop()->operationMgr(); + if (anOperationMgr->hasOperation()) { + ModuleBase_OperationFeature* aFOperation = dynamic_cast + (anOperationMgr->currentOperation()); + if (aFOperation) { + FeaturePtr aCurrentFeature = aFOperation->feature(); + if (aCurrentFeature.get()) + aCustomized = myWorkshop->module()->customizeObject(aCurrentFeature, false); + } + } + return aCustomized; } XGUI_Workshop* XGUI_WorkshopListener::workshop() const