X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_ActionsMgr.cpp;h=33f1826a792e99d7bcb183d94f35cddb37e78f2d;hb=b25922145a97fccf8d2613d0ef52a283d3ce0987;hp=0468a39f75bc4ba8c5da482cdb115eefa28d89b1;hpb=8c99e5e8dd74d99dfbf534bd66b32b70ca134aa7;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_ActionsMgr.cpp b/src/XGUI/XGUI_ActionsMgr.cpp index 0468a39f7..33f1826a7 100644 --- a/src/XGUI/XGUI_ActionsMgr.cpp +++ b/src/XGUI/XGUI_ActionsMgr.cpp @@ -1,18 +1,28 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> + /* * XGUI_ActionsMgr.cpp */ -#include "XGUI_ActionsMgr.h" -#include "XGUI_Command.h" -#include "XGUI_Workshop.h" -#include "XGUI_OperationMgr.h" -#include "XGUI_SalomeConnector.h" +#include -#include +#include +#include +#include +#include +#include +#include -#include +#include #include +#include +#include +#include +#include +#include + + #include #ifdef _DEBUG @@ -31,6 +41,12 @@ XGUI_ActionsMgr::XGUI_ActionsMgr(XGUI_Workshop* theParent) myShortcuts << QKeySequence::Redo; myShortcuts << QKeySequence::Open; myShortcuts << QKeySequence::Close; + + //Initialize event listening + Events_Loop* aLoop = Events_Loop::loop(); + static Events_ID aStateResponseEventId = + Events_Loop::loop()->eventByName(EVENT_FEATURE_STATE_RESPONSE); + aLoop->registerListener(this, aStateResponseEventId, NULL, true); } XGUI_ActionsMgr::~XGUI_ActionsMgr() @@ -44,7 +60,7 @@ void XGUI_ActionsMgr::addCommand(QAction* theCmd) return; } myActions.insert(aId, theCmd); - XGUI_Command* aXCmd = dynamic_cast(theCmd); + AppElements_Command* aXCmd = dynamic_cast(theCmd); if (aXCmd) { myNestedActions[aId] = aXCmd->nestedCommands(); } else { @@ -58,45 +74,196 @@ void XGUI_ActionsMgr::addNestedCommands(const QString& theId, const QStringList& myNestedActions[theId] = theCommands; } +QStringList XGUI_ActionsMgr::nestedCommands(const QString& theId) const +{ + if (myNestedActions.contains(theId)) + return myNestedActions[theId]; + return QStringList(); +} + +bool XGUI_ActionsMgr::isNested(const QString& theId) const +{ + foreach(QString aId, myNestedActions.keys()) + { + QStringList aList = myNestedActions[aId]; + if (aList.contains(theId)) + return true; + } + return false; +} + void XGUI_ActionsMgr::update() { + FeaturePtr anActiveFeature = FeaturePtr(); if (myOperationMgr->hasOperation()) { ModuleBase_Operation* anOperation = myOperationMgr->currentOperation(); - FeaturePtr aFeature = anOperation->feature(); - if(aFeature) { + anActiveFeature = anOperation->feature(); + if(anActiveFeature.get()) { setAllEnabled(false); - QString aFeatureId = QString::fromStdString(aFeature->getKind()); + QString aFeatureId = QString::fromStdString(anActiveFeature->getKind()); setActionEnabled(aFeatureId, true); - setNestedStackEnabled(anOperation); } + setNestedStackEnabled(anOperation); } else { setAllEnabled(true); setNestedCommandsEnabled(false); } + // TODO(SBH): Get defaults state of actions from XML and remove the following method updateByDocumentKind(); updateCheckState(); + updateByPlugins(anActiveFeature); } -void XGUI_ActionsMgr::setAllEnabled(bool isEnabled) +void XGUI_ActionsMgr::updateCheckState() { - foreach(QString eachAction, myActions.keys()) - { - setActionEnabled(eachAction, isEnabled); + QString eachCommand = QString(); + foreach(eachCommand, myActions.keys()) { + setActionChecked(eachCommand, false); + } + QStringList ltActiveCommands = myOperationMgr->operationList(); + foreach(eachCommand, ltActiveCommands) { + setActionChecked(eachCommand, true); } } -void XGUI_ActionsMgr::setNestedStackEnabled(ModuleBase_Operation* theOperation) +void XGUI_ActionsMgr::updateOnViewSelection() { - if(!theOperation || !theOperation->feature()) + XGUI_Selection* aSelection = myWorkshop->selector()->selection(); + if (aSelection->getSelected().size() == 0 || !myOperationMgr->hasOperation()) return; - FeaturePtr aFeature = theOperation->feature(); - QString aFeatureId = QString::fromStdString(aFeature->getKind()); - bool isNestedEnabled = theOperation->isNestedOperationsEnabled(); - setNestedCommandsEnabled(isNestedEnabled, aFeatureId); + ModuleBase_Operation* anOperation = myOperationMgr->currentOperation(); + FeaturePtr anActiveFeature = anOperation->feature(); + if(!anActiveFeature.get()) + return; + QString aFeatureId = QString::fromStdString(anActiveFeature->getKind()); - setNestedStackEnabled(myOperationMgr->previousOperation(theOperation)); + SessionPtr aMgr = ModelAPI_Session::get(); + ModelAPI_ValidatorsFactory* aFactory = aMgr->validators(); + foreach(QString aId, nestedCommands(aFeatureId)) { + std::list aValidators; + std::list > anArguments; + 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_Error::send(aMessage.toStdString()); + return QKeySequence(); + } + myShortcuts.append(theKeySequence); + return theKeySequence; +} + +QKeySequence XGUI_ActionsMgr::registerShortcut(const QString& theKeySequence) +{ + if (theKeySequence.isEmpty()) { + return QKeySequence(); + } + QKeySequence aResult(theKeySequence); + registerShortcut(aResult); + return aResult; +} + +void XGUI_ActionsMgr::processEvent(const std::shared_ptr& theMessage) +{ + const Events_ID kResponseEvent = + Events_Loop::loop()->eventByName(EVENT_FEATURE_STATE_RESPONSE); + if (theMessage->eventID() == kResponseEvent) { + std::shared_ptr aStateMessage = + std::dynamic_pointer_cast(theMessage); + if (!aStateMessage.get()) + return; + std::list aFeaturesList = aStateMessage->features(); + std::list::iterator it = aFeaturesList.begin(); + for( ; it != aFeaturesList.end(); ++it) { + QString anActionId = QString::fromStdString(*it); + bool theDefaultState = false; + if (myActions.contains(anActionId)) { + theDefaultState = myActions[anActionId]->isEnabled(); + } + setActionEnabled(anActionId, aStateMessage->state(*it, theDefaultState)); + } + } else if (theMessage.get()) { + #ifdef _DEBUG + std::cout << "XGUI_ActionsMgr::processEvent: unhandled message caught: " << std::endl + << theMessage->eventID().eventText() << std::endl; + #endif + } +} + +QAction* XGUI_ActionsMgr::operationStateAction(OperationStateActionId theId, QObject* theParent) +{ + QAction* aResult = NULL; + if (myOperationActions.contains(theId)) { + aResult = myOperationActions.value(theId); + if (theParent && aResult->parent() != theParent) { + aResult->setParent(theParent); + } + } else { + switch (theId) { + case Accept: + case AcceptAll: + aResult = new QAction(QIcon(":pictures/button_ok.png"), "", theParent); + break; + case Abort: + case AbortAll: { + aResult = new QAction(QIcon(":pictures/button_cancel.png"), "", theParent); + if(theId == Abort) { + aResult->setShortcut(QKeySequence(Qt::Key_Escape)); + } + } + break; + case Help: + aResult = new QAction(QIcon(":pictures/button_help.png"), "", theParent); + break; + default: + break; + } + myOperationActions.insert(theId, aResult); + } + return aResult; +} + +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(bool isEnabled) +{ + foreach(QString eachAction, myActions.keys()) + { + setActionEnabled(eachAction, isEnabled); + } } + //! void XGUI_ActionsMgr::setNestedCommandsEnabled(bool theEnabled, const QString& theParent) { @@ -113,6 +280,17 @@ void XGUI_ActionsMgr::setNestedCommandsEnabled(bool theEnabled, const QString& t } } +void XGUI_ActionsMgr::setNestedStackEnabled(ModuleBase_Operation* theOperation) +{ + if(!theOperation || !theOperation->feature()) + return; + FeaturePtr aFeature = theOperation->feature(); + QString aFeatureId = QString::fromStdString(aFeature->getKind()); + setNestedCommandsEnabled(true, aFeatureId); + + setNestedStackEnabled(myOperationMgr->previousOperation(theOperation)); +} + void XGUI_ActionsMgr::setActionChecked(const QString& theId, const bool theChecked) { if (myActions.contains(theId)) { @@ -123,6 +301,13 @@ 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); + } +} + /* * Disables all actions which have the Document Kind different to * the current document's kind @@ -133,7 +318,7 @@ void XGUI_ActionsMgr::updateByDocumentKind() QString aDocKind = QString::fromStdString(aStdDocKind); XGUI_Workshop* aWorkshop = static_cast(parent()); foreach(QAction* eachAction, myActions.values()) { - XGUI_Command* aCmd = dynamic_cast(eachAction); + AppElements_Command* aCmd = dynamic_cast(eachAction); QString aCmdDocKind; if(aCmd) { aCmdDocKind = aCmd->documentKind(); @@ -149,54 +334,12 @@ void XGUI_ActionsMgr::updateByDocumentKind() } } -void XGUI_ActionsMgr::setActionEnabled(const QString& theId, const bool theEnabled) +void XGUI_ActionsMgr::updateByPlugins(FeaturePtr anActiveFeature) { - if (myActions.contains(theId)) { - myActions[theId]->setEnabled(theEnabled); - } -} - -void XGUI_ActionsMgr::updateCheckState() -{ - QString eachCommand = QString(); - foreach(eachCommand, myActions.keys()) { - setActionChecked(eachCommand, false); - } - QStringList ltActiveCommands = myOperationMgr->operationList(); - foreach(eachCommand, ltActiveCommands) { - setActionChecked(eachCommand, true); - } -} - -QStringList XGUI_ActionsMgr::nestedCommands(const QString& theId) const -{ - if (myNestedActions.contains(theId)) - return myNestedActions[theId]; - return QStringList(); -} - -bool XGUI_ActionsMgr::isNested(const QString& theId) const -{ - foreach(QString aId, myNestedActions.keys()) - { - QStringList aList = myNestedActions[aId]; - if (aList.contains(theId)) - return true; - } - return false; -} - -QKeySequence XGUI_ActionsMgr::registerShortcut(const QString& theKeySequence) -{ - if (theKeySequence.isEmpty()) { - 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); - return aResult; + static Events_ID aStateRequestEventId = Events_Loop::loop()->eventByName( + EVENT_FEATURE_STATE_REQUEST); + std::shared_ptr aMsg = + std::make_shared(aStateRequestEventId, this); + aMsg->setFeature(anActiveFeature); + Events_Loop::loop()->send(aMsg, false); }