X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_OperationMgr.cpp;h=3e6c412235cbbcaef8a5b84a0576d08f1632c321;hb=220bd2b37119be1c65abf88a88792445cb9d99f8;hp=4b6b2257939c0cc975379d3e8c99aacb11a816cb;hpb=9700ee4c209cbe95d880913867a093a0a3969cf0;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_OperationMgr.cpp b/src/XGUI/XGUI_OperationMgr.cpp index 4b6b22579..3e6c41223 100644 --- a/src/XGUI/XGUI_OperationMgr.cpp +++ b/src/XGUI/XGUI_OperationMgr.cpp @@ -8,6 +8,7 @@ #include "XGUI_ModuleConnector.h" #include "XGUI_Workshop.h" #include "XGUI_ErrorMgr.h" +#include #include #include @@ -31,6 +32,49 @@ //#define DEBUG_CURRENT_FEATURE +/// Processes "Delete" key event of application. This key is used by several application actions. +/// There is a logical order of the actions processing. So the key can not be set for actions +/// as a shortcut. The class listens the key event and call operation manager processor. +class XGUI_ShortCutListener : public QObject +{ +public: + /// Constructor + /// \param theParent the parent to be deleted when the parent is deleted + /// \param theOperationMgr the class to perform deletion + XGUI_ShortCutListener(QObject* theParent, XGUI_OperationMgr* theOperationMgr) + : QObject(theParent), myOperationMgr(theOperationMgr) + { + qApp->installEventFilter(this); + } + ~XGUI_ShortCutListener() {} + + /// Switch on short cut listener + void setActive(const bool theIsActive) { myIsActive = theIsActive; } + + /// Redefinition of virtual function to process Delete key release + virtual bool eventFilter(QObject *theObject, QEvent *theEvent) + { + bool isAccepted = false; + if (myIsActive && theEvent->type() == QEvent::KeyRelease) { + QKeyEvent* aKeyEvent = dynamic_cast(theEvent); + if(aKeyEvent) { + switch (aKeyEvent->key()) { + case Qt::Key_Delete: { + isAccepted = myOperationMgr->onProcessDelete(theObject); + } + } + } + } + if (!isAccepted) + isAccepted = QObject::eventFilter(theObject, theEvent); + return isAccepted; + } + +private: + XGUI_OperationMgr* myOperationMgr; /// processor for key event + bool myIsActive; /// boolean state whether the event filter perform own signal processing +}; + XGUI_OperationMgr::XGUI_OperationMgr(QObject* theParent, ModuleBase_IWorkshop* theWorkshop) : QObject(theParent), myWorkshop(theWorkshop) @@ -38,13 +82,23 @@ XGUI_OperationMgr::XGUI_OperationMgr(QObject* theParent, /// we need to install filter to the application in order to react to 'Delete' key button /// this key can not be a short cut for a corresponded action because we need to set /// the actions priority - //qApp->installEventFilter(this); + myShortCutListener = new XGUI_ShortCutListener(theParent, this); } XGUI_OperationMgr::~XGUI_OperationMgr() { } +void XGUI_OperationMgr::activate() +{ + myShortCutListener->setActive(true); +} + +void XGUI_OperationMgr::deactivate() +{ + myShortCutListener->setActive(false); +} + ModuleBase_Operation* XGUI_OperationMgr::currentOperation() const { return myOperations.count() > 0 ? myOperations.last() : 0; @@ -115,9 +169,8 @@ bool XGUI_OperationMgr::eventFilter(QObject *theObject, QEvent *theEvent) bool isAccepted = false; if (theEvent->type() == QEvent::KeyRelease) { QKeyEvent* aKeyEvent = dynamic_cast(theEvent); - if(aKeyEvent) { - isAccepted = onKeyReleased(aKeyEvent); - } + if(aKeyEvent) + isAccepted = onKeyReleased(theObject, aKeyEvent); } if (!isAccepted) isAccepted = QObject::eventFilter(theObject, theEvent); @@ -505,7 +558,7 @@ void XGUI_OperationMgr::onOperationStopped() } } -bool XGUI_OperationMgr::onKeyReleased(QKeyEvent* theEvent) +bool XGUI_OperationMgr::onKeyReleased(QObject *theObject, QKeyEvent* theEvent) { // Let the manager decide what to do with the given key combination. ModuleBase_Operation* anOperation = currentOperation(); @@ -513,7 +566,7 @@ bool XGUI_OperationMgr::onKeyReleased(QKeyEvent* theEvent) switch (theEvent->key()) { case Qt::Key_Return: case Qt::Key_Enter: { - isAccepted = onProcessEnter(); + isAccepted = onProcessEnter(theObject); } break; case Qt::Key_N: @@ -531,9 +584,6 @@ bool XGUI_OperationMgr::onKeyReleased(QKeyEvent* theEvent) } } } - case Qt::Key_Delete: { - isAccepted = onProcessDelete(); - } break; break; default: @@ -546,11 +596,16 @@ bool XGUI_OperationMgr::onKeyReleased(QKeyEvent* theEvent) return isAccepted; } -bool XGUI_OperationMgr::onProcessEnter() +bool XGUI_OperationMgr::onProcessEnter(QObject* theObject) { bool isAccepted = false; ModuleBase_Operation* aOperation = currentOperation(); ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel(); + // only property panel enter is processed in order to do not process enter in application dialogs + bool isPPChild = isChildObject(theObject, aPanel); + if (!isPPChild) + return isAccepted; + ModuleBase_ModelWidget* anActiveWgt = aPanel->activeWidget(); bool isAborted = false; if (!anActiveWgt) { @@ -583,20 +638,39 @@ bool XGUI_OperationMgr::onProcessEnter() return isAccepted; } -bool XGUI_OperationMgr::onProcessDelete() +bool XGUI_OperationMgr::onProcessDelete(QObject* theObject) { bool isAccepted = false; ModuleBase_Operation* aOperation = currentOperation(); ModuleBase_ModelWidget* anActiveWgt = 0; + // firstly the widget should process Delete action + ModuleBase_IPropertyPanel* aPanel; + bool isPPChildObject = false; if (aOperation) { - ModuleBase_IPropertyPanel* aPanel = aOperation->propertyPanel(); - if (aPanel) - anActiveWgt = aPanel->activeWidget(); + aPanel = aOperation->propertyPanel(); + if (aPanel) { + isPPChildObject = isChildObject(theObject, aPanel); + // process delete in active widget only if delete sender is child of property panel + // it is necessary for the case when OB is shown, user perform selection and click Delete + if (isPPChildObject) { + anActiveWgt = aPanel->activeWidget(); + if (anActiveWgt) { + isAccepted = anActiveWgt->processDelete(); + } + } + } } - if (anActiveWgt) - isAccepted = anActiveWgt->processDelete(); if (!isAccepted) { - workshop()->deleteObjects(); + // after widget, object browser and viewer should process delete + /// other widgets such as line edit controls should not lead to + /// processing delete by workshop + XGUI_ObjectsBrowser* aBrowser = workshop()->objectBrowser(); + QWidget* aViewPort = myWorkshop->viewer()->activeViewPort(); + // property panel child object is processed to process delete performed on Apply button of PP + if (theObject == aBrowser->treeView() || + isChildObject(theObject, aViewPort) || + isPPChildObject) + workshop()->deleteObjects(); isAccepted = true; } @@ -609,3 +683,17 @@ XGUI_Workshop* XGUI_OperationMgr::workshop() const return aConnector->workshop(); } +bool XGUI_OperationMgr::isChildObject(const QObject* theObject, const QObject* theParent) +{ + bool isPPChild = false; + if (theParent && theObject) { + QObject* aParent = (QObject*)theObject; + while (aParent ) { + isPPChild = aParent == theParent; + if (isPPChild) + break; + aParent = aParent->parent(); + } + } + return isPPChild; +}