diff --git a/gui/include/Visualization/VisualizationGraphWidget.h b/gui/include/Visualization/VisualizationGraphWidget.h index be9f91b..5857782 100644 --- a/gui/include/Visualization/VisualizationGraphWidget.h +++ b/gui/include/Visualization/VisualizationGraphWidget.h @@ -51,6 +51,9 @@ public: SqpRange graphRange() const noexcept; void setGraphRange(const SqpRange &range); + /// Undo the last zoom done with a zoom box + void undoZoom(); + // IVisualizationWidget interface void accept(IVisualizationWidgetVisitor *visitor) override; bool canDrop(const Variable &variable) const override; diff --git a/gui/src/Visualization/VisualizationGraphWidget.cpp b/gui/src/Visualization/VisualizationGraphWidget.cpp index 1e6c8bf..d28306d 100644 --- a/gui/src/Visualization/VisualizationGraphWidget.cpp +++ b/gui/src/Visualization/VisualizationGraphWidget.cpp @@ -73,6 +73,7 @@ struct VisualizationGraphWidget::VisualizationGraphWidgetPrivate { std::unique_ptr m_RenderingDelegate; QCPItemRect *m_DrawingZoomRect = nullptr; + QStack > m_ZoomStack; std::unique_ptr m_HorizontalCursor = nullptr; std::unique_ptr m_VerticalCursor = nullptr; @@ -315,6 +316,18 @@ void VisualizationGraphWidget::setGraphRange(const SqpRange &range) qCDebug(LOG_VisualizationGraphWidget()) << tr("VisualizationGraphWidget::setGraphRange END"); } +void VisualizationGraphWidget::undoZoom() +{ + auto zoom = impl->m_ZoomStack.pop(); + auto axisX = plot().axisRect()->axis(QCPAxis::atBottom); + auto axisY = plot().axisRect()->axis(QCPAxis::atLeft); + + axisX->setRange(zoom.first); + axisY->setRange(zoom.second); + + plot().replot(QCustomPlot::rpQueuedReplot); +} + void VisualizationGraphWidget::accept(IVisualizationWidgetVisitor *visitor) { if (visitor) { @@ -487,6 +500,14 @@ void VisualizationGraphWidget::onGraphMenuRequested(const QPoint &pos) noexcept [ this, var = it->first ]() { removeVariable(var); }); } + if (!impl->m_ZoomStack.isEmpty()) { + if (!graphMenu.isEmpty()) { + graphMenu.addSeparator(); + } + + graphMenu.addAction(tr("Undo Zoom"), [this]() { undoZoom(); }); + } + if (!graphMenu.isEmpty()) { graphMenu.exec(QCursor::pos()); } @@ -686,6 +707,7 @@ void VisualizationGraphWidget::onMouseRelease(QMouseEvent *event) noexcept if (newAxisXRange.size() > axisX->range().size() * (ZOOM_BOX_MIN_SIZE / 100.0) && newAxisYRange.size() > axisY->range().size() * (ZOOM_BOX_MIN_SIZE / 100.0)) { + impl->m_ZoomStack.push(qMakePair(axisX->range(), axisY->range())); axisX->setRange(newAxisXRange); axisY->setRange(newAxisYRange);