X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_ActionsMgr.cpp;h=c3a35fe7cbc534739d8db3a16a52ed3ed00ccef4;hb=ed165fd07e71c11885fdc5f475a8522a5914e00d;hp=8cc05c494a8a75a01b8c96e38c0ecfd844f3d32e;hpb=d86c77d1c6210bbe04fbc3e5b00f9e212e1ec930;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_ActionsMgr.cpp b/src/XGUI/XGUI_ActionsMgr.cpp index 8cc05c494..c3a35fe7c 100644 --- a/src/XGUI/XGUI_ActionsMgr.cpp +++ b/src/XGUI/XGUI_ActionsMgr.cpp @@ -2,73 +2,193 @@ * XGUI_ActionsMgr.cpp */ -#include -#include +#include "XGUI_ActionsMgr.h" +#include "XGUI_Command.h" +#include "XGUI_Workshop.h" +#include "XGUI_OperationMgr.h" +#include "XGUI_SalomeConnector.h" + +#include + +#include +#include + #include +#ifdef _DEBUG +#include +#include +#endif -XGUI_ActionsMgr::XGUI_ActionsMgr(QObject* theParent) - : QObject(theParent) +XGUI_ActionsMgr::XGUI_ActionsMgr(XGUI_Workshop* theParent) + : QObject(theParent), + myWorkshop(theParent), + myOperationMgr(theParent->operationMgr()) { - + // Default shortcuts + myShortcuts << QKeySequence::Save; + myShortcuts << QKeySequence::Undo; + myShortcuts << QKeySequence::Redo; + myShortcuts << QKeySequence::Open; + myShortcuts << QKeySequence::Close; } XGUI_ActionsMgr::~XGUI_ActionsMgr() { } +void XGUI_ActionsMgr::addCommand(QAction* theCmd) +{ + QString aId = theCmd->data().toString(); + if (aId.isEmpty()) { + return; + } + myActions.insert(aId, theCmd); + XGUI_Command* aXCmd = dynamic_cast(theCmd); + if (aXCmd) { + myNestedActions[aId] = aXCmd->nestedCommands(); + } else { + XGUI_Workshop* aWorkshop = static_cast(parent()); + myNestedActions[aId] = aWorkshop->salomeConnector()->nestedActions(aId); + } +} -void XGUI_ActionsMgr::addCommand(XGUI_Command* theCmd) +void XGUI_ActionsMgr::addNestedCommands(const QString& theId, const QStringList& theCommands) { - myActions.insert(theCmd->id(),theCmd); - myActionsState.insert(theCmd->id(), theCmd->enabled()); - theCmd->connectTo(this, SLOT(setActionsDisabled(bool))); + myNestedActions[theId] = theCommands; } -void XGUI_ActionsMgr::setActionsDisabled(bool isDisabled) +void XGUI_ActionsMgr::update() { - //Re-enable actions (just restore their state) - if (!isDisabled) { - myNestedActions.clear(); - restoreCommandState(); + if (myOperationMgr->hasOperation()) { + ModuleBase_Operation* anOperation = myOperationMgr->currentOperation(); + FeaturePtr aFeature = anOperation->feature(); + if(aFeature) { + setAllEnabled(false); + QString aFeatureId = QString::fromStdString(aFeature->getKind()); + setActionEnabled(aFeatureId, true); + setNestedStackEnabled(anOperation); + } + } else { + setAllEnabled(true); + setNestedCommandsEnabled(false); + } + updateByDocumentKind(); + updateCheckState(); +} + +void XGUI_ActionsMgr::setAllEnabled(bool isEnabled) +{ + foreach(QString eachAction, myActions.keys()) + { + setActionEnabled(eachAction, isEnabled); + } +} + +void XGUI_ActionsMgr::setNestedStackEnabled(ModuleBase_Operation* theOperation) +{ + if(!theOperation || !theOperation->feature()) return; + FeaturePtr aFeature = theOperation->feature(); + QString aFeatureId = QString::fromStdString(aFeature->getKind()); + bool isNestedEnabled = theOperation->isNestedOperationsEnabled(); + setNestedCommandsEnabled(isNestedEnabled, aFeatureId); + + setNestedStackEnabled(myOperationMgr->previousOperation(theOperation)); +} + +//! +void XGUI_ActionsMgr::setNestedCommandsEnabled(bool theEnabled, const QString& theParent) +{ + QStringList ltNestedActions; + if (theParent.isEmpty()) { //Disable ALL nested + foreach(QString eachParent, myNestedActions.keys()) { + ltNestedActions << myNestedActions[eachParent]; + } + } else { + ltNestedActions << myNestedActions[theParent]; + } + foreach(QString eachNested, ltNestedActions) { + setActionEnabled(eachNested, theEnabled); + } +} + +void XGUI_ActionsMgr::setActionChecked(const QString& theId, const bool theChecked) +{ + QAction* anAction = myActions[theId]; + if (anAction && anAction->isCheckable()) { + anAction->setChecked(theChecked); } - //Disable all actions, but caller and unblockable (defined in a xml) - saveCommandsState(); - XGUI_Command* aToggledFeature = dynamic_cast(sender()); - QString aSkippedId = aToggledFeature->id(); - QStringList anActionIdsList = myActions.keys(); - foreach(QString eachKey, anActionIdsList) { - if (eachKey == aSkippedId) { - continue; +} + +/* + * Disables all actions which have the Document Kind different to + * the current document's kind + */ +void XGUI_ActionsMgr::updateByDocumentKind() +{ + std::string aStdDocKind = ModelAPI_Session::get()->activeDocument()->kind(); + QString aDocKind = QString::fromStdString(aStdDocKind); + foreach(QAction* eachAction, myActions.values()) { + XGUI_Command* aCmd = dynamic_cast(eachAction); + if(aCmd) { + QString aCmdDocKind = aCmd->documentKind(); + if(!aCmdDocKind.isEmpty() && aCmdDocKind != aDocKind) { + eachAction->setEnabled(false); + } } - myActions[eachKey]->setEnabled(false); } - myNestedActions = aToggledFeature->unblockableCommands(); } -void XGUI_ActionsMgr::saveCommandsState() +void XGUI_ActionsMgr::setActionEnabled(const QString& theId, const bool theEnabled) +{ + QAction* anAction = myActions[theId]; + if (anAction) { + anAction->setEnabled(theEnabled); + } +} + +void XGUI_ActionsMgr::updateCheckState() { - myActionsState.clear(); - QStringList anActionIdsList = myActions.keys(); - foreach(QString eachKey, anActionIdsList) { - myActionsState.insert(eachKey, myActions[eachKey]->isEnabled()); + 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(); } -void XGUI_ActionsMgr::restoreCommandState() +bool XGUI_ActionsMgr::isNested(const QString& theId) const { - QStringList anActionIdsList = myActions.keys(); - foreach(QString eachKey, anActionIdsList) { - myActions[eachKey]->setEnabled(myActionsState[eachKey]); - myActions[eachKey]->setChecked(false); + foreach(QString aId, myNestedActions.keys()) + { + QStringList aList = myNestedActions[aId]; + if (aList.contains(theId)) + return true; } + return false; } -void XGUI_ActionsMgr::setNestedActionsEnabled(bool isEnabled) +QKeySequence XGUI_ActionsMgr::registerShortcut(const QString& theKeySequence) { - foreach(QString eachKey, myNestedActions) { - myActions[eachKey]->setEnabled(isEnabled); + 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; }