@@ -34,6 +34,9 const auto PAN_SPEED = 5; | |||||
34 | /// Key pressed to enable a calibration pan |
|
34 | /// Key pressed to enable a calibration pan | |
35 | const auto VERTICAL_PAN_MODIFIER = Qt::AltModifier; |
|
35 | const auto VERTICAL_PAN_MODIFIER = Qt::AltModifier; | |
36 |
|
36 | |||
|
37 | /// Minimum size for the zoom box, in percentage of the axis range | |||
|
38 | const auto ZOOM_BOX_MIN_SIZE = 0.8; | |||
|
39 | ||||
37 | } // namespace |
|
40 | } // namespace | |
38 |
|
41 | |||
39 | struct VisualizationGraphWidget::VisualizationGraphWidgetPrivate { |
|
42 | struct VisualizationGraphWidget::VisualizationGraphWidgetPrivate { | |
@@ -53,6 +56,46 struct VisualizationGraphWidget::VisualizationGraphWidgetPrivate { | |||||
53 | bool m_IsCalibration; |
|
56 | bool m_IsCalibration; | |
54 | /// Delegate used to attach rendering features to the plot |
|
57 | /// Delegate used to attach rendering features to the plot | |
55 | std::unique_ptr<VisualizationGraphRenderingDelegate> m_RenderingDelegate; |
|
58 | std::unique_ptr<VisualizationGraphRenderingDelegate> m_RenderingDelegate; | |
|
59 | ||||
|
60 | QCPItemRect *m_DrawingRect = nullptr; | |||
|
61 | ||||
|
62 | void configureDrawingRect() | |||
|
63 | { | |||
|
64 | if (m_DrawingRect) { | |||
|
65 | QPen p; | |||
|
66 | p.setWidth(2); | |||
|
67 | m_DrawingRect->setPen(p); | |||
|
68 | } | |||
|
69 | } | |||
|
70 | ||||
|
71 | void startDrawingRect(const QPoint &pos, QCustomPlot &plot) | |||
|
72 | { | |||
|
73 | removeDrawingRect(plot); | |||
|
74 | ||||
|
75 | auto axisPos = posToAxisPos(pos, plot); | |||
|
76 | ||||
|
77 | m_DrawingRect = new QCPItemRect{&plot}; | |||
|
78 | configureDrawingRect(); | |||
|
79 | ||||
|
80 | m_DrawingRect->topLeft->setCoords(axisPos); | |||
|
81 | m_DrawingRect->bottomRight->setCoords(axisPos); | |||
|
82 | } | |||
|
83 | ||||
|
84 | void removeDrawingRect(QCustomPlot &plot) | |||
|
85 | { | |||
|
86 | if (m_DrawingRect) { | |||
|
87 | plot.removeItem(m_DrawingRect); // the item is deleted by QCustomPlot | |||
|
88 | m_DrawingRect = nullptr; | |||
|
89 | plot.replot(QCustomPlot::rpQueuedReplot); | |||
|
90 | } | |||
|
91 | } | |||
|
92 | ||||
|
93 | QPointF posToAxisPos(const QPoint &pos, QCustomPlot &plot) const | |||
|
94 | { | |||
|
95 | auto axisX = plot.axisRect()->axis(QCPAxis::atBottom); | |||
|
96 | auto axisY = plot.axisRect()->axis(QCPAxis::atLeft); | |||
|
97 | return QPointF{axisX->pixelToCoord(pos.x()), axisY->pixelToCoord(pos.y())}; | |||
|
98 | } | |||
56 | }; |
|
99 | }; | |
57 |
|
100 | |||
58 | VisualizationGraphWidget::VisualizationGraphWidget(const QString &name, QWidget *parent) |
|
101 | VisualizationGraphWidget::VisualizationGraphWidget(const QString &name, QWidget *parent) | |
@@ -344,6 +387,11 void VisualizationGraphWidget::onMouseMove(QMouseEvent *event) noexcept | |||||
344 | // Handles plot rendering when mouse is moving |
|
387 | // Handles plot rendering when mouse is moving | |
345 | impl->m_RenderingDelegate->onMouseMove(event); |
|
388 | impl->m_RenderingDelegate->onMouseMove(event); | |
346 |
|
389 | |||
|
390 | if (impl->m_DrawingRect) { | |||
|
391 | auto axisPos = impl->posToAxisPos(event->pos(), plot()); | |||
|
392 | impl->m_DrawingRect->bottomRight->setCoords(axisPos); | |||
|
393 | } | |||
|
394 | ||||
347 | VisualizationDragWidget::mouseMoveEvent(event); |
|
395 | VisualizationDragWidget::mouseMoveEvent(event); | |
348 | } |
|
396 | } | |
349 |
|
397 | |||
@@ -380,11 +428,37 void VisualizationGraphWidget::onMouseWheel(QWheelEvent *event) noexcept | |||||
380 |
|
428 | |||
381 | void VisualizationGraphWidget::onMousePress(QMouseEvent *event) noexcept |
|
429 | void VisualizationGraphWidget::onMousePress(QMouseEvent *event) noexcept | |
382 | { |
|
430 | { | |
|
431 | if (sqpApp->plotsInteractionMode() == SqpApplication::PlotsInteractionMode::ZoomBox) { | |||
|
432 | impl->startDrawingRect(event->pos(), plot()); | |||
|
433 | } | |||
|
434 | ||||
383 | VisualizationDragWidget::mousePressEvent(event); |
|
435 | VisualizationDragWidget::mousePressEvent(event); | |
384 | } |
|
436 | } | |
385 |
|
437 | |||
386 | void VisualizationGraphWidget::onMouseRelease(QMouseEvent *event) noexcept |
|
438 | void VisualizationGraphWidget::onMouseRelease(QMouseEvent *event) noexcept | |
387 | { |
|
439 | { | |
|
440 | if (impl->m_DrawingRect) { | |||
|
441 | ||||
|
442 | auto axisX = plot().axisRect()->axis(QCPAxis::atBottom); | |||
|
443 | auto axisY = plot().axisRect()->axis(QCPAxis::atLeft); | |||
|
444 | ||||
|
445 | auto newAxisXRange = QCPRange{impl->m_DrawingRect->topLeft->coords().x(), | |||
|
446 | impl->m_DrawingRect->bottomRight->coords().x()}; | |||
|
447 | ||||
|
448 | auto newAxisYRange = QCPRange{impl->m_DrawingRect->topLeft->coords().y(), | |||
|
449 | impl->m_DrawingRect->bottomRight->coords().y()}; | |||
|
450 | ||||
|
451 | impl->removeDrawingRect(plot()); | |||
|
452 | ||||
|
453 | if (newAxisXRange.size() > axisX->range().size() * (ZOOM_BOX_MIN_SIZE / 100.0) | |||
|
454 | && newAxisYRange.size() > axisY->range().size() * (ZOOM_BOX_MIN_SIZE / 100.0)) { | |||
|
455 | axisX->setRange(newAxisXRange); | |||
|
456 | axisY->setRange(newAxisYRange); | |||
|
457 | ||||
|
458 | plot().replot(QCustomPlot::rpQueuedReplot); | |||
|
459 | } | |||
|
460 | } | |||
|
461 | ||||
388 | impl->m_IsCalibration = false; |
|
462 | impl->m_IsCalibration = false; | |
389 | } |
|
463 | } | |
390 |
|
464 |
General Comments 0
You need to be logged in to leave comments.
Login now