From f4b90d1ab5dec53c49699b82a69e976980c35598 Mon Sep 17 00:00:00 2001 From: vsv Date: Fri, 10 Apr 2020 15:18:27 +0300 Subject: [PATCH] Issue #3177: Create shortcut for edit current item in object browser --- src/XGUI/XGUI_OperationMgr.cpp | 99 +++++++++++++++++++--------------- src/XGUI/XGUI_OperationMgr.h | 3 ++ src/XGUI/XGUI_Workshop.cpp | 4 +- 3 files changed, 60 insertions(+), 46 deletions(-) diff --git a/src/XGUI/XGUI_OperationMgr.cpp b/src/XGUI/XGUI_OperationMgr.cpp index bff45c11e..86e9af9eb 100644 --- a/src/XGUI/XGUI_OperationMgr.cpp +++ b/src/XGUI/XGUI_OperationMgr.cpp @@ -65,8 +65,8 @@ 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), myIsActive(false) + XGUI_ShortCutListener(XGUI_OperationMgr* theOperationMgr) + : QObject(theOperationMgr), myOperationMgr(theOperationMgr), myIsActive(false) { qApp->installEventFilter(this); } @@ -76,61 +76,68 @@ public: 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) { - // Do not process keys for modal dialogues: all keys has to be processed within the dialog - // There is only one exception: ModuleBase_EditorDialog - QWindow* aWnd = qApp->modalWindow(); - QString aName = "NoModal"; - if (aWnd) { - if (!aWnd->objectName().startsWith("ModuleBase_EditorDialog")) - aName = aWnd->objectName(); - } - if (aName == "NoModal") { - if (theEvent->type() == QEvent::KeyRelease) { - QKeyEvent* aKeyEvent = dynamic_cast(theEvent); - if (aKeyEvent) { - myOperationMgr->setSHIFTPressed(aKeyEvent->modifiers() & Qt::ShiftModifier); - switch (aKeyEvent->key()) { - case Qt::Key_Delete: - isAccepted = myOperationMgr->onProcessDelete(theObject); - break; - default: - isAccepted = myOperationMgr->onKeyReleased(theObject, aKeyEvent); - break; - } + virtual bool eventFilter(QObject *theObject, QEvent *theEvent); + +private: + XGUI_OperationMgr* myOperationMgr; /// processor for key event + bool myIsActive; /// boolean state whether the event filter perform own signal processing +}; + +bool XGUI_ShortCutListener::eventFilter(QObject *theObject, QEvent *theEvent) +{ + bool isAccepted = false; + + if (myIsActive) { + // Do not process keys for modal dialogues: all keys has to be processed within the dialog + // There is only one exception: ModuleBase_EditorDialog + QWindow* aWnd = qApp->modalWindow(); + QString aName = "NoModal"; + if (aWnd) { + if (!aWnd->objectName().startsWith("ModuleBase_EditorDialog")) + aName = aWnd->objectName(); + } + if (aName == "NoModal") { + if (theEvent->type() == QEvent::KeyRelease) { + QKeyEvent* aKeyEvent = dynamic_cast(theEvent); + if (aKeyEvent) { + myOperationMgr->setSHIFTPressed(aKeyEvent->modifiers() & Qt::ShiftModifier); + switch (aKeyEvent->key()) { + case Qt::Key_Delete: + isAccepted = myOperationMgr->onProcessDelete(theObject); + break; + case Qt::Key_F2: + myOperationMgr->xworkshop()->objectBrowser()->onEditItem(); + break; + default: + isAccepted = myOperationMgr->onKeyReleased(theObject, aKeyEvent); + break; } } - else if (theEvent->type() == QEvent::KeyPress) { - if (myOperationMgr->hasOperation()) { - QKeyEvent* aKeyEvent = dynamic_cast(theEvent); - myOperationMgr->setSHIFTPressed(aKeyEvent->modifiers() & Qt::ShiftModifier); - isAccepted = myOperationMgr->onKeyPressed(theObject, aKeyEvent); - } + } + else if (theEvent->type() == QEvent::KeyPress) { + if (myOperationMgr->hasOperation()) { + QKeyEvent* aKeyEvent = dynamic_cast(theEvent); + myOperationMgr->setSHIFTPressed(aKeyEvent->modifiers() & Qt::ShiftModifier); + isAccepted = myOperationMgr->onKeyPressed(theObject, aKeyEvent); } } } - if (!isAccepted) - isAccepted = QObject::eventFilter(theObject, theEvent); - return isAccepted; } + 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) + ModuleBase_IWorkshop* theWorkshop) : QObject(theParent), myWorkshop(theWorkshop), mySHIFTPressed(false), myActiveMessageBox(0) { /// 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 - myShortCutListener = new XGUI_ShortCutListener(theParent, this); + myShortCutListener = new XGUI_ShortCutListener(this); } XGUI_OperationMgr::~XGUI_OperationMgr() @@ -932,3 +939,9 @@ QMessageBox* XGUI_OperationMgr::createInformationBox(const QString& theMessage) return aMessageBox; } + +XGUI_Workshop* XGUI_OperationMgr::xworkshop() const +{ + XGUI_ModuleConnector* aConnector = (XGUI_ModuleConnector*) myWorkshop; + return aConnector->workshop(); +} diff --git a/src/XGUI/XGUI_OperationMgr.h b/src/XGUI/XGUI_OperationMgr.h index 503c79c05..ac05d42ba 100644 --- a/src/XGUI/XGUI_OperationMgr.h +++ b/src/XGUI/XGUI_OperationMgr.h @@ -78,6 +78,9 @@ public: /// Current workshop ModuleBase_IWorkshop* workshop() const { return myWorkshop; } + /// Current workshop + XGUI_Workshop* xworkshop() const; + /// Returns the current operation or NULL /// \return the current operation ModuleBase_Operation* currentOperation() const; diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp index ab8f0b656..f5aba9c79 100644 --- a/src/XGUI/XGUI_Workshop.cpp +++ b/src/XGUI/XGUI_Workshop.cpp @@ -210,7 +210,7 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) { mySelector = new XGUI_SelectionMgr(this); myModuleConnector = new XGUI_ModuleConnector(this); - myOperationMgr = new XGUI_OperationMgr(this, 0); + myOperationMgr = new XGUI_OperationMgr(this, myModuleConnector); ModuleBase_IWorkshop* aWorkshop = moduleConnector(); // Has to be defined first in order to get errors and messages from other components myEventsListener = new XGUI_WorkshopListener(this); @@ -273,8 +273,6 @@ XGUI_Workshop::XGUI_Workshop(XGUI_SalomeConnector* theConnector) //connect(myViewerProxy, SIGNAL(selectionChanged()), // myActionsMgr, SLOT(updateOnViewSelection())); - myOperationMgr->setWorkshop(aWorkshop); - myErrorMgr = new XGUI_ErrorMgr(this, aWorkshop); connect(myOperationMgr, SIGNAL(operationResumed(ModuleBase_Operation*)), -- 2.39.2