X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Workshop.cpp;h=84cbda90551f8c23f60403aa6ea4cfa55bd591c9;hb=4bd5b3938f3aba070cd4a79b8e6ffd625dcdbe81;hp=804648de6046bb821a56cc9257551918c5357b12;hpb=9503b9474d57935de95296dfe6587f6422a6d85d;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp index 804648de6..84cbda905 100644 --- a/src/XGUI/XGUI_Workshop.cpp +++ b/src/XGUI/XGUI_Workshop.cpp @@ -131,7 +131,6 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) myOperationMgr = new XGUI_OperationMgr(this, 0); myActionsMgr = new XGUI_ActionsMgr(this); myErrorDlg = new XGUI_ErrorDialog(QApplication::desktop()); - myErrorMgr = new XGUI_ErrorMgr(this); myContextMenuMgr = new XGUI_ContextMenuMgr(this); connect(myContextMenuMgr, SIGNAL(actionTriggered(const QString&, bool)), this, SLOT(onContextMenuCommand(const QString&, bool))); @@ -145,6 +144,7 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) ModuleBase_IWorkshop* aWorkshop = moduleConnector(); myOperationMgr->setWorkshop(aWorkshop); + myErrorMgr = new XGUI_ErrorMgr(this, aWorkshop); myEventsListener = new XGUI_WorkshopListener(aWorkshop); connect(myOperationMgr, SIGNAL(operationStarted(ModuleBase_Operation*)), @@ -157,8 +157,8 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) SLOT(onOperationCommitted(ModuleBase_Operation*))); connect(myOperationMgr, SIGNAL(operationAborted(ModuleBase_Operation*)), SLOT(onOperationAborted(ModuleBase_Operation*))); - connect(myOperationMgr, SIGNAL(validationStateChanged(bool)), - myErrorMgr, SLOT(onValidationStateChanged())); + //connect(myOperationMgr, SIGNAL(validationStateChanged(bool)), + // myErrorMgr, SLOT(onValidationStateChanged())); if (myMainWindow) connect(myMainWindow, SIGNAL(exitKeySequence()), SLOT(onExit())); @@ -223,16 +223,29 @@ void XGUI_Workshop::activateModule() myActionsMgr->update(); + // activate visualized objects in the viewer + XGUI_Displayer* aDisplayer = displayer(); + QObjectPtrList aDisplayed = aDisplayer->displayedObjects(); + QIntList aModes; + module()->activeSelectionModes(aModes); + aDisplayer->activateObjects(aModes, aDisplayed); } void XGUI_Workshop::deactivateModule() { myModule->deactivateSelectionFilters(); + // remove internal displayer filter + displayer()->deactivateSelectionFilters(); + disconnect(myDisplayer, SIGNAL(objectDisplayed(ObjectPtr, AISObjectPtr)), myModule, SLOT(onObjectDisplayed(ObjectPtr, AISObjectPtr))); disconnect(myDisplayer, SIGNAL(beforeObjectErase(ObjectPtr, AISObjectPtr)), myModule, SLOT(onBeforeObjectErase(ObjectPtr, AISObjectPtr))); + + XGUI_Displayer* aDisplayer = displayer(); + QObjectPtrList aDisplayed = aDisplayer->displayedObjects(); + aDisplayer->deactivateObjects(aDisplayed, true); } //****************************************************** @@ -363,16 +376,66 @@ void XGUI_Workshop::onStartWaiting() } } +//****************************************************** +void XGUI_Workshop::onAcceptActionClicked() +{ + QAction* anAction = dynamic_cast(sender()); + XGUI_OperationMgr* anOperationMgr = operationMgr(); + if (anOperationMgr) { + ModuleBase_OperationFeature* aFOperation = dynamic_cast + (anOperationMgr->currentOperation()); + if (aFOperation) { + if (errorMgr()->canProcessClick(anAction, aFOperation->feature())) + myOperationMgr->onCommitOperation(); + } + } +} + +//****************************************************** +/*void XGUI_Workshop::onValidationStateChanged(bool theEnabled) +{ + XGUI_OperationMgr* anOperationMgr = operationMgr(); + if (anOperationMgr) { + ModuleBase_OperationFeature* aFOperation = dynamic_cast + (anOperationMgr->currentOperation()); + if (aFOperation) { + QAction* anAction = myActionsMgr->operationStateAction(XGUI_ActionsMgr::Accept); + myErrorMgr->updateActionState(anAction, aFOperation->feature(), theEnabled); + } + } +}*/ + //****************************************************** void XGUI_Workshop::deactivateActiveObject(const ObjectPtr& theObject, const bool theUpdateViewer) { if (!myModule->canActivateSelection(theObject)) { - if (myDisplayer->isActive(theObject)) - myDisplayer->deactivate(theObject, theUpdateViewer); + if (myDisplayer->isActive(theObject)) { + QObjectPtrList anObjects; + anObjects.append(theObject); + myDisplayer->deactivateObjects(anObjects, theUpdateViewer); + } } } +//****************************************************** +bool XGUI_Workshop::isFeatureOfNested(const FeaturePtr& theFeature) +{ + bool aHasNested = false; + std::string aFeatureKind = theFeature->getKind(); + if (isSalomeMode()) { + XGUI_SalomeConnector* aSalomeConnector = salomeConnector(); + if (aSalomeConnector->isFeatureOfNested(actionsMgr()->action(aFeatureKind.c_str()))) + aHasNested = true; + } else { + AppElements_MainMenu* aMenuBar = mainWindow()->menuObject(); + AppElements_Command* aCommand = aMenuBar->feature(aFeatureKind.c_str()); + if (aCommand && aCommand->button()->additionalButtonWidget()) + aHasNested = true; + } + return aHasNested; +} + //****************************************************** void XGUI_Workshop::onOperationStarted(ModuleBase_Operation* theOperation) { @@ -386,7 +449,7 @@ void XGUI_Workshop::onOperationStarted(ModuleBase_Operation* theOperation) if (aFOperation->getDescription()->hasXmlRepresentation()) { //!< No need for property panel setPropertyPanel(aFOperation); // filling the operation values by the current selection - // if the operation can be commited after the controls filling, the method perform should + // if the operation can be committed after the controls filling, the method perform should // be stopped. Otherwise unnecessary presentations can be shown(e.g. operation prs in sketch) if (!aFOperation->isEditOperation()) { aFOperation->activateByPreselection(); @@ -450,14 +513,16 @@ void XGUI_Workshop::onOperationStopped(ModuleBase_Operation* theOperation) // They were deactivated on operation start or an object redisplay QObjectPtrList anObjects; FeaturePtr aFeature = aFOperation->feature(); - if (myDisplayer->isVisible(aFeature) && !myDisplayer->isActive(aFeature)) - anObjects.append(aFeature); - std::list aResults = aFeature->results(); - std::list::const_iterator aIt; - for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) { - ResultPtr anObject = *aIt; - if (myDisplayer->isVisible(anObject) && !myDisplayer->isActive(anObject)) { - anObjects.append(anObject); + if (aFeature.get()) { // feature may be not created (plugin load fail) + if (myDisplayer->isVisible(aFeature) && !myDisplayer->isActive(aFeature)) + anObjects.append(aFeature); + std::list aResults = aFeature->results(); + std::list::const_iterator aIt; + for (aIt = aResults.begin(); aIt != aResults.end(); ++aIt) { + ResultPtr anObject = *aIt; + if (myDisplayer->isVisible(anObject) && !myDisplayer->isActive(anObject)) { + anObjects.append(anObject); + } } } QIntList aModes; @@ -615,7 +680,6 @@ void XGUI_Workshop::onOpen() aSession->closeAll(); aSession->load(myCurrentDir.toLatin1().constData()); myObjectBrowser->rebuildDataTree(); - //displayAllResults(); updateCommandStatus(); QApplication::restoreOverrideCursor(); } @@ -755,15 +819,7 @@ void XGUI_Workshop::onPreferences() myMainWindow->menuObject()->updateFromResources(); } } - // redisplay objects visualized in the viewer - static Events_ID EVENT_DISP = Events_Loop::eventByName(EVENT_OBJECT_TO_REDISPLAY); - static const ModelAPI_EventCreator* aECreator = ModelAPI_EventCreator::get(); - QObjectPtrList aDisplayed = displayer()->displayedObjects(); - QObjectPtrList::const_iterator anIt = aDisplayed.begin(), aLast = aDisplayed.end(); - for (; anIt != aLast; anIt++) { - aECreator->sendUpdated(*anIt, EVENT_DISP); - } - Events_Loop::loop()->flush(EVENT_DISP); + displayer()->redisplayObjects(); } } @@ -934,14 +990,15 @@ void XGUI_Workshop::createDockWidgets() myPropertyPanel->installEventFilter(myOperationMgr); QAction* aOkAct = myActionsMgr->operationStateAction(XGUI_ActionsMgr::Accept); - connect(aOkAct, SIGNAL(triggered()), myOperationMgr, SLOT(onCommitOperation())); + connect(aOkAct, SIGNAL(triggered()), this, SLOT(onAcceptActionClicked())); + QAction* aCancelAct = myActionsMgr->operationStateAction(XGUI_ActionsMgr::Abort); connect(aCancelAct, SIGNAL(triggered()), myOperationMgr, SLOT(onAbortOperation())); connect(myPropertyPanel, SIGNAL(noMoreWidgets()), myModule, SLOT(onNoMoreWidgets())); connect(myPropertyPanel, SIGNAL(keyReleased(QKeyEvent*)), myOperationMgr, SLOT(onKeyReleased(QKeyEvent*))); - connect(myOperationMgr, SIGNAL(validationStateChanged(bool)), - aOkAct, SLOT(setEnabled(bool))); + //connect(myOperationMgr, SIGNAL(validationStateChanged(bool)), + // this, SLOT(onValidationStateChanged(bool))); } //****************************************************** @@ -1082,8 +1139,14 @@ void XGUI_Workshop::moveObjects() aMgr->startOperation(aDescription.toStdString()); QObjectPtrList anObjects = mySelector->selection()->selectedObjects(); - DocumentPtr anActiveDocument = aMgr->activeDocument(); + // It is necessary to clear selection in order to avoid selection changed event during + // moving and negative consequences connected with processing of already moved items + mySelector->clearSelection(); + // check whether the object can be moved. There should not be parts which are not loaded + if (!XGUI_Tools::canRemoveOrRename(myMainWindow, anObjects)) + return; + DocumentPtr anActiveDocument = aMgr->activeDocument(); FeaturePtr aCurrentFeature = anActiveDocument->currentFeature(true); foreach (ObjectPtr aObject, anObjects) { if (!myModule->canApplyAction(aObject, anActionId)) @@ -1223,6 +1286,32 @@ bool hasResults(QObjectPtrList theObjects, const std::set& theTypes return isFoundResultType; } +//************************************************************** +// Returns the list of all features for theDocument and all features of +// all nested parts. +std::list allFeatures(const DocumentPtr& theDocument) +{ + std::list aResultList; + std::list anAllFeatures = theDocument->allFeatures(); + foreach (const FeaturePtr& aFeature, anAllFeatures) { + // The order of appending features of the part and the part itself is important + + // Append features from a part feature + foreach (const ResultPtr& aResult, aFeature->results()) { + ResultPartPtr aResultPart = + std::dynamic_pointer_cast(aResult); + if (aResultPart.get() && aResultPart->partDoc().get()) { + // Recursion + std::list anAllFeatures = allFeatures(aResultPart->partDoc()); + aResultList.insert(aResultList.end(), anAllFeatures.begin(), anAllFeatures.end()); + } + } + + aResultList.push_back(aFeature); + } + return aResultList; +} + //************************************************************** // Returns the list of features placed between theObject and the current feature // in the same document. Excludes theObject, includes the current feature. @@ -1230,14 +1319,14 @@ std::list toCurrentFeatures(const ObjectPtr& theObject) { std::list aResult; DocumentPtr aDocument = theObject->document(); - std::list anAllFeatures = aDocument->allFeatures(); + std::list anAllFeatures = allFeatures(aDocument); // find the object iterator std::list::iterator aObjectIt = std::find(anAllFeatures.begin(), anAllFeatures.end(), theObject); - if (aObjectIt == anAllFeatures.end()) + if (aObjectIt == anAllFeatures.end()) return aResult; // find the current feature iterator std::list::iterator aCurrentIt = std::find(anAllFeatures.begin(), anAllFeatures.end(), aDocument->currentFeature(true)); - if (aCurrentIt == anAllFeatures.end()) + if (aCurrentIt == anAllFeatures.end()) return aResult; // check the right order if (std::distance(aObjectIt, anAllFeatures.end()) <= std::distance(aCurrentIt, anAllFeatures.end())) @@ -1256,8 +1345,12 @@ bool XGUI_Workshop::canMoveFeature() QObjectPtrList aObjects = mySelector->selection()->selectedObjects(); QObjectPtrList aValidatedObjects; foreach (ObjectPtr aObject, aObjects) { - if (myModule->canApplyAction(aObject, anActionId)) - aValidatedObjects.append(aObject); + if (!myModule->canApplyAction(aObject, anActionId)) + continue; + // To be moved feature should be in active document + if (aObject->document() != ModelAPI_Session::get()->activeDocument()) + continue; + aValidatedObjects.append(aObject); } if (aValidatedObjects.size() != aObjects.size()) aObjects = aValidatedObjects; @@ -1286,7 +1379,7 @@ bool XGUI_Workshop::canMoveFeature() std::set_intersection(aRefFeatures.begin(), aRefFeatures.end(), aPlacedFeatures.begin(), aPlacedFeatures.end(), std::inserter(aIntersectionFeatures, aIntersectionFeatures.begin())); - // 4. Return false if any reference feature is placed before curent feature + // 4. Return false if any reference feature is placed before current feature if (!aIntersectionFeatures.empty()) aCanMove = false; } @@ -1464,20 +1557,6 @@ void XGUI_Workshop::registerValidators() const ModelAPI_ValidatorsFactory* aFactory = aMgr->validators(); } -//************************************************************** -/*void XGUI_Workshop::displayAllResults() -{ - SessionPtr aMgr = ModelAPI_Session::get(); - DocumentPtr aRootDoc = aMgr->moduleDocument(); - displayDocumentResults(aRootDoc); - for (int i = 0; i < aRootDoc->size(ModelAPI_ResultPart::group()); i++) { - ObjectPtr aObject = aRootDoc->object(ModelAPI_ResultPart::group(), i); - ResultPartPtr aPart = std::dynamic_pointer_cast(aObject); - displayDocumentResults(aPart->partDoc()); - } - myDisplayer->updateViewer(); -}*/ - //************************************************************** void XGUI_Workshop::displayDocumentResults(DocumentPtr theDoc) {