X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_ActionsMgr.cpp;h=2c2b87f4c8d7df3b455baf1f843369b8c135c28c;hb=227323fca46747847e850a1d6e3bdaac882e209e;hp=851e3fef0adff9e5feb81c9e2eb35d4f5c9b7f49;hpb=47c024e673a2da5094f8f233124c412d0fcdc9b4;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_ActionsMgr.cpp b/src/XGUI/XGUI_ActionsMgr.cpp index 851e3fef0..2c2b87f4c 100644 --- a/src/XGUI/XGUI_ActionsMgr.cpp +++ b/src/XGUI/XGUI_ActionsMgr.cpp @@ -1,10 +1,25 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> - -/* - * XGUI_ActionsMgr.cpp - */ +// 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 +// +#ifndef HAVE_SALOME #include +#endif #include #include @@ -14,16 +29,19 @@ #include #include -#include +#include #include #include #include #include +#include #include +#include #include +#include #ifdef _DEBUG #include @@ -60,13 +78,17 @@ void XGUI_ActionsMgr::addCommand(QAction* theCmd) return; } myActions.insert(aId, theCmd); - AppElements_Command* aXCmd = dynamic_cast(theCmd); - if (aXCmd) { - myNestedActions[aId] = aXCmd->nestedCommands(); - } else { +#ifdef HAVE_SALOME XGUI_Workshop* aWorkshop = static_cast(parent()); - myNestedActions[aId] = aWorkshop->salomeConnector()->nestedActions(aId); - } + const std::shared_ptr& anInfo = + aWorkshop->salomeConnector()->featureInfo(aId); + if (anInfo.get()) + myNestedActions[aId] = QString::fromStdString(anInfo->nestedFeatures()) + .split(" ", QString::SkipEmptyParts); +#else + AppElements_Command* aXCmd = dynamic_cast(theCmd); + myNestedActions[aId] = aXCmd->nestedCommands(); +#endif } void XGUI_ActionsMgr::addNestedCommands(const QString& theId, const QStringList& theCommands) @@ -92,26 +114,29 @@ bool XGUI_ActionsMgr::isNested(const QString& theId) const return false; } -void XGUI_ActionsMgr::update() +void XGUI_ActionsMgr::updateCommandsStatus() { + setAllEnabled(); + XGUI_Selection* aSelection = myWorkshop->selector()->selection(); + if (aSelection->getSelected(ModuleBase_ISelection::AllControls).size() > 0) + updateOnViewSelection(); + FeaturePtr anActiveFeature = FeaturePtr(); - if (myOperationMgr->hasOperation()) { - ModuleBase_Operation* anOperation = myOperationMgr->currentOperation(); - anActiveFeature = anOperation->feature(); - if(anActiveFeature.get()) { - setAllEnabled(false); - QString aFeatureId = QString::fromStdString(anActiveFeature->getKind()); - setActionEnabled(aFeatureId, true); + ModuleBase_OperationFeature* aFOperation = dynamic_cast + (myOperationMgr->currentOperation()); + if (aFOperation) { + anActiveFeature = aFOperation->feature(); + QStringList aNested = allNestedCommands(aFOperation); + foreach(QString aAction, myActions.keys()) { + if (!aNested.contains(aAction)) + setActionEnabled(aAction, false); } - setNestedStackEnabled(anOperation); - } else { - setAllEnabled(true); + } else setNestedCommandsEnabled(false); - } - // TODO(SBH): Get defaults state of actions from XML and remove the following method + + updateByPlugins(anActiveFeature); updateByDocumentKind(); updateCheckState(); - updateByPlugins(anActiveFeature); } void XGUI_ActionsMgr::updateCheckState() @@ -128,37 +153,51 @@ void XGUI_ActionsMgr::updateCheckState() void XGUI_ActionsMgr::updateOnViewSelection() { - XGUI_Selection* aSelection = myWorkshop->selector()->selection(); - if (aSelection->getSelected().size() == 0 || !myOperationMgr->hasOperation()) + if (!myOperationMgr->hasOperation()) return; - ModuleBase_Operation* anOperation = myOperationMgr->currentOperation(); - FeaturePtr anActiveFeature = anOperation->feature(); - if(!anActiveFeature.get()) + + QStringList aIdList = myOperationMgr->operationList(); + //ModuleBase_Operation* anOperation = myOperationMgr->currentOperation(); + //FeaturePtr anActiveFeature = anOperation->feature(); + //if(!anActiveFeature.get()) + if (aIdList.isEmpty()) return; - QString aFeatureId = QString::fromStdString(anActiveFeature->getKind()); + ModuleBase_Operation* theOperation = myOperationMgr->currentOperation(); + //QString aFeatureId = QString::fromStdString(anActiveFeature->getKind()); + XGUI_Selection* aSelection = myWorkshop->selector()->selection(); + // only viewer selection is processed SessionPtr aMgr = ModelAPI_Session::get(); ModelAPI_ValidatorsFactory* aFactory = aMgr->validators(); - foreach(QString aId, nestedCommands(aFeatureId)) { - std::list aValidators; - std::list > anArguments; - if (!anArguments.empty()) { - std::list firstArg = anArguments.front(); + foreach(QString aFeatureId, aIdList) { + foreach(QString aId, nestedCommands(aFeatureId)) { + ModelAPI_ValidatorsFactory::Validators aValidators; + aFactory->validators(aId.toStdString(), aValidators); + ModelAPI_ValidatorsFactory::Validators::iterator aValidatorIt = aValidators.begin(); + for (; aValidatorIt != aValidators.end(); ++aValidatorIt) { + const ModuleBase_SelectionValidator* aSelValidator = + dynamic_cast + (aFactory->validator(aValidatorIt->first)); + if (aSelValidator) + setActionEnabled(aId, aSelValidator->isValid(aSelection, theOperation)); + } } - aFactory->validators(aId.toStdString(), aValidators, anArguments); - std::list::iterator aValidator = aValidators.begin(); - std::list >::iterator aValidatorArgs = anArguments.begin(); - for (; aValidator != aValidators.end(); aValidator++, aValidatorArgs++) { - if (!(*aValidator)) - continue; - const ModuleBase_SelectionValidator* aSelValidator = - dynamic_cast(*aValidator); - if (!aSelValidator) - continue; - setActionEnabled(aId, aSelValidator->isValid(aSelection, *aValidatorArgs)); + } +} - } +QKeySequence XGUI_ActionsMgr::registerShortcut(const QKeySequence& theKeySequence) +{ + if (theKeySequence.isEmpty()) { + return QKeySequence(); + } + if (myShortcuts.contains(theKeySequence)) { + QString aMessage = tr("Shortcut %1 is already defined. Ignore."); + aMessage = aMessage.arg(theKeySequence.toString()); + Events_InfoMessage("XGUI_ActionsMgr", aMessage.toStdString()).send(); + return QKeySequence(); } + myShortcuts.append(theKeySequence); + return theKeySequence; } QKeySequence XGUI_ActionsMgr::registerShortcut(const QString& theKeySequence) @@ -167,12 +206,7 @@ QKeySequence XGUI_ActionsMgr::registerShortcut(const QString& theKeySequence) return QKeySequence(); } QKeySequence aResult(theKeySequence); - if (myShortcuts.contains(aResult)) { - QString aMessage = tr("Shortcut %1 is already defined. Ignore.").arg(theKeySequence); - Events_Error::send(aMessage.toStdString()); - return QKeySequence(); - } - myShortcuts.append(aResult); + registerShortcut(aResult); return aResult; } @@ -203,11 +237,81 @@ void XGUI_ActionsMgr::processEvent(const std::shared_ptr& theMes } } -void XGUI_ActionsMgr::setAllEnabled(bool isEnabled) +QAction* XGUI_ActionsMgr::operationStateAction(OperationStateActionId theId) { - foreach(QString eachAction, myActions.keys()) - { - setActionEnabled(eachAction, isEnabled); + QAction* aResult = NULL; + if (myOperationActions.contains(theId)) { + aResult = myOperationActions.value(theId); + //if (theParent && aResult->parent() != theParent) { + // aResult->setParent(theParent); + //} + } else { + QWidget* aParent = myWorkshop->desktop(); + switch (theId) { + case Accept: + case AcceptAll: { + aResult = ModuleBase_Tools::createAction(QIcon(":pictures/button_ok.png"), + tr("Apply"), aParent); + } + break; + case AcceptPlus: { + aResult = ModuleBase_Tools::createAction(QIcon(":pictures/button_ok-plus.png"), + tr("Apply and continue"), aParent); + } + break; + case Abort: + case AbortAll: { + aResult = ModuleBase_Tools::createAction(QIcon(":pictures/button_cancel.png"), tr("Cancel"), + aParent); + } + break; + case Help: { + aResult = ModuleBase_Tools::createAction(QIcon(":pictures/button_help.png"), tr("Help"), + aParent); + } + break; + case Preview: { + aResult = ModuleBase_Tools::createAction(QIcon(), tr("See preview"), + aParent, 0, 0, tr("Compute preview")); + aResult->setStatusTip(aResult->toolTip()); + } + break; + default: + break; + } + myOperationActions.insert(theId, aResult); + } + return aResult; +} + +QAction* XGUI_ActionsMgr::action(const QString& theId) +{ + QAction* anAction = 0; + if(myActions.contains(theId)) { + anAction = myActions.value(theId); + } + return anAction; +} + +ActionInfo XGUI_ActionsMgr::actionInfoById(const QString& theId) +{ + ActionInfo aResult; + if(myActions.contains(theId)) { + aResult.initFrom(myActions.value(theId)); + } else { + aResult.id = theId; + aResult.text = theId; + } + return aResult; +} + +void XGUI_ActionsMgr::setAllEnabled() +{ + foreach(QString eachAction, myActions.keys()) { + if (myActions.contains(eachAction)) { + QAction* aAction = myActions[eachAction]; + aAction->setEnabled(true); + } } } @@ -230,15 +334,33 @@ void XGUI_ActionsMgr::setNestedCommandsEnabled(bool theEnabled, const QString& t void XGUI_ActionsMgr::setNestedStackEnabled(ModuleBase_Operation* theOperation) { - if(!theOperation || !theOperation->feature()) + ModuleBase_OperationFeature* anOperation = + dynamic_cast(theOperation); + if(!anOperation || !anOperation->feature()) return; - FeaturePtr aFeature = theOperation->feature(); + FeaturePtr aFeature = anOperation->feature(); QString aFeatureId = QString::fromStdString(aFeature->getKind()); + //setActionEnabled(aFeatureId, true); setNestedCommandsEnabled(true, aFeatureId); setNestedStackEnabled(myOperationMgr->previousOperation(theOperation)); } +QStringList XGUI_ActionsMgr::allNestedCommands(ModuleBase_Operation* theOperation) +{ + QStringList aFeatures; + ModuleBase_OperationFeature* anOperation = + dynamic_cast(theOperation); + if(!anOperation || !anOperation->feature()) + return aFeatures; + FeaturePtr aFeature = anOperation->feature(); + QString aFeatureId = QString::fromStdString(aFeature->getKind()); + + aFeatures << myNestedActions[aFeatureId]; + aFeatures << allNestedCommands(myOperationMgr->previousOperation(theOperation)); + return aFeatures; +} + void XGUI_ActionsMgr::setActionChecked(const QString& theId, const bool theChecked) { if (myActions.contains(theId)) { @@ -252,7 +374,11 @@ void XGUI_ActionsMgr::setActionChecked(const QString& theId, const bool theCheck void XGUI_ActionsMgr::setActionEnabled(const QString& theId, const bool theEnabled) { if (myActions.contains(theId)) { - myActions[theId]->setEnabled(theEnabled); + QAction* aAction = myActions[theId]; + // Initially all actions are enabled + // If it was disabled for any reason then we can not enable it + if (aAction->isEnabled()) + aAction->setEnabled(theEnabled); } } @@ -266,16 +392,17 @@ void XGUI_ActionsMgr::updateByDocumentKind() QString aDocKind = QString::fromStdString(aStdDocKind); XGUI_Workshop* aWorkshop = static_cast(parent()); foreach(QAction* eachAction, myActions.values()) { - AppElements_Command* aCmd = dynamic_cast(eachAction); QString aCmdDocKind; - if(aCmd) { - aCmdDocKind = aCmd->documentKind(); - } else { - QString aId = eachAction->data().toString(); - if (!aId.isEmpty()) { - aCmdDocKind = aWorkshop->salomeConnector()->documentKind(aId); - } +#ifdef HAVE_SALOME + QString aId = eachAction->data().toString(); + if (!aId.isEmpty()) { + aCmdDocKind = QString::fromStdString( + aWorkshop->salomeConnector()->featureInfo(aId)->documentKind()); } +#else + AppElements_Command* aCmd = dynamic_cast(eachAction); + aCmdDocKind = QString::fromStdString(aCmd->featureMessage()->documentKind()); +#endif if(!aCmdDocKind.isEmpty() && aCmdDocKind != aDocKind) { eachAction->setEnabled(false); } @@ -286,8 +413,8 @@ void XGUI_ActionsMgr::updateByPlugins(FeaturePtr anActiveFeature) { static Events_ID aStateRequestEventId = Events_Loop::loop()->eventByName( EVENT_FEATURE_STATE_REQUEST); - std::shared_ptr aMsg = - std::make_shared(aStateRequestEventId, this); + std::shared_ptr aMsg( + new ModelAPI_FeatureStateMessage(aStateRequestEventId, this)); aMsg->setFeature(anActiveFeature); Events_Loop::loop()->send(aMsg, false); }