##// END OF EJS Templates
Display of selection zones on a graph
trabillard -
r1044:dd81862d7e96
parent child
Show More
@@ -0,0 +1,39
1 #ifndef SCIQLOP_VISUALIZATIONSELECTIONZONEITEM_H
2 #define SCIQLOP_VISUALIZATIONSELECTIONZONEITEM_H
3
4 #include <Common/spimpl.h>
5 #include <Data/SqpRange.h>
6 #include <Visualization/qcustomplot.h>
7
8 class VisualizationSelectionZoneItem : public QCPItemRect {
9 public:
10 VisualizationSelectionZoneItem(QCustomPlot *plot);
11 virtual ~VisualizationSelectionZoneItem();
12
13 void setName(const QString &name);
14 QString name() const;
15
16 SqpRange range() const;
17 void setRange(double tstart, double tend);
18 void setStart(double tstart);
19 void setEnd(double tend);
20
21 void setColor(const QColor &color);
22
23 void setEditionEnabled(bool value);
24 bool isEditionEnabled() const;
25
26 Qt::CursorShape curshorShapeForPosition(const QPoint &position) const;
27 void setHovered(bool value);
28
29 protected:
30 void mousePressEvent(QMouseEvent *event, const QVariant &details) override;
31 void mouseMoveEvent(QMouseEvent *event, const QPointF &startPos) override;
32 void mouseReleaseEvent(QMouseEvent *event, const QPointF &startPos) override;
33
34 private:
35 class VisualizationSelectionZoneItemPrivate;
36 spimpl::unique_impl_ptr<VisualizationSelectionZoneItemPrivate> impl;
37 };
38
39 #endif // SCIQLOP_VISUALIZATIONSELECTIONZONEITEM_H
@@ -0,0 +1,271
1 #include "Visualization/VisualizationSelectionZoneItem.h"
2
3 struct VisualizationSelectionZoneItem::VisualizationSelectionZoneItemPrivate {
4
5 QCustomPlot *m_Plot;
6 double m_T1 = 0;
7 double m_T2 = 0;
8 QColor m_Color;
9
10 bool m_IsEditionEnabled = true;
11 double m_MovedOrinalT1 = 0;
12 double m_MovedOrinalT2 = 0;
13
14 QCPItemStraightLine *m_LeftLine;
15 QCPItemStraightLine *m_RightLine;
16 QCPItemText *m_NameLabelItem = nullptr;
17
18 enum class EditionMode { NoEdition, ResizeLeft, ResizeRight, Move };
19 EditionMode m_CurrentEditionMode;
20
21 VisualizationSelectionZoneItemPrivate(QCustomPlot *plot)
22 : m_Plot(plot), m_Color(Qt::blue), m_CurrentEditionMode(EditionMode::NoEdition)
23 {
24 }
25
26 void updatePosition(VisualizationSelectionZoneItem *item)
27 {
28 item->topLeft->setCoords(m_T1, 0);
29 item->bottomRight->setCoords(m_T2, 1);
30 }
31
32 EditionMode getEditionMode(const QPoint &pos, const VisualizationSelectionZoneItem *zoneItem)
33 {
34 auto distanceLeft = m_LeftLine->selectTest(pos, false);
35 auto distanceRight = m_RightLine->selectTest(pos, false);
36 auto distance = zoneItem->selectTest(pos, true);
37
38 if (distanceRight <= distance) {
39 return VisualizationSelectionZoneItemPrivate::EditionMode::ResizeRight;
40 }
41 else if (distanceLeft <= distance) {
42 return VisualizationSelectionZoneItemPrivate::EditionMode::ResizeLeft;
43 }
44
45 return VisualizationSelectionZoneItemPrivate::EditionMode::Move;
46 }
47 };
48
49 VisualizationSelectionZoneItem::VisualizationSelectionZoneItem(QCustomPlot *plot)
50 : QCPItemRect(plot),
51 impl{spimpl::make_unique_impl<VisualizationSelectionZoneItemPrivate>(plot)}
52 {
53 topLeft->setTypeX(QCPItemPosition::ptPlotCoords);
54 topLeft->setTypeY(QCPItemPosition::ptAxisRectRatio);
55 bottomRight->setTypeX(QCPItemPosition::ptPlotCoords);
56 bottomRight->setTypeY(QCPItemPosition::ptAxisRectRatio);
57
58 impl->m_RightLine = new QCPItemStraightLine(plot);
59 impl->m_RightLine->point1->setParentAnchor(topRight);
60 impl->m_RightLine->point2->setParentAnchor(bottomRight);
61 impl->m_RightLine->point1->setTypeX(QCPItemPosition::ptAbsolute);
62 impl->m_RightLine->point1->setTypeY(QCPItemPosition::ptAbsolute);
63 impl->m_RightLine->point2->setTypeX(QCPItemPosition::ptAbsolute);
64 impl->m_RightLine->point2->setTypeY(QCPItemPosition::ptAbsolute);
65
66 impl->m_LeftLine = new QCPItemStraightLine(plot);
67 impl->m_LeftLine->point1->setParentAnchor(topLeft);
68 impl->m_LeftLine->point2->setParentAnchor(bottomLeft);
69 impl->m_LeftLine->point1->setTypeX(QCPItemPosition::ptAbsolute);
70 impl->m_LeftLine->point1->setTypeY(QCPItemPosition::ptAbsolute);
71 impl->m_LeftLine->point2->setTypeX(QCPItemPosition::ptAbsolute);
72 impl->m_LeftLine->point2->setTypeY(QCPItemPosition::ptAbsolute);
73
74 impl->m_RightLine->setSelectable(false);
75 impl->m_LeftLine->setSelectable(false);
76
77 // connect(this, &VisualizationSelectionZoneItem::selectionChanged, impl->m_RightLine,
78 // &QCPItemStraightLine::setSelected);
79 // connect(this, &VisualizationSelectionZoneItem::selectionChanged, impl->m_LeftLine,
80 // &QCPItemStraightLine::setSelected);
81
82 setColor(QColor("#E79D41"));
83 }
84
85 VisualizationSelectionZoneItem::~VisualizationSelectionZoneItem()
86 {
87 impl->m_Plot->removeItem(impl->m_RightLine);
88 impl->m_Plot->removeItem(impl->m_LeftLine);
89 }
90
91 void VisualizationSelectionZoneItem::setName(const QString &name)
92 {
93 if (name.isEmpty() && impl->m_NameLabelItem) {
94 impl->m_Plot->removeItem(impl->m_NameLabelItem);
95 impl->m_NameLabelItem = nullptr;
96 }
97 else if (!impl->m_NameLabelItem) {
98 impl->m_NameLabelItem = new QCPItemText(impl->m_Plot);
99 impl->m_NameLabelItem->setText(name);
100 impl->m_NameLabelItem->setPositionAlignment(Qt::AlignHCenter | Qt::AlignTop);
101 impl->m_NameLabelItem->setColor(impl->m_Color);
102 impl->m_NameLabelItem->position->setParentAnchor(top);
103 }
104 }
105
106 QString VisualizationSelectionZoneItem::name() const
107 {
108 if (!impl->m_NameLabelItem) {
109 return QString();
110 }
111
112 return impl->m_NameLabelItem->text();
113 }
114
115 SqpRange VisualizationSelectionZoneItem::range() const
116 {
117 SqpRange range;
118 range.m_TStart = impl->m_T1 <= impl->m_T2 ? impl->m_T1 : impl->m_T2;
119 range.m_TEnd = impl->m_T1 > impl->m_T2 ? impl->m_T1 : impl->m_T2;
120 return range;
121 }
122
123 void VisualizationSelectionZoneItem::setRange(double tstart, double tend)
124 {
125 impl->m_T1 = tstart;
126 impl->m_T2 = tend;
127 impl->updatePosition(this);
128 }
129
130 void VisualizationSelectionZoneItem::setStart(double tstart)
131 {
132 impl->m_T1 = tstart;
133 impl->updatePosition(this);
134 }
135
136 void VisualizationSelectionZoneItem::setEnd(double tend)
137 {
138 impl->m_T2 = tend;
139 impl->updatePosition(this);
140 }
141
142 void VisualizationSelectionZoneItem::setColor(const QColor &color)
143 {
144 impl->m_Color = color;
145
146 auto brushColor = color;
147 brushColor.setAlpha(40);
148 setBrush(QBrush(brushColor));
149 setPen(QPen(Qt::NoPen));
150
151 auto selectedBrushColor = brushColor;
152 selectedBrushColor.setAlpha(65);
153 setSelectedBrush(QBrush(selectedBrushColor));
154 setSelectedPen(QPen(Qt::NoPen));
155
156 auto linePen = QPen(color);
157 linePen.setStyle(Qt::SolidLine);
158 linePen.setWidth(2);
159
160 auto selectedLinePen = linePen;
161 selectedLinePen.setColor(color.darker(30));
162
163 impl->m_LeftLine->setPen(linePen);
164 impl->m_RightLine->setPen(linePen);
165
166 impl->m_LeftLine->setSelectedPen(selectedLinePen);
167 impl->m_RightLine->setSelectedPen(selectedLinePen);
168 }
169
170 void VisualizationSelectionZoneItem::setEditionEnabled(bool value)
171 {
172 impl->m_IsEditionEnabled = value;
173 setSelectable(value);
174 if (!value) {
175 setSelected(false);
176 }
177 }
178
179 bool VisualizationSelectionZoneItem::isEditionEnabled() const
180 {
181 return impl->m_IsEditionEnabled;
182 }
183
184 Qt::CursorShape
185 VisualizationSelectionZoneItem::curshorShapeForPosition(const QPoint &position) const
186 {
187 auto mode = impl->m_CurrentEditionMode
188 == VisualizationSelectionZoneItemPrivate::EditionMode::NoEdition
189 ? impl->getEditionMode(position, this)
190 : impl->m_CurrentEditionMode;
191 switch (mode) {
192 case VisualizationSelectionZoneItemPrivate::EditionMode::Move:
193 return Qt::SizeAllCursor;
194 case VisualizationSelectionZoneItemPrivate::EditionMode::ResizeLeft:
195 case VisualizationSelectionZoneItemPrivate::EditionMode::ResizeRight: // fallthrough
196 return Qt::SizeHorCursor;
197 default:
198 return Qt::ArrowCursor;
199 }
200 }
201
202 void VisualizationSelectionZoneItem::setHovered(bool value)
203 {
204 if (value) {
205 auto linePen = impl->m_LeftLine->pen();
206 linePen.setStyle(Qt::DotLine);
207 linePen.setWidth(3);
208
209 auto selectedLinePen = impl->m_LeftLine->selectedPen();
210 ;
211 selectedLinePen.setStyle(Qt::DotLine);
212 selectedLinePen.setWidth(3);
213
214 impl->m_LeftLine->setPen(linePen);
215 impl->m_RightLine->setPen(linePen);
216
217 impl->m_LeftLine->setSelectedPen(selectedLinePen);
218 impl->m_RightLine->setSelectedPen(selectedLinePen);
219 }
220 else {
221 setColor(impl->m_Color);
222 }
223 }
224
225 void VisualizationSelectionZoneItem::mousePressEvent(QMouseEvent *event, const QVariant &details)
226 {
227 if (isEditionEnabled()) {
228 impl->m_CurrentEditionMode = impl->getEditionMode(event->pos(), this);
229
230 impl->m_MovedOrinalT1 = impl->m_T1;
231 impl->m_MovedOrinalT2 = impl->m_T2;
232 }
233 else {
234 event->ignore();
235 }
236 }
237
238 void VisualizationSelectionZoneItem::mouseMoveEvent(QMouseEvent *event, const QPointF &startPos)
239 {
240 if (isEditionEnabled()) {
241 auto axis = impl->m_Plot->axisRect()->axis(QCPAxis::atBottom);
242 auto diff = axis->pixelToCoord(event->pos().x()) - axis->pixelToCoord(startPos.x());
243
244 switch (impl->m_CurrentEditionMode) {
245 case VisualizationSelectionZoneItemPrivate::EditionMode::Move:
246 setRange(impl->m_MovedOrinalT1 + diff, impl->m_MovedOrinalT2 + diff);
247 break;
248 case VisualizationSelectionZoneItemPrivate::EditionMode::ResizeLeft:
249 setStart(impl->m_MovedOrinalT1 + diff);
250 break;
251 case VisualizationSelectionZoneItemPrivate::EditionMode::ResizeRight:
252 setEnd(impl->m_MovedOrinalT2 + diff);
253 break;
254 // default:
255 // unknown edition mode
256 }
257 }
258 else {
259 event->ignore();
260 }
261 }
262
263 void VisualizationSelectionZoneItem::mouseReleaseEvent(QMouseEvent *event, const QPointF &startPos)
264 {
265 if (isEditionEnabled()) {
266 impl->m_CurrentEditionMode = VisualizationSelectionZoneItemPrivate::EditionMode::NoEdition;
267 }
268 else {
269 event->ignore();
270 }
271 }
@@ -82,7 +82,8 gui_sources = [
82 'src/Visualization/VisualizationCursorItem.cpp',
82 'src/Visualization/VisualizationCursorItem.cpp',
83 'src/Visualization/ColorScaleEditor.cpp',
83 'src/Visualization/ColorScaleEditor.cpp',
84 'src/Visualization/SqpColorScale.cpp',
84 'src/Visualization/SqpColorScale.cpp',
85 'src/Visualization/QCPColorMapIterator.cpp'
85 'src/Visualization/QCPColorMapIterator.cpp',
86 'src/Visualization/VisualizationSelectionZoneItem.cpp'
86 ]
87 ]
87
88
88 gui_inc = include_directories(['include'])
89 gui_inc = include_directories(['include'])
@@ -48,6 +48,7 void initPointTracerStyle(QCPItemTracer &tracer) noexcept
48 tracer.setSize(3);
48 tracer.setSize(3);
49 tracer.setPen(QPen(Qt::black));
49 tracer.setPen(QPen(Qt::black));
50 tracer.setBrush(Qt::black);
50 tracer.setBrush(Qt::black);
51 tracer.setSelectable(false);
51 }
52 }
52
53
53 QPixmap pixmap(const QString &iconPath) noexcept
54 QPixmap pixmap(const QString &iconPath) noexcept
@@ -94,6 +95,7 void initTitleTextStyle(QCPItemText &text) noexcept
94 text.setPositionAlignment(Qt::AlignTop | Qt::AlignLeft);
95 text.setPositionAlignment(Qt::AlignTop | Qt::AlignLeft);
95 text.position->setType(QCPItemPosition::ptAxisRectRatio);
96 text.position->setType(QCPItemPosition::ptAxisRectRatio);
96 text.position->setCoords(0.5, 0);
97 text.position->setCoords(0.5, 0);
98 text.setSelectable(false);
97 }
99 }
98
100
99 /**
101 /**
@@ -4,6 +4,7
4 #include "Visualization/VisualizationDefs.h"
4 #include "Visualization/VisualizationDefs.h"
5 #include "Visualization/VisualizationGraphHelper.h"
5 #include "Visualization/VisualizationGraphHelper.h"
6 #include "Visualization/VisualizationGraphRenderingDelegate.h"
6 #include "Visualization/VisualizationGraphRenderingDelegate.h"
7 #include "Visualization/VisualizationSelectionZoneItem.h"
7 #include "Visualization/VisualizationZoneWidget.h"
8 #include "Visualization/VisualizationZoneWidget.h"
8 #include "ui_VisualizationGraphWidget.h"
9 #include "ui_VisualizationGraphWidget.h"
9
10
@@ -71,18 +72,14 struct VisualizationGraphWidget::VisualizationGraphWidgetPrivate {
71 /// Delegate used to attach rendering features to the plot
72 /// Delegate used to attach rendering features to the plot
72 std::unique_ptr<VisualizationGraphRenderingDelegate> m_RenderingDelegate;
73 std::unique_ptr<VisualizationGraphRenderingDelegate> m_RenderingDelegate;
73
74
74 QCPItemRect *m_DrawingRect = nullptr;
75 QCPItemRect *m_DrawingZoomRect = nullptr;
76
75 std::unique_ptr<VisualizationCursorItem> m_HorizontalCursor = nullptr;
77 std::unique_ptr<VisualizationCursorItem> m_HorizontalCursor = nullptr;
76 std::unique_ptr<VisualizationCursorItem> m_VerticalCursor = nullptr;
78 std::unique_ptr<VisualizationCursorItem> m_VerticalCursor = nullptr;
77
79
78 void configureDrawingRect()
80 VisualizationSelectionZoneItem *m_DrawingZone = nullptr;
79 {
81 VisualizationSelectionZoneItem *m_HoveredZone = nullptr;
80 if (m_DrawingRect) {
82 QVector<VisualizationSelectionZoneItem *> m_SelectionZones;
81 QPen p;
82 p.setWidth(2);
83 m_DrawingRect->setPen(p);
84 }
85 }
86
83
87 void startDrawingRect(const QPoint &pos, QCustomPlot &plot)
84 void startDrawingRect(const QPoint &pos, QCustomPlot &plot)
88 {
85 {
@@ -90,22 +87,59 struct VisualizationGraphWidget::VisualizationGraphWidgetPrivate {
90
87
91 auto axisPos = posToAxisPos(pos, plot);
88 auto axisPos = posToAxisPos(pos, plot);
92
89
93 m_DrawingRect = new QCPItemRect{&plot};
90 m_DrawingZoomRect = new QCPItemRect{&plot};
94 configureDrawingRect();
91 QPen p;
92 p.setWidth(2);
93 m_DrawingZoomRect->setPen(p);
95
94
96 m_DrawingRect->topLeft->setCoords(axisPos);
95 m_DrawingZoomRect->topLeft->setCoords(axisPos);
97 m_DrawingRect->bottomRight->setCoords(axisPos);
96 m_DrawingZoomRect->bottomRight->setCoords(axisPos);
98 }
97 }
99
98
100 void removeDrawingRect(QCustomPlot &plot)
99 void removeDrawingRect(QCustomPlot &plot)
101 {
100 {
102 if (m_DrawingRect) {
101 if (m_DrawingZoomRect) {
103 plot.removeItem(m_DrawingRect); // the item is deleted by QCustomPlot
102 plot.removeItem(m_DrawingZoomRect); // the item is deleted by QCustomPlot
104 m_DrawingRect = nullptr;
103 m_DrawingZoomRect = nullptr;
105 plot.replot(QCustomPlot::rpQueuedReplot);
104 plot.replot(QCustomPlot::rpQueuedReplot);
106 }
105 }
107 }
106 }
108
107
108 void startDrawingZone(const QPoint &pos, QCustomPlot &plot)
109 {
110 endDrawingZone(plot);
111
112 auto axisPos = posToAxisPos(pos, plot);
113
114 m_DrawingZone = new VisualizationSelectionZoneItem{&plot};
115 m_DrawingZone->setRange(axisPos.x(), axisPos.x());
116 m_DrawingZone->setEditionEnabled(false);
117 }
118
119 void endDrawingZone(QCustomPlot &plot)
120 {
121 if (m_DrawingZone) {
122 auto drawingZoneRange = m_DrawingZone->range();
123 if (qAbs(drawingZoneRange.m_TEnd - drawingZoneRange.m_TStart) > 0) {
124 m_DrawingZone->setEditionEnabled(true);
125 m_SelectionZones.append(m_DrawingZone);
126 }
127 else {
128 plot.removeItem(m_DrawingZone); // the item is deleted by QCustomPlot
129 }
130
131 plot.replot(QCustomPlot::rpQueuedReplot);
132 m_DrawingZone = nullptr;
133 }
134 }
135
136 void setSelectionZonesEditionEnabled(bool value)
137 {
138 for (auto s : m_SelectionZones) {
139 s->setEditionEnabled(value);
140 }
141 }
142
109 QPointF posToAxisPos(const QPoint &pos, QCustomPlot &plot) const
143 QPointF posToAxisPos(const QPoint &pos, QCustomPlot &plot) const
110 {
144 {
111 auto axisX = plot.axisRect()->axis(QCPAxis::atBottom);
145 auto axisX = plot.axisRect()->axis(QCPAxis::atBottom);
@@ -117,7 +151,6 struct VisualizationGraphWidget::VisualizationGraphWidgetPrivate {
117 {
151 {
118 auto axisX = plot.axisRect()->axis(QCPAxis::atBottom);
152 auto axisX = plot.axisRect()->axis(QCPAxis::atBottom);
119 auto axisY = plot.axisRect()->axis(QCPAxis::atLeft);
153 auto axisY = plot.axisRect()->axis(QCPAxis::atLeft);
120
121 return axisX->range().contains(axisPoint.x()) && axisY->range().contains(axisPoint.y());
154 return axisX->range().contains(axisPoint.x()) && axisY->range().contains(axisPoint.y());
122 }
155 }
123 };
156 };
@@ -133,7 +166,7 VisualizationGraphWidget::VisualizationGraphWidget(const QString &name, QWidget
133 setAttribute(Qt::WA_DeleteOnClose);
166 setAttribute(Qt::WA_DeleteOnClose);
134
167
135 // Set qcpplot properties :
168 // Set qcpplot properties :
136 // - Drag (on x-axis) and zoom are enabled
169 // - zoom is enabled
137 // - Mouse wheel on qcpplot is intercepted to determine the zoom orientation
170 // - Mouse wheel on qcpplot is intercepted to determine the zoom orientation
138 ui->widget->setInteractions(QCP::iRangeZoom | QCP::iSelectItems);
171 ui->widget->setInteractions(QCP::iRangeZoom | QCP::iSelectItems);
139
172
@@ -428,6 +461,11 void VisualizationGraphWidget::leaveEvent(QEvent *event)
428 else {
461 else {
429 qCWarning(LOG_VisualizationGraphWidget()) << "leaveEvent: No parent zone widget";
462 qCWarning(LOG_VisualizationGraphWidget()) << "leaveEvent: No parent zone widget";
430 }
463 }
464
465 if (impl->m_HoveredZone) {
466 impl->m_HoveredZone->setHovered(false);
467 impl->m_HoveredZone = nullptr;
468 }
431 }
469 }
432
470
433 QCustomPlot &VisualizationGraphWidget::plot() noexcept
471 QCustomPlot &VisualizationGraphWidget::plot() noexcept
@@ -508,10 +546,15 void VisualizationGraphWidget::onMouseMove(QMouseEvent *event) noexcept
508
546
509 auto axisPos = impl->posToAxisPos(event->pos(), plot());
547 auto axisPos = impl->posToAxisPos(event->pos(), plot());
510
548
511 if (impl->m_DrawingRect) {
549 // Zoom box and zone drawing
512 impl->m_DrawingRect->bottomRight->setCoords(axisPos);
550 if (impl->m_DrawingZoomRect) {
551 impl->m_DrawingZoomRect->bottomRight->setCoords(axisPos);
552 }
553 else if (impl->m_DrawingZone) {
554 impl->m_DrawingZone->setEnd(axisPos.x());
513 }
555 }
514
556
557 // Cursor
515 if (auto parentZone = parentZoneWidget()) {
558 if (auto parentZone = parentZoneWidget()) {
516 if (impl->pointIsInAxisRect(axisPos, plot())) {
559 if (impl->pointIsInAxisRect(axisPos, plot())) {
517 parentZone->notifyMouseMoveInGraph(event->pos(), axisPos, this);
560 parentZone->notifyMouseMoveInGraph(event->pos(), axisPos, this);
@@ -524,6 +567,44 void VisualizationGraphWidget::onMouseMove(QMouseEvent *event) noexcept
524 qCWarning(LOG_VisualizationGraphWidget()) << "onMouseMove: No parent zone widget";
567 qCWarning(LOG_VisualizationGraphWidget()) << "onMouseMove: No parent zone widget";
525 }
568 }
526
569
570 // Search for the selection zone under the mouse
571 VisualizationSelectionZoneItem *selectionZoneItemUnderCursor = nullptr;
572 auto minDistanceToZone = -1;
573 for (auto zone : impl->m_SelectionZones) {
574 auto distanceToZone = zone->selectTest(event->pos(), true);
575 if ((minDistanceToZone < 0 || distanceToZone <= minDistanceToZone) && distanceToZone >= 0
576 && distanceToZone < plot().selectionTolerance()) {
577 selectionZoneItemUnderCursor = zone;
578 }
579 }
580
581 if (selectionZoneItemUnderCursor && !impl->m_DrawingZone
582 && sqpApp->plotsInteractionMode() == SqpApplication::PlotsInteractionMode::SelectionZones) {
583
584 // Sets the appropriate cursor shape
585 auto cursorShape = selectionZoneItemUnderCursor->curshorShapeForPosition(event->pos());
586 setCursor(cursorShape);
587
588 // Manages the hovered zone
589 if (selectionZoneItemUnderCursor != impl->m_HoveredZone) {
590 if (impl->m_HoveredZone) {
591 impl->m_HoveredZone->setHovered(false);
592 }
593 selectionZoneItemUnderCursor->setHovered(true);
594 impl->m_HoveredZone = selectionZoneItemUnderCursor;
595 plot().replot(QCustomPlot::rpQueuedReplot);
596 }
597 }
598 else {
599 // There is no zone under the mouse or the interaction mode is not "selection zones"
600 if (impl->m_HoveredZone) {
601 impl->m_HoveredZone->setHovered(false);
602 impl->m_HoveredZone = nullptr;
603 }
604
605 setCursor(Qt::ArrowCursor);
606 }
607
527 VisualizationDragWidget::mouseMoveEvent(event);
608 VisualizationDragWidget::mouseMoveEvent(event);
528 }
609 }
529
610
@@ -561,24 +642,41 void VisualizationGraphWidget::onMouseWheel(QWheelEvent *event) noexcept
561 void VisualizationGraphWidget::onMousePress(QMouseEvent *event) noexcept
642 void VisualizationGraphWidget::onMousePress(QMouseEvent *event) noexcept
562 {
643 {
563 if (sqpApp->plotsInteractionMode() == SqpApplication::PlotsInteractionMode::ZoomBox) {
644 if (sqpApp->plotsInteractionMode() == SqpApplication::PlotsInteractionMode::ZoomBox) {
645 // Starts a zoom box
564 impl->startDrawingRect(event->pos(), plot());
646 impl->startDrawingRect(event->pos(), plot());
565 }
647 }
648 else if (sqpApp->plotsInteractionMode() == SqpApplication::PlotsInteractionMode::SelectionZones
649 && impl->m_DrawingZone == nullptr) {
650 // Starts a new selection zone
651 auto itemAtPos = plot().itemAt(event->pos(), true);
652 if (!itemAtPos) {
653 impl->startDrawingZone(event->pos(), plot());
654 }
655 }
656
657 // Allows mouse panning only in default mode
658 plot().setInteraction(QCP::iRangeDrag, sqpApp->plotsInteractionMode()
659 == SqpApplication::PlotsInteractionMode::None);
660
661 // Allows zone edition only in selection zone mode
662 impl->setSelectionZonesEditionEnabled(sqpApp->plotsInteractionMode()
663 == SqpApplication::PlotsInteractionMode::SelectionZones);
566
664
567 VisualizationDragWidget::mousePressEvent(event);
665 VisualizationDragWidget::mousePressEvent(event);
568 }
666 }
569
667
570 void VisualizationGraphWidget::onMouseRelease(QMouseEvent *event) noexcept
668 void VisualizationGraphWidget::onMouseRelease(QMouseEvent *event) noexcept
571 {
669 {
572 if (impl->m_DrawingRect) {
670 if (impl->m_DrawingZoomRect) {
573
671
574 auto axisX = plot().axisRect()->axis(QCPAxis::atBottom);
672 auto axisX = plot().axisRect()->axis(QCPAxis::atBottom);
575 auto axisY = plot().axisRect()->axis(QCPAxis::atLeft);
673 auto axisY = plot().axisRect()->axis(QCPAxis::atLeft);
576
674
577 auto newAxisXRange = QCPRange{impl->m_DrawingRect->topLeft->coords().x(),
675 auto newAxisXRange = QCPRange{impl->m_DrawingZoomRect->topLeft->coords().x(),
578 impl->m_DrawingRect->bottomRight->coords().x()};
676 impl->m_DrawingZoomRect->bottomRight->coords().x()};
579
677
580 auto newAxisYRange = QCPRange{impl->m_DrawingRect->topLeft->coords().y(),
678 auto newAxisYRange = QCPRange{impl->m_DrawingZoomRect->topLeft->coords().y(),
581 impl->m_DrawingRect->bottomRight->coords().y()};
679 impl->m_DrawingZoomRect->bottomRight->coords().y()};
582
680
583 impl->removeDrawingRect(plot());
681 impl->removeDrawingRect(plot());
584
682
@@ -591,6 +689,8 void VisualizationGraphWidget::onMouseRelease(QMouseEvent *event) noexcept
591 }
689 }
592 }
690 }
593
691
692 impl->endDrawingZone(plot());
693
594 impl->m_IsCalibration = false;
694 impl->m_IsCalibration = false;
595 }
695 }
596
696
General Comments 0
You need to be logged in to leave comments. Login now