plotzoomer.cpp
Go to the documentation of this file.
1 #include "plotzoomer.h"
2 #include <QMouseEvent>
3 #include <QApplication>
4 #include <QSettings>
5 #include <QPen>
6 #include "qwt_scale_map.h"
7 #include "qwt_plot.h"
8 
9 PlotZoomer::PlotZoomer(QWidget* canvas)
10  : QwtPlotZoomer(canvas, true), _mouse_pressed(false), _zoom_enabled(false), _keep_aspect_ratio(true)
11 {
13 }
14 
15 void PlotZoomer::widgetMousePressEvent(QMouseEvent* me)
16 {
17  _mouse_pressed = false;
18  auto patterns = this->mousePattern();
19  for (QwtEventPattern::MousePattern& pattern : patterns)
20  {
21  if (this->mouseMatch(pattern, me))
22  {
23  _mouse_pressed = true;
24  // this->setTrackerMode(AlwaysOn);
25  _initial_pos = me->pos();
26  }
27  break;
28  }
30 }
31 
32 void PlotZoomer::widgetMouseMoveEvent(QMouseEvent* me)
33 {
34  if (_mouse_pressed)
35  {
36  auto patterns = this->mousePattern();
37  for (QwtEventPattern::MousePattern& pattern : patterns)
38  {
39  QRect rect(me->pos(), _initial_pos);
40  QRectF zoomRect = invTransform(rect.normalized());
41 
42  if (zoomRect.width() > minZoomSize().width() && zoomRect.height() > minZoomSize().height())
43  {
44  if (!_zoom_enabled)
45  {
46  QSettings settings;
47  QString theme = settings.value("Preferences::theme", "light").toString();
48  QPixmap pixmap(tr(":/style_%1/zoom_in.png").arg(theme));
49  QCursor zoom_cursor(pixmap.scaled(24, 24));
50 
51  _zoom_enabled = true;
54  QPen pen(parentWidget()->palette().foreground().color(), 1, Qt::DashLine);
55  this->setRubberBandPen(pen);
56  QApplication::setOverrideCursor(zoom_cursor);
57  }
58  }
59  else if (_zoom_enabled)
60  {
61  _zoom_enabled = false;
63  QApplication::restoreOverrideCursor();
64  }
65  break;
66  }
67  }
69 }
70 
72 {
73  _mouse_pressed = false;
74  _zoom_enabled = false;
77 }
78 
79 bool PlotZoomer::accept(QPolygon& pa) const
80 {
81  QApplication::restoreOverrideCursor();
82 
83  if (pa.count() < 2)
84  return false;
85 
86  QRect rect = QRect(pa[0], pa[int(pa.count()) - 1]);
87  QRectF zoomRect = invTransform(rect.normalized());
88 
89  if (zoomRect.width() < minZoomSize().width() && zoomRect.height() < minZoomSize().height())
90  {
91  return false;
92  }
93  return QwtPlotZoomer::accept(pa);
94 }
95 
96 void PlotZoomer::zoom(const QRectF& zoomRect)
97 {
98  QRectF rect = zoomRect;
99 
100  if (_keep_aspect_ratio)
101  {
102  const QRectF cr = canvas()->contentsRect();
103  const double canvas_ratio = cr.width() / cr.height();
104  const double zoom_ratio = zoomRect.width() / zoomRect.height();
105 
106  if (zoom_ratio < canvas_ratio)
107  {
108  double new_width = zoomRect.height() * canvas_ratio;
109  double increment = new_width - zoomRect.width();
110  rect.setWidth(new_width);
111  rect.moveLeft(rect.left() - 0.5 * increment);
112  }
113  else
114  {
115  double new_height = zoomRect.width() / canvas_ratio;
116  double increment = new_height - zoomRect.height();
117  rect.setHeight(new_height);
118  rect.moveTop(rect.top() - 0.5 * increment);
119  }
120  }
121  QwtPlotZoomer::zoom(rect);
122 }
123 
125 {
126  return QSizeF(scaleRect().width() * 0.02, scaleRect().height() * 0.02);
127 }
A pattern for mouse events.
virtual void zoom(const QRectF &)
Zoom in.
virtual QSizeF minZoomSize() const override
Limit zooming by a minimum rectangle.
Definition: plotzoomer.cpp:124
void setRubberBand(RubberBand)
Definition: qwt_picker.cpp:301
QWidget * canvas()
QWidget * parentWidget()
Return the parent widget, where the selection happens.
Definition: qwt_picker.cpp:274
void setTrackerMode(DisplayMode)
Set the display mode of the tracker.
Definition: qwt_picker.cpp:331
QRectF scaleRect() const
QRectF invTransform(const QRect &) const
QRectF zoomRect() const
No rubberband.
Definition: qwt_picker.h:131
bool _mouse_pressed
Definition: plotzoomer.h:33
QPoint _initial_pos
Definition: plotzoomer.h:36
virtual void widgetMouseMoveEvent(QMouseEvent *)
bool _zoom_enabled
Definition: plotzoomer.h:34
bool mouseMatch(MousePatternCode, const QMouseEvent *) const
Compare a mouse event with an event pattern.
virtual bool accept(QPolygon &) const override
Check and correct a selected rectangle.
Definition: plotzoomer.cpp:79
detail::named_arg< Char, T > arg(const Char *name, const T &arg)
Definition: core.h:1656
virtual void widgetMouseMoveEvent(QMouseEvent *event) override
Definition: plotzoomer.cpp:32
QwtPlotZoomer provides stacked zooming for a plot widget.
A rectangle ( only for QwtPickerMachine::RectSelection )
Definition: qwt_picker.h:143
virtual void zoom(const QRectF &rect) override
Zoom in.
Definition: plotzoomer.cpp:96
virtual void widgetMouseReleaseEvent(QMouseEvent *)
virtual bool accept(QPolygon &) const QWT_OVERRIDE
Check and correct a selected rectangle.
Display never.
Definition: qwt_picker.h:165
virtual void widgetMouseReleaseEvent(QMouseEvent *event) override
Definition: plotzoomer.cpp:71
const QVector< MousePattern > & mousePattern() const
void setRubberBandPen(const QPen &)
Definition: qwt_picker.cpp:471
virtual void widgetMousePressEvent(QMouseEvent *event) override
Definition: plotzoomer.cpp:15
virtual void widgetMousePressEvent(QMouseEvent *)
Definition: qwt_picker.cpp:995
bool _keep_aspect_ratio
Definition: plotzoomer.h:35


plotjuggler
Author(s): Davide Faconti
autogenerated on Sun Dec 6 2020 03:48:10