diff --git a/gui/include/Visualization/VisualizationGraphWidget.h b/gui/include/Visualization/VisualizationGraphWidget.h index fc927c9..cee73b7 100644 --- a/gui/include/Visualization/VisualizationGraphWidget.h +++ b/gui/include/Visualization/VisualizationGraphWidget.h @@ -34,6 +34,10 @@ private: class VisualizationGraphWidgetPrivate; spimpl::unique_impl_ptr impl; + +private slots: + /// Slot called when a mouse wheel was made, to perform some processing before the zoom is done + void onMouseWheel(QWheelEvent *event) noexcept; }; #endif // SCIQLOP_VISUALIZATIONGRAPHWIDGET_H diff --git a/gui/src/Visualization/VisualizationGraphWidget.cpp b/gui/src/Visualization/VisualizationGraphWidget.cpp index 90feb76..09ab3f6 100644 --- a/gui/src/Visualization/VisualizationGraphWidget.cpp +++ b/gui/src/Visualization/VisualizationGraphWidget.cpp @@ -5,6 +5,16 @@ #include +namespace { + +/// Key pressed to enable zoom on horizontal axis +const auto HORIZONTAL_ZOOM_MODIFIER = Qt::NoModifier; + +/// Key pressed to enable zoom on vertical axis +const auto VERTICAL_ZOOM_MODIFIER = Qt::ControlModifier; + +} // namespace + struct VisualizationGraphWidget::VisualizationGraphWidgetPrivate { // 1 variable -> n qcpplot @@ -21,7 +31,9 @@ VisualizationGraphWidget::VisualizationGraphWidget(QWidget *parent) // Set qcpplot properties : // - Drag and zoom are enabled + // - Mouse wheel on qcpplot is intercepted to determine the zoom orientation ui->widget->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom); + connect(ui->widget, &QCustomPlot::mouseWheel, this, &VisualizationGraphWidget::onMouseWheel); } VisualizationGraphWidget::~VisualizationGraphWidget() @@ -49,3 +61,20 @@ QString VisualizationGraphWidget::name() const { return QStringLiteral("MainView"); } + +void VisualizationGraphWidget::onMouseWheel(QWheelEvent *event) noexcept +{ + auto zoomOrientations = QFlags{}; + + // Lambda that enables a zoom orientation if the key modifier related to this orientation has + // been pressed + auto enableOrientation + = [&zoomOrientations, event](const auto &orientation, const auto &modifier) { + auto orientationEnabled = event->modifiers().testFlag(modifier); + zoomOrientations.setFlag(orientation, orientationEnabled); + }; + enableOrientation(Qt::Vertical, VERTICAL_ZOOM_MODIFIER); + enableOrientation(Qt::Horizontal, HORIZONTAL_ZOOM_MODIFIER); + + ui->widget->axisRect()->setRangeZoom(zoomOrientations); +}