diff --git a/scwx-qt/source/scwx/qt/map/map_widget.cpp b/scwx-qt/source/scwx/qt/map/map_widget.cpp index f9b898c1..dafa801c 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.cpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.cpp @@ -53,6 +53,7 @@ #include #include #include +#include #include #include @@ -169,6 +170,7 @@ public: void HandleHotkeyPressed(types::Hotkey hotkey, bool isAutoRepeat); void HandleHotkeyReleased(types::Hotkey hotkey); void HandleHotkeyUpdates(); + void HandlePinchGesture(QPinchGesture* gesture); void ImGuiCheckFonts(); void InitializeCustomStyles(); void InitializeNewRadarProductView(const std::string& colorPalette); @@ -293,6 +295,8 @@ MapWidget::MapWidget(std::size_t id, const QMapLibre::Settings& settings) : setFocusPolicy(Qt::StrongFocus); + grabGesture(Qt::GestureType::PinchGesture); + ImGui_ImplQt_RegisterWidget(this); // Qt parent deals with memory management @@ -603,6 +607,15 @@ void MapWidgetImpl::HandleHotkeyUpdates() } } +void MapWidgetImpl::HandlePinchGesture(QPinchGesture* gesture) +{ + if (gesture->changeFlags() & QPinchGesture::ChangeFlag::ScaleFactorChanged) + { + map_->scaleBy(gesture->scaleFactor(), + widget_->mapFromGlobal(gesture->centerPoint())); + } +} + common::Level3ProductCategoryMap MapWidget::GetAvailableLevel3Categories() { if (p->radarProductManager_ != nullptr) @@ -1396,6 +1409,18 @@ bool MapWidget::event(QEvent* e) } pickedEventHandler.reset(); + switch (e->type()) + { + case QEvent::Type::Gesture: + // QEvent is always a QGestureEvent + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-static-cast-downcast) + gestureEvent(static_cast(e)); + break; + + default: + break; + } + return QOpenGLWidget::event(e); } @@ -1425,6 +1450,16 @@ void MapWidget::keyReleaseEvent(QKeyEvent* ev) } } +void MapWidget::gestureEvent(QGestureEvent* ev) +{ + if (QGesture* pinch = ev->gesture(Qt::PinchGesture)) + { + // QGesture is always a QPinchGesture + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-static-cast-downcast) + p->HandlePinchGesture(static_cast(pinch)); + } +} + void MapWidget::mousePressEvent(QMouseEvent* ev) { p->lastPos_ = ev->position(); diff --git a/scwx-qt/source/scwx/qt/map/map_widget.hpp b/scwx-qt/source/scwx/qt/map/map_widget.hpp index 6764629e..845832e4 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.hpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.hpp @@ -13,6 +13,7 @@ #include +#include #include #include #include @@ -137,13 +138,14 @@ private: // QWidget implementation. bool event(QEvent* e) override; - void enterEvent(QEnterEvent* ev) override final; - void keyPressEvent(QKeyEvent* ev) override final; - void keyReleaseEvent(QKeyEvent* ev) override final; - void leaveEvent(QEvent* ev) override final; - void mousePressEvent(QMouseEvent* ev) override final; - void mouseMoveEvent(QMouseEvent* ev) override final; - void wheelEvent(QWheelEvent* ev) override final; + void enterEvent(QEnterEvent* ev) final; + void keyPressEvent(QKeyEvent* ev) final; + void keyReleaseEvent(QKeyEvent* ev) final; + void gestureEvent(QGestureEvent* ev); + void leaveEvent(QEvent* ev) final; + void mousePressEvent(QMouseEvent* ev) final; + void mouseMoveEvent(QMouseEvent* ev) final; + void wheelEvent(QWheelEvent* ev) final; // QOpenGLWidget implementation. void initializeGL() override final;