# HG changeset patch # User Hasan Yavuz Ă–ZDERYA # Date 2017-04-22 12:57:22 # Node ID c9d4060942ac8161894633ca65e910e98e855da9 # Parent ebae6e42a84a9d8cc303365c13c7caa732e84d2f added panning when ctrl is pressed diff --git a/src/zoomer.cpp b/src/zoomer.cpp --- a/src/zoomer.cpp +++ b/src/zoomer.cpp @@ -21,9 +21,13 @@ #include #include +#include + Zoomer::Zoomer(QWidget* widget, bool doReplot) : ScrollZoomer(widget) { + is_panning = false; + // set corner widget between the scrollbars with default background color auto cornerWidget = new QWidget(); auto bgColor = cornerWidget->palette().color(QPalette::Window).name(); @@ -95,3 +99,43 @@ QRegion Zoomer::rubberBandMask() const const QRect r = QRect(pa.first(), pa.last()).normalized().adjusted(0, 0, 1, 1); return QRegion(r); } + +void Zoomer::widgetMousePressEvent(QMouseEvent* mouseEvent) +{ + if (mouseEvent->modifiers() & Qt::ControlModifier) + { + is_panning = true; + pan_point = invTransform(mouseEvent->pos()); + } + else + { + ScrollZoomer::widgetMousePressEvent(mouseEvent); + } +} + +void Zoomer::widgetMouseMoveEvent(QMouseEvent* mouseEvent) +{ + if (is_panning) + { + auto cur_point = invTransform(mouseEvent->pos()); + auto delta = cur_point - pan_point; + moveBy(-delta.x(), -delta.y()); + pan_point = invTransform(mouseEvent->pos()); + } + else + { + ScrollZoomer::widgetMouseMoveEvent(mouseEvent); + } +} + +void Zoomer::widgetMouseReleaseEvent(QMouseEvent* mouseEvent) +{ + if (is_panning) + { + is_panning = false; + } + else + { + ScrollZoomer::widgetMouseReleaseEvent(mouseEvent); + } +} diff --git a/src/zoomer.h b/src/zoomer.h --- a/src/zoomer.h +++ b/src/zoomer.h @@ -41,6 +41,16 @@ protected: void drawRubberBand(QPainter* painter) const; /// Re-implemented for alpha background (masking is basically disabled) QRegion rubberBandMask() const; + /// Overloaded for panning + void widgetMousePressEvent(QMouseEvent* mouseEvent); + /// Overloaded for panning + void widgetMouseReleaseEvent(QMouseEvent* mouseEvent); + /// Overloaded for panning + void widgetMouseMoveEvent(QMouseEvent* mouseEvent); + +private: + bool is_panning; + QPointF pan_point; }; #endif // ZOOMER_H