From 6d1582f8371f064e1aa0c461fc9031ae6c046363 Mon Sep 17 00:00:00 2001 From: John Shepherd Date: Tue, 15 Dec 2020 10:54:54 -0800 Subject: [PATCH] Update key event handling (#466) Signed-off-by: John Shepherd --- src/gui/plugins/scene3d/Scene3D.cc | 27 ++++++++++++++++--- src/gui/plugins/scene3d/Scene3D.hh | 14 +++++----- .../transform_control/TransformControl.cc | 23 ++++++++++++++++ .../transform_control/TransformControl.hh | 9 +++++++ .../transform_control/TransformControl.qml | 24 +++++++---------- 5 files changed, 73 insertions(+), 24 deletions(-) diff --git a/src/gui/plugins/scene3d/Scene3D.cc b/src/gui/plugins/scene3d/Scene3D.cc index bb6b12fe1c..4321dbbfe8 100644 --- a/src/gui/plugins/scene3d/Scene3D.cc +++ b/src/gui/plugins/scene3d/Scene3D.cc @@ -2346,6 +2346,8 @@ void Scene3D::LoadConfig(const tinyxml2::XMLElement *_pluginElem) ignmsg << "Camera pose topic advertised on [" << this->dataPtr->cameraPoseTopic << "]" << std::endl; + ignition::gui::App()->findChild< + ignition::gui::MainWindow *>()->QuickWindow()->installEventFilter(this); ignition::gui::App()->findChild< ignition::gui::MainWindow *>()->installEventFilter(this); } @@ -2547,7 +2549,26 @@ void RenderWindowItem::SetScaleSnap(const math::Vector3d &_scale) ///////////////////////////////////////////////// bool Scene3D::eventFilter(QObject *_obj, QEvent *_event) { - if (_event->type() == ignition::gazebo::gui::events::EntitiesSelected::kType) + if (_event->type() == QEvent::KeyPress) + { + QKeyEvent *keyEvent = static_cast(_event); + if (keyEvent) + { + auto renderWindow = this->PluginItem()->findChild(); + renderWindow->HandleKeyPress(keyEvent); + } + } + else if (_event->type() == QEvent::KeyRelease) + { + QKeyEvent *keyEvent = static_cast(_event); + if (keyEvent) + { + auto renderWindow = this->PluginItem()->findChild(); + renderWindow->HandleKeyRelease(keyEvent); + } + } + else if (_event->type() == + ignition::gazebo::gui::events::EntitiesSelected::kType) { auto selectedEvent = reinterpret_cast(_event); @@ -2817,13 +2838,13 @@ void RenderWindowItem::wheelEvent(QWheelEvent *_e) } //////////////////////////////////////////////// -void RenderWindowItem::keyPressEvent(QKeyEvent *_e) +void RenderWindowItem::HandleKeyPress(QKeyEvent *_e) { this->dataPtr->renderThread->ignRenderer.HandleKeyPress(_e); } //////////////////////////////////////////////// -void RenderWindowItem::keyReleaseEvent(QKeyEvent *_e) +void RenderWindowItem::HandleKeyRelease(QKeyEvent *_e) { this->dataPtr->renderThread->ignRenderer.HandleKeyRelease(_e); diff --git a/src/gui/plugins/scene3d/Scene3D.hh b/src/gui/plugins/scene3d/Scene3D.hh index 5adf01854e..761f37295f 100644 --- a/src/gui/plugins/scene3d/Scene3D.hh +++ b/src/gui/plugins/scene3d/Scene3D.hh @@ -599,6 +599,14 @@ inline namespace IGNITION_GAZEBO_VERSION_NAMESPACE { /// \brief Slot called when thread is ready to be started public Q_SLOTS: void Ready(); + /// \brief Handle key press event for snapping + /// \param[in] _e The key event to process. + public: void HandleKeyPress(QKeyEvent *_e); + + /// \brief Handle key release event for snapping + /// \param[in] _e The key event to process. + public: void HandleKeyRelease(QKeyEvent *_e); + // Documentation inherited protected: void mousePressEvent(QMouseEvent *_e) override; @@ -611,12 +619,6 @@ inline namespace IGNITION_GAZEBO_VERSION_NAMESPACE { // Documentation inherited protected: void wheelEvent(QWheelEvent *_e) override; - // Documentation inherited - protected: void keyPressEvent(QKeyEvent *_e) override; - - // Documentation inherited - protected: void keyReleaseEvent(QKeyEvent *_e) override; - /// \brief Overrides the paint event to render the render engine /// camera view /// \param[in] _oldNode The node passed in previous updatePaintNode diff --git a/src/gui/plugins/transform_control/TransformControl.cc b/src/gui/plugins/transform_control/TransformControl.cc index 461f2e7e1b..d4b1d8c94e 100644 --- a/src/gui/plugins/transform_control/TransformControl.cc +++ b/src/gui/plugins/transform_control/TransformControl.cc @@ -96,6 +96,8 @@ void TransformControl::LoadConfig(const tinyxml2::XMLElement *) ignition::gui::App()->findChild ()->installEventFilter(this); + ignition::gui::App()->findChild + ()->QuickWindow()->installEventFilter(this); } ///////////////////////////////////////////////// @@ -232,6 +234,27 @@ bool TransformControl::eventFilter(QObject *_obj, QEvent *_event) this->dataPtr->snapToGrid = false; } } + else if (_event->type() == QEvent::KeyPress) + { + QKeyEvent *keyEvent = static_cast(_event); + if (keyEvent->key() == Qt::Key_T) + { + this->activateTranslate(); + } + else if (keyEvent->key() == Qt::Key_R) + { + this->activateRotate(); + } + } + else if (_event->type() == QEvent::KeyRelease) + { + QKeyEvent *keyEvent = static_cast(_event); + if (keyEvent->key() == Qt::Key_Escape) + { + this->activateSelect(); + } + } + return QObject::eventFilter(_obj, _event); } diff --git a/src/gui/plugins/transform_control/TransformControl.hh b/src/gui/plugins/transform_control/TransformControl.hh index 64958e3927..3c8a4e5dd5 100644 --- a/src/gui/plugins/transform_control/TransformControl.hh +++ b/src/gui/plugins/transform_control/TransformControl.hh @@ -133,6 +133,15 @@ namespace gazebo /// \brief Notify that new snapping values have been set. signals: void newSnapValues(); + /// \brief Notify that selection has been activated + signals: void activateSelect(); + + /// \brief Notify that translation has been activated + signals: void activateTranslate(); + + /// \brief Notify that rotation has been activated + signals: void activateRotate(); + /// \internal /// \brief Pointer to private data. private: std::unique_ptr dataPtr; diff --git a/src/gui/plugins/transform_control/TransformControl.qml b/src/gui/plugins/transform_control/TransformControl.qml index 765506c45b..2563902daa 100644 --- a/src/gui/plugins/transform_control/TransformControl.qml +++ b/src/gui/plugins/transform_control/TransformControl.qml @@ -91,25 +91,19 @@ ToolBar { onNewSnapValues: updateSnapValues(); } - // TODO(anyone) enable scale button when support is added in ign-physics - // Shortcut { - // sequence: "S" - // onActivated: activateScale() - // } - - Shortcut { - sequence: "T" - onActivated: activateTranslate() + Connections { + target: TransformControl + onActivateSelect: activateSelect(); } - Shortcut { - sequence: "R" - onActivated: activateRotate() + Connections { + target: TransformControl + onActivateTranslate: activateTranslate(); } - Shortcut { - sequence: "Esc" - onActivated: activateSelect() + Connections { + target: TransformControl + onActivateRotate: activateRotate(); } RowLayout {