X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_WorkshopListener.cpp;h=5f4e082fc82d8e5924a981d007fd5a2c568e4eb6;hb=d4ec34025812615d1aa16679db0c5a151b2a2abe;hp=120a9390aafdabb0b8653e26e7cf26fb0b32a968;hpb=bb4472b719a70fac9842ed33f16a4ce1f6877d79;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_WorkshopListener.cpp b/src/XGUI/XGUI_WorkshopListener.cpp index 120a9390a..5f4e082fc 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" @@ -10,12 +11,14 @@ #include "XGUI_ModuleConnector.h" #include "XGUI_QtEvents.h" +#ifndef HAVE_SALOME #include #include #include #include #include #include +#endif #include @@ -26,6 +29,8 @@ #include #include #include +#include +#include #include #include @@ -35,6 +40,7 @@ #include #include +#include #include #include #include @@ -42,6 +48,7 @@ #include #include #include +#include #include #include @@ -55,11 +62,18 @@ //#define DEBUG_FEATURE_CREATED //#define DEBUG_FEATURE_REDISPLAY +//#define DEBUG_FEATURE_UPDATED +//#define DEBUG_RESULT_COMPSOLID + +#ifdef DEBUG_FEATURE_REDISPLAY +const std::string DebugFeatureKind = "Extrusion"; +#endif XGUI_WorkshopListener::XGUI_WorkshopListener(ModuleBase_IWorkshop* theWorkshop) : myWorkshop(theWorkshop), myUpdatePrefs(false) { + XGUI_OperationMgr* anOperationMgr = workshop()->operationMgr(); } //****************************************************** @@ -81,6 +95,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)); @@ -150,7 +165,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(); @@ -174,7 +191,25 @@ 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); - 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(); + + ModuleBase_OperationFeature* aFOperation = dynamic_cast + (workshop()->operationMgr()->currentOperation()); + bool aFeatureChanged = false; + if(aFOperation ) { + FeaturePtr aFeature = aFOperation->feature(); + if (aFeature.get()) { + std::set::const_iterator aIt; + for (aIt = aObjects.begin(); aIt != aObjects.end() && !aFeatureChanged; ++aIt) { + aFeatureChanged = ModelAPI_Feature::feature(*aIt) == aFeature; + } + } + if (aFeatureChanged) + workshop()->operationMgr()->onValidateOperation(); + } } else { //Show error dialog if error message received. std::shared_ptr anAppError = std::dynamic_pointer_cast(theMessage); @@ -183,31 +218,47 @@ void XGUI_WorkshopListener::processEvent(const std::shared_ptr& } return; } - if (!workshop()->isSalomeMode()) { +#ifndef HAVE_SALOME SessionPtr aMgr = ModelAPI_Session::get(); AppElements_MainWindow* aMainWindow = workshop()->mainWindow(); if (aMgr->isModified() != aMainWindow->isModifiedState()) aMainWindow->setModifiedState(aMgr->isModified()); - } +#endif } //****************************************************** -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); } @@ -223,12 +274,15 @@ void XGUI_WorkshopListener::onFeatureRedisplayMsg(const std::shared_ptrdisplayer(); + bool aFirstVisualizedBody = false; + + bool aRedisplayed = false; for (aIt = aObjects.begin(); aIt != aObjects.end(); ++aIt) { ObjectPtr aObj = (*aIt); @@ -239,14 +293,44 @@ void XGUI_WorkshopListener::onFeatureRedisplayMsg(const std::shared_ptr(aObj); aHide = aRes && aRes->isConcealed(); } - if (aHide) - aDisplayer->erase(aObj, false); +#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 + #ifdef DEBUG_FEATURE_REDISPLAY + QString anObjInfo = ModuleBase_Tools::objectInfo((aObj)); + FeaturePtr aFeature = ModelAPI_Feature::feature(aObj); + if (aFeature.get()) { + std::string aKind = aFeature->getKind(); + if (aKind == DebugFeatureKind) { + qDebug(QString("visible=%1, hide=%2 : display= %2").arg(aDisplayer->isVisible(aObj)) + .arg(aHide).arg(anObjInfo).toStdString().c_str()); + } + } + #endif + if (aHide) { + 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()); + #endif + } else { // Redisplay the visible object or the object of the current operation bool isVisibleObject = aDisplayer->isVisible(aObj); #ifdef DEBUG_FEATURE_REDISPLAY - //QString anObjInfo = ModuleBase_Tools::objectInfo((aObj)); - //qDebug(QString("visible=%1 : display= %2").arg(isVisibleObject).arg(anObjInfo).toStdString().c_str()); + QString anObjInfo = ModuleBase_Tools::objectInfo((aObj)); + //qDebug(QString("visible=%1 : display= %2").arg(isVisibleObject).arg(anObjInfo).toStdString().c_str()); #endif if (isVisibleObject) { // redisplay visible object @@ -254,18 +338,31 @@ void XGUI_WorkshopListener::onFeatureRedisplayMsg(const std::shared_ptrredisplay(aObj, false); - // Deactivate object of current operation from selection - aWorkshop->deactivateActiveObject(aObj, false); + if (ModelAPI_Tools::hasSubResults(std::dynamic_pointer_cast(aObj))) { + aRedisplayed = aDisplayer->erase(aObj, false) || aRedisplayed; + } + else { + 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)) { + if (displayObject(aObj, aFirstVisualizedBody)) { + aRedisplayed = true; // Deactivate object of current operation from selection aWorkshop->deactivateActiveObject(aObj, false); } } } } - aDisplayer->updateViewer(); + if (aRedisplayed) { + customizeCurrentObject(); + //VSV FitAll updated viewer by it self + if (aFirstVisualizedBody) + myWorkshop->viewer()->fitAll(); + else + aDisplayer->updateViewer(); + } } //****************************************************** void XGUI_WorkshopListener::onFeatureCreatedMsg(const std::shared_ptr& theMsg) @@ -277,14 +374,28 @@ 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 @@ -296,15 +407,22 @@ void XGUI_WorkshopListener::onFeatureCreatedMsg(const std::shared_ptrmodule()->canDisplayObject(anObject)) { anObject->setDisplayed(true); - isDisplayed = displayObject(*aIt); + aDisplayed = displayObject(*aIt, aFirstVisualizedBody); } else anObject->setDisplayed(false); } } + //if (myObjectBrowser) // myObjectBrowser->processEvent(theMsg); - if (isDisplayed) - workshop()->displayer()->updateViewer(); + if (aDisplayed) { + customizeCurrentObject(); + //VSV FitAll updated viewer by it self + if (aFirstVisualizedBody) + myWorkshop->viewer()->fitAll(); + else + workshop()->displayer()->updateViewer(); + } //if (aHasPart) { // TODO: Avoid activate last part on loading of document // activateLastPart(); //} @@ -344,83 +462,114 @@ 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; } } - if (aWorkshop->isSalomeMode()) { - XGUI_SalomeConnector* aSalomeConnector = aWorkshop->salomeConnector(); - QAction* aAction; - if (isColumnButton) { - aAction = aSalomeConnector->addNestedFeature(aWchName, aFeatureInfo, aNestedActList); - } else { - aAction = aSalomeConnector->addFeature(aWchName, aFeatureInfo); - } - aSalomeConnector->setNestedActions(aFeatureInfo.id, aNestedFeatures); - aSalomeConnector->setDocumentKind(aFeatureInfo.id, aDocKind); - - aWorkshop->actionsMgr()->addCommand(aAction); - aWorkshop->module()->actionCreated(aAction); +#ifdef HAVE_SALOME + XGUI_SalomeConnector* aSalomeConnector = aWorkshop->salomeConnector(); + QAction* aAction; + if (isColumnButton) { + aAction = aSalomeConnector->addFeatureOfNested(aWchName, aFeatureInfo, aNestedActList); } else { - //Find or create Workbench - AppElements_MainMenu* aMenuBar = aWorkshop->mainWindow()->menuObject(); - AppElements_Workbench* aPage = aMenuBar->findWorkbench(aWchName); - if (!aPage) { - aPage = aWorkshop->addWorkbench(aWchName); - } - //Find or create Group - QString aGroupName = QString::fromStdString(theMessage->groupId()); - AppElements_MenuGroupPanel* aGroup = aPage->findGroup(aGroupName); - if (!aGroup) { - aGroup = aPage->addGroup(aGroupName); - } - // Check if hotkey sequence is already defined: - XGUI_ActionsMgr* anActionsMgr = aWorkshop->actionsMgr(); - QKeySequence aHotKey = anActionsMgr->registerShortcut(aFeatureInfo.shortcut); - if(aHotKey != aFeatureInfo.shortcut) { - aFeatureInfo.shortcut = aHotKey; - } - // Create feature... - AppElements_Command* aCommand = aGroup->addFeature(aFeatureInfo, - aDocKind, - aNestedFeatures); - // Enrich created button with accept/abort buttons if necessary - AppElements_Button* aButton = aCommand->button(); - if (aButton->isColumnButton()) { - aButton->setAdditionalButtons(aNestedActList); - } - aWorkshop->actionsMgr()->addCommand(aCommand); - aWorkshop->module()->actionCreated(aCommand); + //Issue #650: in the SALOME mode the tooltip should be same as text + aFeatureInfo.toolTip = aFeatureInfo.text; + aAction = aSalomeConnector->addFeature(aWchName, aFeatureInfo); } + aSalomeConnector->setNestedActions(aFeatureInfo.id, aNestedFeatures); + aSalomeConnector->setDocumentKind(aFeatureInfo.id, aDocKind); + + aWorkshop->actionsMgr()->addCommand(aAction); + aWorkshop->module()->actionCreated(aAction); +#else + //Find or create Workbench + AppElements_MainMenu* aMenuBar = aWorkshop->mainWindow()->menuObject(); + AppElements_Workbench* aPage = aMenuBar->findWorkbench(aWchName); + if (!aPage) { + aPage = aWorkshop->addWorkbench(aWchName); + } + //Find or create Group + QString aGroupName = QString::fromStdString(theMessage->groupId()); + AppElements_MenuGroupPanel* aGroup = aPage->findGroup(aGroupName); + if (!aGroup) { + aGroup = aPage->addGroup(aGroupName); + } + // Check if hotkey sequence is already defined: + XGUI_ActionsMgr* anActionsMgr = aWorkshop->actionsMgr(); + QKeySequence aHotKey = anActionsMgr->registerShortcut(aFeatureInfo.shortcut); + if(aHotKey != aFeatureInfo.shortcut) { + aFeatureInfo.shortcut = aHotKey; + } + // Create feature... + AppElements_Command* aCommand = aGroup->addFeature(aFeatureInfo, + aDocKind, + aNestedFeatures); + // Enrich created button with accept/abort buttons if necessary + AppElements_Button* aButton = aCommand->button(); + if (aButton->isColumnButton()) { + aButton->setAdditionalButtons(aNestedActList); + } + aWorkshop->actionsMgr()->addCommand(aCommand); + aWorkshop->module()->actionCreated(aCommand); +#endif } //************************************************************** -bool XGUI_WorkshopListener::displayObject(ObjectPtr theObj) +bool XGUI_WorkshopListener::displayObject(ObjectPtr theObj, bool& theFirstVisualizedBody) { - XGUI_Workshop* aWorkshop = workshop(); - if (!aWorkshop->module()->canDisplayObject(theObj)) - return false; +#ifdef DEBUG_RESULT_COMPSOLID + ResultPtr aRes = std::dynamic_pointer_cast(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 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(); + theFirstVisualizedBody = true; } else - aDisplayer->display(theObj, false); + aDisplayed = aDisplayer->display(theObj, false); - return true; + return aDisplayed; +} + +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