X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_WorkshopListener.cpp;h=5796ddef17d4d8b1262bf596482766279863fe48;hb=97917d3698f5a2f7fc9596e7c755ff8f6751e373;hp=bc201061f9484ad4ba82eb40ac9b131e6f63a106;hpb=885f5880d7a9ad246f5ae3cd226cc8ebf4022053;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 bc201061f..5796ddef1 --- a/src/XGUI/XGUI_WorkshopListener.cpp +++ b/src/XGUI/XGUI_WorkshopListener.cpp @@ -1,23 +1,35 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> +// Copyright (C) 2014-2019 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// 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 +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// #include "XGUI_WorkshopListener.h" -#include "XGUI_Workshop.h" -#include "XGUI_Displayer.h" -#include "XGUI_OperationMgr.h" -#include "XGUI_SalomeConnector.h" -#include "XGUI_ActionsMgr.h" -#include "XGUI_PropertyPanel.h" -#include "XGUI_ModuleConnector.h" -#include "XGUI_QtEvents.h" -#include -#include -#include +#ifndef HAVE_SALOME #include -#include -#include +#endif -#include +#include +#include +#include + +#include +#include +#include #include #include @@ -25,43 +37,55 @@ #include #include #include -#include -#include - -#include -#include -#include +#include +#include +#include +#include #include - #include #include +#include #include -#include -#include +#include -#include -#include -#include +#include "XGUI_ActionsMgr.h" +#include "XGUI_Displayer.h" +#include "XGUI_ErrorMgr.h" +#include "XGUI_FacesPanel.h" +#include "XGUI_OperationMgr.h" +#include "XGUI_ModuleConnector.h" +#include "XGUI_PropertyPanel.h" + +#include "XGUI_QtEvents.h" +#include "XGUI_SalomeConnector.h" +#include "XGUI_SelectionMgr.h" +#include "XGUI_Workshop.h" +#include #include #include #include -#include #ifdef _DEBUG #include #include #endif -//#define DEBUG_CANDISPLAY //#define DEBUG_FEATURE_CREATED //#define DEBUG_FEATURE_REDISPLAY +//#define DEBUG_FEATURE_UPDATED +//#define DEBUG_RESULT_COMPSOLID -XGUI_WorkshopListener::XGUI_WorkshopListener(ModuleBase_IWorkshop* theWorkshop) +#ifdef DEBUG_FEATURE_REDISPLAY +const std::string DebugFeatureKind = "";//"Extrusion"; +#endif + +XGUI_WorkshopListener::XGUI_WorkshopListener(XGUI_Workshop* theWorkshop) : myWorkshop(theWorkshop), myUpdatePrefs(false) { + XGUI_OperationMgr* anOperationMgr = workshop()->operationMgr(); } //****************************************************** @@ -74,24 +98,29 @@ void XGUI_WorkshopListener::initializeEventListening() { //Initialize event listening Events_Loop* aLoop = Events_Loop::loop(); - aLoop->registerListener(this, Events_Error::errorID()); //!< Listening application errors. - aLoop->registerListener(this, Events_Loop::eventByName(Config_FeatureMessage::GUI_EVENT())); - aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OPERATION_LAUNCHED)); + aLoop->registerListener(this, Events_InfoMessage::errorID()); //!< Listening application errors. 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_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_UPDATE_VIEWER_BLOCKED)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_UPDATE_VIEWER_UNBLOCKED)); + aLoop->registerListener(this, Events_Loop::eventByName(EVENT_EMPTY_AIS_PRESENTATION)); + aLoop->registerListener(this, Events_Loop::eventByName(EVENT_UPDATE_BY_WIDGET_SELECTION)); + + aLoop->registerListener(this, Events_Loop::eventByName("FinishOperation")); + 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)); } //****************************************************** void XGUI_WorkshopListener::processEvent(const std::shared_ptr& theMessage) { - if (QApplication::instance()->thread() != QThread::currentThread()) { + if (QApplication::instance() && + QApplication::instance()->thread() != QThread::currentThread()) { #ifdef _DEBUG std::cout << "XGUI_Workshop::processEvent: " << "Working in another thread." << std::endl; #endif @@ -101,16 +130,8 @@ void XGUI_WorkshopListener::processEvent(const std::shared_ptr& return; } - //A message to start feature creation received. - if (theMessage->eventID() == Events_Loop::loop()->eventByName(Config_FeatureMessage::GUI_EVENT())) { - std::shared_ptr aFeatureMsg = - std::dynamic_pointer_cast(theMessage); - if (!aFeatureMsg->isInternal()) { - addFeature(aFeatureMsg); - } - } // Process creation of Part - else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_CREATED)) { + if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_CREATED)) { std::shared_ptr aUpdMsg = std::dynamic_pointer_cast(theMessage); onFeatureCreatedMsg(aUpdMsg); @@ -129,7 +150,22 @@ void XGUI_WorkshopListener::processEvent(const std::shared_ptr& std::shared_ptr aUpdMsg = std::dynamic_pointer_cast(theMessage); onFeatureRedisplayMsg(aUpdMsg); - } + } else if (theMessage->eventID() == Events_Loop::eventByName(EVENT_EMPTY_AIS_PRESENTATION)) { + std::shared_ptr aUpdMsg = + std::dynamic_pointer_cast(theMessage); + onFeatureEmptyPresentationMsg(aUpdMsg); + } else if (theMessage->eventID() == Events_Loop::eventByName(EVENT_UPDATE_BY_WIDGET_SELECTION)) { + ModuleBase_ModelWidget* aWidget = workshop()->propertyPanel()->activeWidget(); + if (aWidget) { + ModuleBase_WidgetSelector* aWidgetSelector = + dynamic_cast(aWidget); + 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 + //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)) { @@ -142,33 +178,6 @@ void XGUI_WorkshopListener::processEvent(const std::shared_ptr& } else { QApplication::restoreOverrideCursor(); } - } - //An operation passed by message. Start it, process and commit. - else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OPERATION_LAUNCHED)) { - std::shared_ptr aPartSetMsg = - std::dynamic_pointer_cast(theMessage); - //myPropertyPanel->cleanContent(); - ModuleBase_Operation* anOperation = (ModuleBase_Operation*) aPartSetMsg->pointer(); - XGUI_OperationMgr* anOperationMgr = workshop()->operationMgr(); - - if (anOperationMgr->startOperation(anOperation)) { - workshop()->propertyPanel()->updateContentWidget(anOperation->feature()); - if (!anOperation->getDescription()->hasXmlRepresentation()) { - if (anOperation->commit()) - workshop()->updateCommandStatus(); - } - } - } - else if (theMessage->eventID() == Events_Loop::eventByName(EVENT_SELFILTER_LOADED)) { - std::shared_ptr aMsg = - std::dynamic_pointer_cast(theMessage); - if (aMsg) { - ModuleBase_FilterFactory* aFactory = myWorkshop->selectionFilters(); - if (!aMsg->attributeId().empty()) { - aFactory->assignFilter(aMsg->selectionFilterId(), aMsg->featureId(), aMsg->attributeId(), - aMsg->parameters()); - } - } } else if (theMessage->eventID() == Events_Loop::eventByName(EVENT_UPDATE_VIEWER_BLOCKED)) { // the viewer's update context will not happens until viewer updated is emitted workshop()->displayer()->enableUpdateViewer(false); @@ -176,79 +185,137 @@ 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_AUTOMATIC_RECOMPUTATION_ENABLE)) || + (theMessage->eventID() == + Events_Loop::eventByName(EVENT_AUTOMATIC_RECOMPUTATION_DISABLE))) { + myWorkshop->updateAutoComputeState(); } else { //Show error dialog if error message received. - std::shared_ptr anAppError = std::dynamic_pointer_cast(theMessage); - if (anAppError) { - emit errorOccurred(QString::fromLatin1(anAppError->description())); + std::shared_ptr anIngfoMsg = + std::dynamic_pointer_cast(theMessage); + if (anIngfoMsg) { + emit errorOccurred(anIngfoMsg); } 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 anObjects = theMsg->objects(); + std::set::const_iterator aIt; + QStringList anInfo; + 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(anObjects.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); } //****************************************************** -void XGUI_WorkshopListener::onFeatureRedisplayMsg(const std::shared_ptr& theMsg) +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(", "); - qDebug(QString("onFeatureRedisplayMsg: %1, %2").arg(aObjects.size()).arg(anInfoStr).toStdString().c_str()); + QString anInfoStr = anInfo.join(";\t"); + qDebug(QString("onFeatureRedisplayMsg: %1, %2") + .arg(anObjects.size()).arg(anInfoStr).toStdString().c_str()); #endif XGUI_Workshop* aWorkshop = workshop(); XGUI_Displayer* aDisplayer = aWorkshop->displayer(); - for (aIt = aObjects.begin(); aIt != aObjects.end(); ++aIt) { + bool aRedisplayed = false; + //std::list aHiddenObjects; + for (aIt = anObjects.begin(); aIt != anObjects.end(); ++aIt) { ObjectPtr aObj = (*aIt); // Hide the object if it is invalid or concealed one - bool aHide = !aObj->data() || !aObj->data()->isValid() || + 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(); + + // 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(); + } + +#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 || DebugFeatureKind.empty()) { + qDebug(QString("visible=%1, hide=%2 : display= %2").arg(aDisplayer->isVisible(aObj)) + .arg(aHide).arg(anObjInfo).toStdString().c_str()); + } + } + #endif if (aHide) { - aDisplayer->erase(aObj, false); + //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 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 { @@ -256,13 +323,6 @@ void XGUI_WorkshopListener::onFeatureRedisplayMsg(const std::shared_ptrisVisible(aObj); #ifdef DEBUG_FEATURE_REDISPLAY QString anObjInfo = ModuleBase_Tools::objectInfo((aObj)); - qDebug(QString("visible=%1 : display= %2").arg(isVisibleObject).arg(anObjInfo).toStdString().c_str()); - /*FeaturePtr aFeature = std::dynamic_pointer_cast(aObj); - if (aFeature.get()) { - std::string aKind = aFeature->getKind(); - if (aKind == "SketchMultiRotation") - bool aValue = true; - }*/ #endif if (isVisibleObject) { // redisplay visible object @@ -270,74 +330,137 @@ void XGUI_WorkshopListener::onFeatureRedisplayMsg(const std::shared_ptr - (aObj); - if (aCompSolid.get() && aCompSolid->numberOfSubs() > 0) { - aDisplayer->erase(aObj, false); - }*/ - - aDisplayer->redisplay(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)) { + aRedisplayed = true; // Deactivate object of current operation from selection aWorkshop->deactivateActiveObject(aObj, false); } } } } - aDisplayer->updateViewer(); + // 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) { + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_EMPTY_AIS_PRESENTATION)); + + aDisplayer->updateViewer(); + } } + //****************************************************** -void XGUI_WorkshopListener::onFeatureCreatedMsg(const std::shared_ptr& theMsg) +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(", "); - qDebug(QString("onFeatureCreatedMsg: %1, %2").arg(aObjects.size()).arg(anInfoStr).toStdString().c_str()); + QString anInfoStr = anInfo.join(";\t"); + qDebug(QString("onFeatureCreatedMsg: %1, %2") + .arg(anObjects.size()).arg(anInfoStr).toStdString().c_str()); #endif //bool aHasPart = false; - bool isDisplayed = false; - for (aIt = aObjects.begin(); aIt != aObjects.end(); ++aIt) { + bool aDisplayed = false; + for (aIt = anObjects.begin(); aIt != anObjects.end(); ++aIt) { ObjectPtr anObject = *aIt; + +#ifdef DEBUG_RESULT_COMPSOLID + ResultPtr aRes = std::dynamic_pointer_cast(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 - bool aHide = !anObject->data()->isValid() || + 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 + // setDisplayed has to be called in order to synchronize internal state of the object // with list of displayed objects -#ifdef DEBUG_CANDISPLAY - if (displayObject(anObject)/*myWorkshop->module()->canDisplayObject(anObject)*/) { - anObject->setDisplayed(true); - //isDisplayed = displayObject(anObject); -#else if (myWorkshop->module()->canDisplayObject(anObject)) { anObject->setDisplayed(true); - isDisplayed = displayObject(anObject); -#endif - } else + aDisplayed = displayObject(anObject); + } else anObject->setDisplayed(false); } } + + bool isCustomized = customizeCurrentObject(anObjects, aDisplayed); + //if (myObjectBrowser) // myObjectBrowser->processEvent(theMsg); - if (isDisplayed) + if (aDisplayed) { + Events_Loop::loop()->flush(Events_Loop::eventByName(EVENT_EMPTY_AIS_PRESENTATION)); workshop()->displayer()->updateViewer(); + } //if (aHasPart) { // TODO: Avoid activate last part on loading of document // activateLastPart(); //} } +//****************************************************** +void XGUI_WorkshopListener::onFeatureEmptyPresentationMsg( + const std::shared_ptr& theMsg) +{ + std::set anObjects = theMsg->objects(); + std::set::const_iterator aIt; +#ifdef DEBUG_FEATURE_CREATED + QStringList anInfo; + for (aIt = anObjects.begin(); aIt != anObjects.end(); ++aIt) { + anInfo.append(ModuleBase_Tools::objectInfo((*aIt))); + } + QString anInfoStr = anInfo.join(";\t"); + qDebug(QString("onFeatureEmptyPresentationMsg: %1, %2") + .arg(anObjects.size()).arg(anInfoStr).toStdString().c_str()); +#endif + + XGUI_Workshop* aWorkshop = workshop(); + XGUI_Displayer* aDisplayer = aWorkshop->displayer(); + + bool aRedisplayed = false; + for (aIt = anObjects.begin(); aIt != anObjects.end(); ++aIt) { + ObjectPtr anObject = *aIt; + aRedisplayed = aDisplayer->erase(anObject, false) || aRedisplayed; + } + + if (aRedisplayed) + aDisplayer->updateViewer(); +} + bool XGUI_WorkshopListener::event(QEvent * theEvent) { PostponeMessageQtEvent* aPostponedEv = dynamic_cast(theEvent); @@ -349,112 +472,63 @@ bool XGUI_WorkshopListener::event(QEvent * theEvent) return false; } -void XGUI_WorkshopListener::addFeature(const std::shared_ptr& theMessage) +//************************************************************** +bool XGUI_WorkshopListener::displayObject(ObjectPtr theObj) { - if (!theMessage) { -#ifdef _DEBUG - qDebug() << "XGUI_WorkshopListener::addFeature: NULL message."; -#endif - return; +#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"); + } } - ActionInfo aFeatureInfo; - aFeatureInfo.initFrom(theMessage); +#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; - QString aWchName = QString::fromStdString(theMessage->workbenchId()); - QStringList aNestedFeatures = - QString::fromStdString(theMessage->nestedFeatures()).split(" ", QString::SkipEmptyParts); - QString aDocKind = QString::fromStdString(theMessage->documentKind()); - QList aNestedActList; - bool isColumnButton = !aNestedFeatures.isEmpty(); - if (isColumnButton) { - QString aNestedActions = QString::fromStdString(theMessage->actionsWhenNested()); - XGUI_OperationMgr* anOperationMgr = aWorkshop->operationMgr(); - XGUI_ActionsMgr* anActionsMgr = aWorkshop->actionsMgr(); - if (aNestedActions.contains("accept")) { - QAction* anAction = anActionsMgr->operationStateAction(XGUI_ActionsMgr::AcceptAll, NULL); - connect(anAction, SIGNAL(triggered()), anOperationMgr, SLOT(commitAllOperations())); - aNestedActList << anAction; - } - if (aNestedActions.contains("abort")) { - QAction* anAction = anActionsMgr->operationStateAction(XGUI_ActionsMgr::AbortAll, NULL); - connect(anAction, SIGNAL(triggered()), anOperationMgr, SLOT(abortAllOperations())); - aNestedActList << anAction; - } - } + XGUI_Displayer* aDisplayer = aWorkshop->displayer(); + int aNb = aDisplayer->objectsCount(); + return aDisplayer->display(theObj, false); +} - if (aWorkshop->isSalomeMode()) { - 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); +bool XGUI_WorkshopListener::customizeCurrentObject(const std::set& theObjects, + bool theForceRedisplay) +{ + XGUI_OperationMgr* anOperationMgr = workshop()->operationMgr(); + FeaturePtr aCurrentFeature; + if (anOperationMgr->hasOperation()) { + ModuleBase_OperationFeature* aFOperation = dynamic_cast + (anOperationMgr->currentOperation()); + if (aFOperation) { + aCurrentFeature = aFOperation->feature(); } - 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); + 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; + aCustomized = myWorkshop->module()->customizeObject(aCurrentFeature, + ModuleBase_IModule::CustomizeResults, false) || aCustomized; + aCustomized = myWorkshop->module()->customizeObject(aCurrentFeature, + ModuleBase_IModule::CustomizeHighlightedObjects, false) || aCustomized; } - aWorkshop->actionsMgr()->addCommand(aCommand); - aWorkshop->module()->actionCreated(aCommand); } -} - - -//************************************************************** -bool XGUI_WorkshopListener::displayObject(ObjectPtr theObj) -{ - XGUI_Workshop* aWorkshop = workshop(); - if (!aWorkshop->module()->canDisplayObject(theObj)) - return false; - - XGUI_Displayer* aDisplayer = aWorkshop->displayer(); - ResultBodyPtr aBody = std::dynamic_pointer_cast(theObj); - if (aBody.get() != NULL) { - int aNb = aDisplayer->objectsCount(); - aDisplayer->display(theObj, false); - if (aNb == 0) - myWorkshop->viewer()->fitAll(); - } else - aDisplayer->display(theObj, false); - - return true; + return aCustomized; } XGUI_Workshop* XGUI_WorkshopListener::workshop() const { - XGUI_ModuleConnector* aConnector = dynamic_cast(myWorkshop); - return aConnector->workshop(); + return myWorkshop; }