X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Workshop.cpp;h=d11c8043a05db60aa90bd3e2c426defc5789f426;hb=72cb66f9c09b0f8fa224f6f8ab43548658015b49;hp=58d0f8844e07fc20aee6a044b387a58595ab89b5;hpb=38afbd899a8645c83e17f2c24a17a2b7414911b4;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp index 58d0f8844..d11c8043a 100644 --- a/src/XGUI/XGUI_Workshop.cpp +++ b/src/XGUI/XGUI_Workshop.cpp @@ -97,8 +97,10 @@ QIcon XGUI_Workshop::featureIcon(const FeaturePtr& theFeature) ModelAPI_ExecState aState = theFeature->data()->execState(); switch(aState) { case ModelAPI_StateDone: - case ModelAPI_StateNothing: + case ModelAPI_StateNothing: { anIcon = QIcon(anIconString); + } + break; case ModelAPI_StateMustBeUpdated: { anIcon = ModuleBase_Tools::lighter(anIconString); } @@ -143,21 +145,22 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) SLOT(onContextMenuCommand(const QString&, bool))); myViewerProxy = new XGUI_ViewerProxy(this); - connect(myViewerProxy, SIGNAL(selectionChanged()), this, SLOT(updateCommandsOnViewSelection())); + connect(myViewerProxy, SIGNAL(selectionChanged()), + myActionsMgr, SLOT(updateOnViewSelection())); myModuleConnector = new XGUI_ModuleConnector(this); connect(myOperationMgr, SIGNAL(operationStarted(ModuleBase_Operation*)), - SLOT(onOperationStarted())); - connect(myOperationMgr, SIGNAL(operationResumed(ModuleBase_Operation*)), SLOT(onOperationStarted())); + SLOT(onOperationStarted(ModuleBase_Operation*))); + connect(myOperationMgr, SIGNAL(operationResumed(ModuleBase_Operation*)), + SLOT(onOperationResumed(ModuleBase_Operation*))); connect(myOperationMgr, SIGNAL(operationStopped(ModuleBase_Operation*)), SLOT(onOperationStopped(ModuleBase_Operation*))); + connect(myOperationMgr, SIGNAL(operationCommitted(ModuleBase_Operation*)), + SLOT(onOperationCommitted(ModuleBase_Operation*))); + connect(myOperationMgr, SIGNAL(operationAborted(ModuleBase_Operation*)), + SLOT(onOperationAborted(ModuleBase_Operation*))); connect(myMainWindow, SIGNAL(exitKeySequence()), SLOT(onExit())); - // TODO(sbh): It seems that application works properly without update on operationStarted - connect(myOperationMgr, SIGNAL(operationStarted(ModuleBase_Operation*)), - myActionsMgr, SLOT(update())); - connect(myOperationMgr, SIGNAL(operationStopped(ModuleBase_Operation*)), - myActionsMgr, SLOT(update())); connect(this, SIGNAL(errorOccurred(const QString&)), myErrorDlg, SLOT(addError(const QString&))); } @@ -184,9 +187,9 @@ void XGUI_Workshop::startApplication() aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_CREATED)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_DELETED)); - aLoop->registerListener(this, Events_Loop::eventByName("LongOperation")); + aLoop->registerListener(this, Events_LongOp::eventID()); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_PLUGIN_LOADED)); - aLoop->registerListener(this, Events_Loop::eventByName("CurrentDocumentChanged")); + aLoop->registerListener(this, Events_Loop::eventByName(EVENT_DOCUMENT_CHANGED)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_TOSHOW)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_TOHIDE)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_SELFILTER_LOADED)); @@ -203,6 +206,8 @@ void XGUI_Workshop::startApplication() } onNew(); + + emit applicationStarted(); } //****************************************************** @@ -319,7 +324,6 @@ void XGUI_Workshop::processEvent(const std::shared_ptr& theMessa addFeature(aFeatureMsg); } } - // Process creation of Part else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_CREATED)) { std::shared_ptr aUpdMsg = @@ -334,36 +338,29 @@ void XGUI_Workshop::processEvent(const std::shared_ptr& theMessa else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_PLUGIN_LOADED)) { myUpdatePrefs = true; } - // Redisplay feature else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_TO_REDISPLAY)) { std::shared_ptr aUpdMsg = std::dynamic_pointer_cast(theMessage); onFeatureRedisplayMsg(aUpdMsg); } - //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)) { std::shared_ptr anUpdateMsg = std::dynamic_pointer_cast(theMessage); onFeatureUpdatedMsg(anUpdateMsg); - } - - else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_DELETED)) { + } else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_DELETED)) { std::shared_ptr aDelMsg = std::dynamic_pointer_cast(theMessage); onObjectDeletedMsg(aDelMsg); - } - - else if (theMessage->eventID() == Events_LongOp::eventID()) { - if (Events_LongOp::isPerformed()) + } else if (theMessage->eventID() == Events_LongOp::eventID()) { + if (Events_LongOp::isPerformed()) { QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); - else + } else { QApplication::restoreOverrideCursor(); - } - - else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_TOSHOW)) { + } + } else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_TOSHOW)) { std::shared_ptr anUpdateMsg = std::dynamic_pointer_cast(theMessage); const std::set& aObjList = anUpdateMsg->objects(); @@ -372,9 +369,7 @@ void XGUI_Workshop::processEvent(const std::shared_ptr& theMessa for (aIt = aObjList.cbegin(); aIt != aObjList.cend(); ++aIt) aList.append(*aIt); showObjects(aList, true); - } - - else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_TOHIDE)) { + } else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_TOHIDE)) { std::shared_ptr anUpdateMsg = std::dynamic_pointer_cast(theMessage); const std::set& aObjList = anUpdateMsg->objects(); @@ -384,7 +379,6 @@ void XGUI_Workshop::processEvent(const std::shared_ptr& theMessa aList.append(*aIt); showObjects(aList, false); } - //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 = @@ -399,8 +393,7 @@ void XGUI_Workshop::processEvent(const std::shared_ptr& theMessa updateCommandStatus(); } } - } - else if (theMessage->eventID() == Events_Loop::loop()->eventByName("CurrentDocumentChanged")) { + } else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_DOCUMENT_CHANGED)) { myActionsMgr->update(); // Find and Activate active part if (myPartActivating) @@ -428,10 +421,10 @@ void XGUI_Workshop::processEvent(const std::shared_ptr& theMessa std::shared_ptr aMsg = std::dynamic_pointer_cast(theMessage); if (aMsg) { - if (aMsg->attributeId().empty()) { // feature validator - moduleConnector()->selectionFilters()->assignFilter(aMsg->selectionFilterId(), aMsg->featureId(), aMsg->attributeId()); - } else { // attribute validator - moduleConnector()->selectionFilters()->assignFilter(aMsg->selectionFilterId(), aMsg->featureId(), aMsg->attributeId()); + ModuleBase_FilterFactory* aFactory = moduleConnector()->selectionFilters(); + if (!aMsg->attributeId().empty()) { + aFactory->assignFilter(aMsg->selectionFilterId(), aMsg->featureId(), aMsg->attributeId(), + aMsg->parameters()); } } } @@ -496,10 +489,11 @@ void XGUI_Workshop::onFeatureRedisplayMsg(const std::shared_ptrerase(aObj, false); else { if (myDisplayer->isVisible(aObj)) { - myDisplayer->display(aObj, false); // In order to update presentation + displayObject(aObj); // In order to update presentation if (myOperationMgr->hasOperation()) { ModuleBase_Operation* aOperation = myOperationMgr->currentOperation(); - if (aOperation->hasObject(aObj) && myDisplayer->isActive(aObj)) + if (!aOperation->isEditOperation() && + aOperation->hasObject(aObj) && myDisplayer->isActive(aObj)) myDisplayer->deactivate(aObj); } } else { @@ -507,7 +501,7 @@ void XGUI_Workshop::onFeatureRedisplayMsg(const std::shared_ptrcurrentOperation(); // Display only current operation results if operation has preview if (aOperation->hasObject(aObj)/* && aOperation->hasPreview()*/) { - myDisplayer->display(aObj, false); + displayObject(aObj); // Deactivate object of current operation from selection if (myDisplayer->isActive(aObj)) myDisplayer->deactivate(aObj); @@ -536,7 +530,7 @@ void XGUI_Workshop::onFeatureCreatedMsg(const std::shared_ptrhasOperation()) { ModuleBase_Operation* aOperation = myOperationMgr->currentOperation(); if (aOperation->hasObject(*aIt)) { // Display only current operation results - myDisplayer->display(*aIt, false); + displayObject(*aIt); isDisplayed = true; } } @@ -559,72 +553,98 @@ void XGUI_Workshop::onObjectDeletedMsg(const std::shared_ptrcurrentOperation(); - if (this->isSalomeMode()) - aOperation->setNestedFeatures(mySalomeConnector->nestedActions(aOperation->id())); - else - aOperation->setNestedFeatures(myActionsMgr->nestedCommands(aOperation->id())); - - if (aOperation->getDescription()->hasXmlRepresentation()) { //!< No need for property panel - connectWithOperation(aOperation); - - showPropertyPanel(); - QString aXmlRepr = aOperation->getDescription()->xmlRepresentation(); - ModuleBase_WidgetFactory aFactory = ModuleBase_WidgetFactory(aXmlRepr.toStdString(), - myModuleConnector); - - myPropertyPanel->cleanContent(); - aFactory.createWidget(myPropertyPanel->contentWidget()); - ModuleBase_Tools::zeroMargins(myPropertyPanel->contentWidget()); - - QList aWidgets = aFactory.getModelWidgets(); - foreach (ModuleBase_ModelWidget* aWidget, aWidgets) { - aWidget->setFeature(aOperation->feature()); - aWidget->enableFocusProcessing(); - QObject::connect(aWidget, SIGNAL(valuesChanged()), this, SLOT(onWidgetValuesChanged())); - // Init default values - if (!aOperation->isEditOperation() && !aWidget->isComputedDefault()) { - aWidget->storeValue(); - } - } + setNestedFeatures(theOperation); - myPropertyPanel->setModelWidgets(aWidgets); - aOperation->setPropertyPanel(myPropertyPanel); - // Do not activate widgets by default if the current operation is editing operation - // Because we don't know which widget is going to be edited. - if ((!aOperation->isEditOperation())) { - aOperation->activateByPreselection(); - } - // Set final definitions if they are necessary - myModule->propertyPanelDefined(aOperation); + if (theOperation->getDescription()->hasXmlRepresentation()) { //!< No need for property panel + connectWithOperation(theOperation); + setPropertyPanel(theOperation); + } + updateCommandStatus(); - // Widget activation (from the previous method) may commit the current operation - // if pre-selection is enougth for it. So we shouldn't update prop panel's title - if(myOperationMgr->isCurrentOperation(aOperation)) { - myPropertyPanel->setWindowTitle(aOperation->getDescription()->description()); - } + myModule->operationStarted(theOperation); +} + +//****************************************************** +void XGUI_Workshop::onOperationResumed(ModuleBase_Operation* theOperation) +{ + setNestedFeatures(theOperation); + + if (theOperation->getDescription()->hasXmlRepresentation()) { //!< No need for property panel + connectWithOperation(theOperation); + setPropertyPanel(theOperation); } updateCommandStatus(); + + myModule->operationResumed(theOperation); } + //****************************************************** void XGUI_Workshop::onOperationStopped(ModuleBase_Operation* theOperation) { + ModuleBase_ISelection* aSel = mySelector->selection(); + QObjectPtrList aObj = aSel->selectedPresentations(); //!< No need for property panel updateCommandStatus(); hidePropertyPanel(); myPropertyPanel->cleanContent(); - // Activate objects created by current operation - FeaturePtr aFeature = theOperation->feature(); - myDisplayer->activate(aFeature); - const std::list& aResults = aFeature->results(); - std::list::const_iterator aIt; - for (aIt = aResults.cbegin(); aIt != aResults.cend(); ++aIt) { - myDisplayer->activate(*aIt); + // Activate objects created by current operation + // in order to clean selection modes + QIntList aModes; + myDisplayer->activateObjects(aModes); + myModule->operationStopped(theOperation); +} + + +void XGUI_Workshop::onOperationCommitted(ModuleBase_Operation* theOperation) +{ + myModule->operationCommitted(theOperation); +} + +void XGUI_Workshop::onOperationAborted(ModuleBase_Operation* theOperation) +{ + myModule->operationAborted(theOperation); +} + +void XGUI_Workshop::setNestedFeatures(ModuleBase_Operation* theOperation) +{ + if (this->isSalomeMode()) + theOperation->setNestedFeatures(mySalomeConnector->nestedActions(theOperation->id())); + else + theOperation->setNestedFeatures(myActionsMgr->nestedCommands(theOperation->id())); +} + +void XGUI_Workshop::setPropertyPanel(ModuleBase_Operation* theOperation) +{ + showPropertyPanel(); + QString aXmlRepr = theOperation->getDescription()->xmlRepresentation(); + ModuleBase_WidgetFactory aFactory = ModuleBase_WidgetFactory(aXmlRepr.toStdString(), + myModuleConnector); + + myPropertyPanel->cleanContent(); + aFactory.createWidget(myPropertyPanel->contentWidget()); + ModuleBase_Tools::zeroMargins(myPropertyPanel->contentWidget()); + + QList aWidgets = aFactory.getModelWidgets(); + foreach (ModuleBase_ModelWidget* aWidget, aWidgets) { + aWidget->setFeature(theOperation->feature()); + aWidget->enableFocusProcessing(); + QObject::connect(aWidget, SIGNAL(valuesChanged()), this, SLOT(onWidgetValuesChanged())); + // Init default values + if (!theOperation->isEditOperation() && aWidget->isValueDefault() && !aWidget->isComputedDefault()) { + aWidget->storeValue(); + } } + + myPropertyPanel->setModelWidgets(aWidgets); + theOperation->setPropertyPanel(myPropertyPanel); + + myModule->propertyPanelDefined(theOperation); + + myPropertyPanel->setWindowTitle(theOperation->getDescription()->description()); } bool XGUI_Workshop::event(QEvent * theEvent) @@ -1039,22 +1059,7 @@ void XGUI_Workshop::updateCommandStatus() } } myActionsMgr->update(); -} - -//****************************************************** -QList XGUI_Workshop::getModuleCommands() const -{ - QList aCommands; - if (isSalomeMode()) { // update commands in SALOME mode - aCommands = salomeConnector()->commandList(); - } else { - AppElements_MainMenu* aMenuBar = myMainWindow->menuObject(); - foreach(AppElements_Command* aCmd, aMenuBar->features()) - { - aCommands.append(aCmd); - } - } - return aCommands; + emit commandStatusUpdated(); } //****************************************************** @@ -1090,7 +1095,7 @@ void XGUI_Workshop::createDockWidgets() connect(myPropertyPanel, SIGNAL(noMoreWidgets()), myModule, SLOT(onNoMoreWidgets())); aDesktop->addDockWidget(Qt::LeftDockWidgetArea, myPropertyPanel); - hidePropertyPanel(); //tabifyDockWidget(aObjDock, myPropertyPanel); myPropertyPanel->installEventFilter(myOperationMgr); @@ -1101,7 +1106,7 @@ void XGUI_Workshop::createDockWidgets() connect(aCancelBtn, SIGNAL(clicked()), myOperationMgr, SLOT(onAbortOperation())); connect(myPropertyPanel, SIGNAL(keyReleased(QKeyEvent*)), myOperationMgr, SLOT(onKeyReleased(QKeyEvent*))); - connect(myOperationMgr, SIGNAL(operationValidated(bool)), myPropertyPanel, + connect(myOperationMgr, SIGNAL(applyEnableChanged(bool)), myPropertyPanel, SLOT(setAcceptEnabled(bool))); } @@ -1110,7 +1115,7 @@ void XGUI_Workshop::createDockWidgets() void XGUI_Workshop::showPropertyPanel() { QAction* aViewAct = myPropertyPanel->toggleViewAction(); - //setEnabled(true); myPropertyPanel->show(); myPropertyPanel->raise(); @@ -1120,7 +1125,7 @@ void XGUI_Workshop::showPropertyPanel() void XGUI_Workshop::hidePropertyPanel() { QAction* aViewAct = myPropertyPanel->toggleViewAction(); - //setEnabled(false); myPropertyPanel->hide(); } @@ -1214,15 +1219,12 @@ void XGUI_Workshop::onWidgetValuesChanged() FeaturePtr aFeature = anOperation->feature(); ModuleBase_ModelWidget* aSenderWidget = dynamic_cast(sender()); - //if (aCustom) - // aCustom->storeValue(aFeature); const QList& aWidgets = myPropertyPanel->modelWidgets(); QList::const_iterator anIt = aWidgets.begin(), aLast = aWidgets.end(); for (; anIt != aLast; anIt++) { ModuleBase_ModelWidget* aCustom = *anIt; - if (aCustom && (/*!aCustom->isInitialized(aFeature) ||*/aCustom == aSenderWidget)) { - //aCustom->storeValue(aFeature); + if (aCustom && (aCustom == aSenderWidget)) { aCustom->storeValue(); } } @@ -1239,6 +1241,7 @@ void XGUI_Workshop::activatePart(ResultPartPtr theFeature) myObjectBrowser->activatePart(theFeature); myPartActivating = false; } + updateCommandStatus(); } //************************************************************** @@ -1291,7 +1294,7 @@ void XGUI_Workshop::showObjects(const QObjectPtrList& theList, bool isVisible) foreach (ObjectPtr aObj, theList) { if (isVisible) { - myDisplayer->display(aObj, false); + displayObject(aObj); } else { myDisplayer->erase(aObj, false); } @@ -1306,46 +1309,6 @@ void XGUI_Workshop::showOnlyObjects(const QObjectPtrList& theList) } -//************************************************************** -void XGUI_Workshop::updateCommandsOnViewSelection() -{ - XGUI_Selection* aSelection = mySelector->selection(); - if (aSelection->getSelected().size() == 0) - return; - - // Restrict validators to manage only nested (child) features - // of the current feature i.e. if current feature is Sketch - - // Sketch Features & Constraints can be validated. - QStringList aNestedIds; - if(myOperationMgr->hasOperation()) { - FeaturePtr aFeature = myOperationMgr->currentOperation()->feature(); - if(aFeature) { - aNestedIds << myActionsMgr->nestedCommands(QString::fromStdString(aFeature->getKind())); - } - } - SessionPtr aMgr = ModelAPI_Session::get(); - ModelAPI_ValidatorsFactory* aFactory = aMgr->validators(); - QList aActions = getModuleCommands(); - foreach(QAction* aAction, aActions) { - QString aId = aAction->data().toString(); - if(!aNestedIds.contains(aId)) - continue; - std::list aValidators; - std::list > anArguments; - aFactory->validators(aId.toStdString(), aValidators, anArguments); - std::list::iterator aValidator = aValidators.begin(); - for (; aValidator != aValidators.end(); aValidator++) { - if (*aValidator) { - const ModuleBase_SelectionValidator* aSelValidator = - dynamic_cast(*aValidator); - if (aSelValidator) { - aAction->setEnabled(aSelValidator->isValid(aSelection)); - } - } - } - } -} - //************************************************************** void XGUI_Workshop::registerValidators() const { @@ -1380,7 +1343,7 @@ void XGUI_Workshop::displayDocumentResults(DocumentPtr theDoc) void XGUI_Workshop::displayGroupResults(DocumentPtr theDoc, std::string theGroup) { for (int i = 0; i < theDoc->size(theGroup); i++) - myDisplayer->display(theDoc->object(theGroup, i), false); + displayObject(theDoc->object(theGroup, i)); } //************************************************************** @@ -1396,6 +1359,11 @@ void XGUI_Workshop::setDisplayMode(const QObjectPtrList& theList, int theMode) //************************************************************** void XGUI_Workshop::closeDocument() { + ModuleBase_Operation* anOperation = operationMgr()->currentOperation(); + while (anOperation) { + anOperation->abort(); + anOperation = operationMgr()->currentOperation(); + } myDisplayer->closeLocalContexts(); myDisplayer->eraseAll(); objectBrowser()->clearContent(); @@ -1404,3 +1372,16 @@ void XGUI_Workshop::closeDocument() aMgr->closeAll(); objectBrowser()->clearContent(); } + +//************************************************************** +void XGUI_Workshop::displayObject(ObjectPtr theObj) +{ + ResultBodyPtr aBody = std::dynamic_pointer_cast(theObj); + if (aBody.get() != NULL) { + int aNb = myDisplayer->objectsCount(); + myDisplayer->display(theObj, false); + if (aNb == 0) + viewer()->fitAll(); + } else + myDisplayer->display(theObj, false); +}