QGIS API Documentation  3.22.4-Białowieża (ce8e65e95e)
qgsmaptoolpan.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsmaptoolpan.h - map tool for panning in map canvas
3  ---------------------
4  begin : January 2006
5  copyright : (C) 2006 by Martin Dobias
6  email : wonder.sk at gmail dot com
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 
16 #include <QBitmap>
17 #include <QCursor>
18 #include "qgsmaptoolpan.h"
19 #include "qgsmapcanvas.h"
20 #include "qgsmaptopixel.h"
21 #include "qgsmapmouseevent.h"
22 #include "qgsproject.h"
23 #include "qgslogger.h"
24 
25 
27  : QgsMapTool( canvas )
28  , mDragging( false )
29 {
30  mToolName = tr( "Pan" );
31  // set cursor
32  mCursor = QCursor( Qt::OpenHandCursor );
33 }
34 
36 {
37  mCanvas->ungrabGesture( Qt::PinchGesture );
38 }
39 
41 {
42  mCanvas->grabGesture( Qt::PinchGesture );
44 }
45 
47 {
48  mCanvas->ungrabGesture( Qt::PinchGesture );
50 }
51 
52 QgsMapTool::Flags QgsMapToolPan::flags() const
53 {
55 }
56 
58 {
59  if ( e->button() == Qt::LeftButton )
60  {
61  mCanvas->setCursor( QCursor( Qt::ClosedHandCursor ) );
62  mCanvas->panActionStart( e->pos() );
63  }
64 }
65 
66 
68 {
69  if ( !mPinching )
70  {
71  if ( ( e->buttons() & Qt::LeftButton ) )
72  {
73  mDragging = true;
74  // move map and other canvas items
75  mCanvas->panAction( e );
76  }
77  }
78 }
79 
81 {
82  if ( !mPinching )
83  {
84  if ( e->button() == Qt::LeftButton )
85  {
86  if ( mDragging )
87  {
88  mCanvas->panActionEnd( e->pos() );
89  mDragging = false;
90  }
91  else // add pan to mouse cursor
92  {
94  {
95  // transform the mouse pos to map coordinates
96  const QgsPointXY prevCenter = mCanvas->center();
97  const QgsPointXY center = mCanvas->getCoordinateTransform()->toMapCoordinates( e->x(), e->y() );
98  mCanvas->setCenter( center );
99  mCanvas->refresh();
100 
101  QgsDistanceArea da;
102  da.setEllipsoid( QgsProject::instance()->ellipsoid() );
104  try
105  {
106  emit panDistanceBearingChanged( da.measureLine( center, prevCenter ), da.lengthUnits(), da.bearing( center, prevCenter ) * 180 / M_PI );
107  }
108  catch ( QgsCsException & )
109  {}
110  }
111  }
112  }
113  }
114  mCanvas->setCursor( mCursor );
115 }
116 
118 {
119  if ( !QTouchDevice::devices().isEmpty() && !mPinching )
120  {
121  mCanvas->zoomWithCenter( e->x(), e->y(), true );
122  }
123 }
124 
125 bool QgsMapToolPan::gestureEvent( QGestureEvent *event )
126 {
127  if ( QTouchDevice::devices().isEmpty() )
128  return true; // no touch support
129 
130  if ( QGesture *gesture = event->gesture( Qt::PinchGesture ) )
131  {
132  mPinching = true;
133  pinchTriggered( static_cast<QPinchGesture *>( gesture ) );
134  }
135  return true;
136 }
137 
138 void QgsMapToolPan::pinchTriggered( QPinchGesture *gesture )
139 {
140  if ( gesture->state() == Qt::GestureFinished )
141  {
142  //a very small totalScaleFactor indicates a two finger tap (pinch gesture without pinching)
143  if ( 0.98 < gesture->totalScaleFactor() && gesture->totalScaleFactor() < 1.02 )
144  {
145  mCanvas->zoomOut();
146  }
147  else
148  {
149  //Transfor global coordinates to widget coordinates
150  QPoint pos = gesture->centerPoint().toPoint();
151  pos = mCanvas->mapFromGlobal( pos );
152  // transform the mouse pos to map coordinates
153  const QgsPointXY center = mCanvas->getCoordinateTransform()->toMapCoordinates( pos.x(), pos.y() );
154  QgsRectangle r = mCanvas->extent();
155  r.scale( 1 / gesture->totalScaleFactor(), &center );
156  mCanvas->setExtent( r );
157  mCanvas->refresh();
158  }
159  mPinching = false;
160  }
161 }
Custom exception class for Coordinate Reference System related exceptions.
Definition: qgsexception.h:66
A general purpose distance and area calculator, capable of performing ellipsoid based calculations.
double bearing(const QgsPointXY &p1, const QgsPointXY &p2) const SIP_THROW(QgsCsException)
Computes the bearing (in radians) between two points.
double measureLine(const QVector< QgsPointXY > &points) const
Measures the length of a line with multiple segments.
void setSourceCrs(const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &context)
Sets source spatial reference system crs.
bool setEllipsoid(const QString &ellipsoid)
Sets the ellipsoid by its acronym.
QgsUnitTypes::DistanceUnit lengthUnits() const
Returns the units of distance for length calculations made by this object.
@ MapPanOnSingleClick
A map pan interaction caused by a single click and release on the map canvas.
Map canvas is a class for displaying all GIS data types on a canvas.
Definition: qgsmapcanvas.h:89
void setExtent(const QgsRectangle &r, bool magnified=false)
Sets the extent of the map canvas to the specified rectangle.
QgsPointXY center() const
Gets map center, in geographical coordinates.
void zoomWithCenter(int x, int y, bool zoomIn)
Zooms in/out with a given center.
void panAction(QMouseEvent *event)
Called when mouse is moving and pan is activated.
void zoomOut()
Zoom out with fixed factor.
void panActionEnd(QPoint releasePoint)
Ends pan action and redraws the canvas.
void panActionStart(QPoint releasePoint)
Starts a pan action.
void setCenter(const QgsPointXY &center)
Set the center of the map canvas, in geographical coordinates.
bool allowInteraction(QgsMapCanvasInteractionBlocker::Interaction interaction) const
Returns true if the specified interaction is currently permitted on the canvas.
const QgsMapToPixel * getCoordinateTransform()
Gets the current coordinate transform.
const QgsMapSettings & mapSettings() const
Gets access to properties used for map rendering.
QgsRectangle extent() const
Returns the current zoom extent of the map canvas.
void refresh()
Repaints the canvas map.
A QgsMapMouseEvent is the result of a user interaction with the mouse on a QgsMapCanvas.
QgsCoordinateReferenceSystem destinationCrs() const
Returns the destination coordinate reference system for the map render.
QgsPointXY toMapCoordinates(int x, int y) const
Transforms device coordinates to map (world) coordinates.
~QgsMapToolPan() override
void canvasPressEvent(QgsMapMouseEvent *e) override
Mouse press event for overriding. Default implementation does nothing.
void deactivate() override
called when map tool is being deactivated
QgsMapToolPan(QgsMapCanvas *canvas)
constructor
void canvasDoubleClickEvent(QgsMapMouseEvent *e) override
Mouse double-click event for overriding. Default implementation does nothing.
void canvasMoveEvent(QgsMapMouseEvent *e) override
Mouse move event for overriding. Default implementation does nothing.
void canvasReleaseEvent(QgsMapMouseEvent *e) override
Mouse release event for overriding. Default implementation does nothing.
void panDistanceBearingChanged(double distance, QgsUnitTypes::DistanceUnit unit, double bearing)
Emitted whenever the distance or bearing of an in-progress panning operation is changed.
bool gestureEvent(QGestureEvent *e) override
gesture event for overriding. Default implementation does nothing.
void activate() override
called when set as currently active map tool
Flags flags() const override
Returns the flags for the map tool.
Abstract base class for all map tools.
Definition: qgsmaptool.h:71
QgsMapCanvas * mCanvas
The pointer to the map canvas.
Definition: qgsmaptool.h:336
QString mToolName
The translated name of the map tool.
Definition: qgsmaptool.h:354
@ AllowZoomRect
Allow zooming by rectangle (by holding shift and dragging) while the tool is active.
Definition: qgsmaptool.h:114
@ ShowContextMenu
Show a context menu when right-clicking with the tool (since QGIS 3.14). See populateContextMenu().
Definition: qgsmaptool.h:115
virtual void activate()
called when set as currently active map tool
Definition: qgsmaptool.cpp:94
QCursor mCursor
The cursor used in the map tool.
Definition: qgsmaptool.h:339
virtual void deactivate()
called when map tool is being deactivated
Definition: qgsmaptool.cpp:110
A class to represent a 2D point.
Definition: qgspointxy.h:59
static QgsProject * instance()
Returns the QgsProject singleton instance.
Definition: qgsproject.cpp:467
QgsCoordinateTransformContext transformContext
Definition: qgsproject.h:107
A rectangle specified with double values.
Definition: qgsrectangle.h:42
void scale(double scaleFactor, const QgsPointXY *c=nullptr)
Scale the rectangle around its center point.
Definition: qgsrectangle.h:256