X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FXGUI%2FXGUI_WorkshopListener.cpp;h=5f4e082fc82d8e5924a981d007fd5a2c568e4eb6;hb=d4ec34025812615d1aa16679db0c5a151b2a2abe;hp=82620e63501d395c270b632b05e0a4ea3edaae16;hpb=1caf88277b82a5da83e9a3eb3c3598fcf3601de3;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_WorkshopListener.cpp b/src/XGUI/XGUI_WorkshopListener.cpp index 82620e635..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 @@ -62,13 +65,15 @@ //#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(); - connect(anOperationMgr, SIGNAL(nestedStateChanged(const std::string&, const bool)), - this, SLOT(onNestedStateChanged(const std::string&, const bool))); } //****************************************************** @@ -90,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)); @@ -185,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); @@ -194,12 +218,12 @@ 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 } //****************************************************** @@ -233,7 +257,7 @@ void XGUI_WorkshopListener::onFeatureUpdatedMsg( } } } - anOperationMgr->onValidateOperation(); + //anOperationMgr->onValidateOperation(); //if (myObjectBrowser) // myObjectBrowser->processEvent(theMsg); @@ -256,6 +280,8 @@ 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); @@ -278,6 +304,17 @@ void XGUI_WorkshopListener::onFeatureRedisplayMsg(const std::shared_ptrgetKind(); + 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 @@ -294,12 +331,6 @@ void XGUI_WorkshopListener::onFeatureRedisplayMsg(const std::shared_ptr(aObj); - if (aFeature.get()) { - std::string aKind = aFeature->getKind(); - if (aKind == "SketchMultiRotation") - bool aValue = true; - }*/ #endif if (isVisibleObject) { // redisplay visible object @@ -316,7 +347,7 @@ void XGUI_WorkshopListener::onFeatureRedisplayMsg(const std::shared_ptrdeactivateActiveObject(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); @@ -326,7 +357,11 @@ void XGUI_WorkshopListener::onFeatureRedisplayMsg(const std::shared_ptrupdateViewer(); + //VSV FitAll updated viewer by it self + if (aFirstVisualizedBody) + myWorkshop->viewer()->fitAll(); + else + aDisplayer->updateViewer(); } } //****************************************************** @@ -343,6 +378,8 @@ void XGUI_WorkshopListener::onFeatureCreatedMsg(const std::shared_ptrmodule()->canDisplayObject(anObject)) { anObject->setDisplayed(true); - aDisplayed = displayObject(*aIt); + aDisplayed = displayObject(*aIt, aFirstVisualizedBody); } else anObject->setDisplayed(false); } @@ -380,33 +417,17 @@ void XGUI_WorkshopListener::onFeatureCreatedMsg(const std::shared_ptrprocessEvent(theMsg); if (aDisplayed) { customizeCurrentObject(); - workshop()->displayer()->updateViewer(); + //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(); //} } -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 - QAction* anAcceptAllAction = aWorkshop->actionsMgr()->operationStateAction(XGUI_ActionsMgr::AcceptAll, NULL); - if (aWorkshop->isSalomeMode()) { - XGUI_SalomeConnector* aSalomeConnector = aWorkshop->salomeConnector(); - XGUI_ActionsMgr* anActionsMgr = aWorkshop->actionsMgr(); - if (aSalomeConnector->isNestedFeature(anActionsMgr->action(theFeatureId.c_str()))) - anAcceptAllAction->setEnabled(theState); - } else { - AppElements_MainMenu* aMenuBar = aWorkshop->mainWindow()->menuObject(); - AppElements_Command* aCommand = aMenuBar->feature(theFeatureId.c_str()); - if (aCommand && aCommand->button()->additionalButtonWidget()) - anAcceptAllAction->setEnabled(theState); - } -} - bool XGUI_WorkshopListener::event(QEvent * theEvent) { PostponeMessageQtEvent* aPostponedEv = dynamic_cast(theEvent); @@ -453,57 +474,57 @@ void XGUI_WorkshopListener::addFeature(const std::shared_ptrisSalomeMode()) { - XGUI_SalomeConnector* aSalomeConnector = aWorkshop->salomeConnector(); - QAction* aAction; - if (isColumnButton) { - aAction = aSalomeConnector->addNestedFeature(aWchName, aFeatureInfo, aNestedActList); - } else { - //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); +#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) { #ifdef DEBUG_RESULT_COMPSOLID ResultPtr aRes = std::dynamic_pointer_cast(theObj); @@ -528,7 +549,7 @@ bool XGUI_WorkshopListener::displayObject(ObjectPtr theObj) int aNb = aDisplayer->objectsCount(); aDisplayed = aDisplayer->display(theObj, false); if (aNb == 0) - myWorkshop->viewer()->fitAll(); + theFirstVisualizedBody = true; } else aDisplayed = aDisplayer->display(theObj, false);