X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_WorkshopListener.cpp;h=c79678fb22848785efdf11a3eab448def809f050;hb=be410a991439cceafe9c4bc19591a47e84922032;hp=570ebbf239ff1b2665e0369399d28ec5550ef27b;hpb=60dfa3359d9982f72d6359fede8520280bfaa6db;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_WorkshopListener.cpp b/src/XGUI/XGUI_WorkshopListener.cpp index 570ebbf23..c79678fb2 100755 --- a/src/XGUI/XGUI_WorkshopListener.cpp +++ b/src/XGUI/XGUI_WorkshopListener.cpp @@ -11,12 +11,14 @@ #include "XGUI_ModuleConnector.h" #include "XGUI_QtEvents.h" +#ifndef HAVE_SALOME #include #include #include #include #include #include +#endif #include @@ -63,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))); } //****************************************************** @@ -187,14 +191,24 @@ 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(); - std::set::const_iterator aIt; - for (aIt = aObjects.begin(); aIt != aObjects.end(); ++aIt) { - workshop()->errorMgr()->updateActions(ModelAPI_Feature::feature(*aIt)); + std::set anObjects = 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 = anObjects.begin(); aIt != anObjects.end() && !aFeatureChanged; ++aIt) { + aFeatureChanged = ModelAPI_Feature::feature(*aIt) == aFeature; + } + } + if (aFeatureChanged) + workshop()->operationMgr()->onValidateOperation(); } } else { //Show error dialog if error message received. @@ -204,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 } //****************************************************** @@ -217,14 +231,14 @@ void XGUI_WorkshopListener::onFeatureUpdatedMsg( const std::shared_ptr& theMsg) { #ifdef DEBUG_FEATURE_UPDATED - std::set aObjects = theMsg->objects(); + std::set anObjects = theMsg->objects(); std::set::const_iterator aIt; QStringList anInfo; - for (aIt = aObjects.begin(); aIt != aObjects.end(); ++aIt) { + for (aIt = anObjects.begin(); aIt != anObjects.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()); + qDebug(QString("onFeatureUpdatedMsg: %1, %2").arg(anObjects.size()).arg(anInfoStr).toStdString().c_str()); #endif std::set aFeatures = theMsg->objects(); XGUI_OperationMgr* anOperationMgr = workshop()->operationMgr(); @@ -252,22 +266,25 @@ void XGUI_WorkshopListener::onFeatureUpdatedMsg( //****************************************************** void XGUI_WorkshopListener::onFeatureRedisplayMsg(const std::shared_ptr& theMsg) { - std::set aObjects = theMsg->objects(); + std::set anObjects = theMsg->objects(); std::set::const_iterator aIt; #ifdef DEBUG_FEATURE_REDISPLAY QStringList anInfo; - for (aIt = aObjects.begin(); aIt != aObjects.end(); ++aIt) { + for (aIt = anObjects.begin(); aIt != anObjects.end(); ++aIt) { anInfo.append(ModuleBase_Tools::objectInfo((*aIt))); } QString anInfoStr = anInfo.join(";\t"); - qDebug(QString("onFeatureRedisplayMsg: %1, %2").arg(aObjects.size()).arg(anInfoStr).toStdString().c_str()); + qDebug(QString("onFeatureRedisplayMsg: %1, %2").arg(anObjects.size()).arg(anInfoStr).toStdString().c_str()); #endif XGUI_Workshop* aWorkshop = workshop(); XGUI_Displayer* aDisplayer = aWorkshop->displayer(); + bool aFirstVisualizedBody = false; + bool aRedisplayed = false; - for (aIt = aObjects.begin(); aIt != aObjects.end(); ++aIt) { + //std::list aHiddenObjects; + for (aIt = anObjects.begin(); aIt != anObjects.end(); ++aIt) { ObjectPtr aObj = (*aIt); // Hide the object if it is invalid or concealed one @@ -277,6 +294,7 @@ 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()) { @@ -288,7 +306,21 @@ 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) { + //we should provide objects which are hidden in the viewer, e.g. sketch always should visualizes + // all sub-features, if some features are to be hidden, sould be proposed may be to removed #1223 + //aHiddenObjects.push_back(aObj); aRedisplayed = aDisplayer->erase(aObj, false) || aRedisplayed; #ifdef DEBUG_FEATURE_REDISPLAY // Redisplay the visible object or the object of the current operation @@ -304,12 +336,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 @@ -326,7 +352,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); @@ -334,28 +360,39 @@ void XGUI_WorkshopListener::onFeatureRedisplayMsg(const std::shared_ptrupdateViewer(); + // 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); + if (aRedisplayed || isCustomized) { + //VSV FitAll updated viewer by it self + if (aFirstVisualizedBody) + myWorkshop->viewer()->fitAll(); + else + aDisplayer->updateViewer(); } } //****************************************************** void XGUI_WorkshopListener::onFeatureCreatedMsg(const std::shared_ptr& theMsg) { - std::set aObjects = theMsg->objects(); + std::set anObjects = theMsg->objects(); std::set::const_iterator aIt; #ifdef DEBUG_FEATURE_CREATED QStringList anInfo; - for (aIt = aObjects.begin(); aIt != aObjects.end(); ++aIt) { + for (aIt = anObjects.begin(); aIt != anObjects.end(); ++aIt) { anInfo.append(ModuleBase_Tools::objectInfo((*aIt))); } QString anInfoStr = anInfo.join(";\t"); - qDebug(QString("onFeatureCreatedMsg: %1, %2").arg(aObjects.size()).arg(anInfoStr).toStdString().c_str()); + qDebug(QString("onFeatureCreatedMsg: %1, %2").arg(anObjects.size()).arg(anInfoStr).toStdString().c_str()); #endif + bool aFirstVisualizedBody = false; + //bool aHasPart = false; bool aDisplayed = false; - for (aIt = aObjects.begin(); aIt != aObjects.end(); ++aIt) { + for (aIt = anObjects.begin(); aIt != anObjects.end(); ++aIt) { ObjectPtr anObject = *aIt; #ifdef DEBUG_RESULT_COMPSOLID @@ -375,52 +412,38 @@ void XGUI_WorkshopListener::onFeatureCreatedMsg(const std::shared_ptrdata()->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(); + } 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(*aIt); + aDisplayed = displayObject(*aIt, aFirstVisualizedBody); } else anObject->setDisplayed(false); } } + bool isCustomized = customizeCurrentObject(anObjects, aDisplayed); + //if (myObjectBrowser) // myObjectBrowser->processEvent(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 - //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); @@ -467,57 +490,57 @@ void XGUI_WorkshopListener::addFeature(const std::shared_ptrisSalomeMode()) { - XGUI_SalomeConnector* aSalomeConnector = aWorkshop->salomeConnector(); - QAction* aAction; - if (isColumnButton) { - aAction = aSalomeConnector->addFeatureOfNested(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); @@ -542,24 +565,39 @@ 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); return aDisplayed; } -bool XGUI_WorkshopListener::customizeCurrentObject() +bool XGUI_WorkshopListener::customizeCurrentObject(const std::set& theObjects, + bool theForceRedisplay) { - bool aCustomized = false; XGUI_OperationMgr* anOperationMgr = workshop()->operationMgr(); + FeaturePtr aCurrentFeature; 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); + aCurrentFeature = aFOperation->feature(); + } + } + + bool aCustomized = false; + if (aCurrentFeature.get()) { + // the customize presentation should be redisplayed if force redislayed is true or + // if a list of message objects contains the operation feature for case when + // 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, + ModuleBase_IModule::CustomizeArguments, false); + aCustomized = myWorkshop->module()->customizeObject(aCurrentFeature, + ModuleBase_IModule::CustomizeResults, false); + aCustomized = myWorkshop->module()->customizeObject(aCurrentFeature, + ModuleBase_IModule::CustomizeHighlightedObjects, false); } } return aCustomized;