QGIS API Documentation  3.26.3-Buenos Aires (65e4edfdad)
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() );
103  da.setSourceCrs( mCanvas->mapSettings().destinationCrs(), QgsProject::instance()->transformContext() );
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 }
QgsMapToolPan::gestureEvent
bool gestureEvent(QGestureEvent *e) override
gesture event for overriding. Default implementation does nothing.
Definition: qgsmaptoolpan.cpp:125
qgsmapcanvas.h
qgsmaptopixel.h
QgsMapToolPan::deactivate
void deactivate() override
called when map tool is being deactivated
Definition: qgsmaptoolpan.cpp:46
QgsMapCanvas
Map canvas is a class for displaying all GIS data types on a canvas.
Definition: qgsmapcanvas.h:89
QgsMapTool::deactivate
virtual void deactivate()
called when map tool is being deactivated
Definition: qgsmaptool.cpp:110
QgsProject::transformContext
QgsCoordinateTransformContext transformContext
Definition: qgsproject.h:110
QgsProject::instance
static QgsProject * instance()
Returns the QgsProject singleton instance.
Definition: qgsproject.cpp:480
QgsMapToolPan::flags
Flags flags() const override
Returns the flags for the map tool.
Definition: qgsmaptoolpan.cpp:52
QgsMapTool::Transient
@ Transient
Definition: qgsmaptool.h:110
QgsMapToolPan::canvasMoveEvent
void canvasMoveEvent(QgsMapMouseEvent *e) override
Mouse move event for overriding. Default implementation does nothing.
Definition: qgsmaptoolpan.cpp:67
QgsMapToolPan::canvasReleaseEvent
void canvasReleaseEvent(QgsMapMouseEvent *e) override
Mouse release event for overriding. Default implementation does nothing.
Definition: qgsmaptoolpan.cpp:80
QgsMapTool::mCanvas
QPointer< QgsMapCanvas > mCanvas
The pointer to the map canvas.
Definition: qgsmaptool.h:336
QgsRectangle
A rectangle specified with double values.
Definition: qgsrectangle.h:41
QgsMapTool
Abstract base class for all map tools. Map tools are user interactive tools for manipulating the map ...
Definition: qgsmaptool.h:70
QgsRectangle::scale
void scale(double scaleFactor, const QgsPointXY *c=nullptr)
Scale the rectangle around its center point.
Definition: qgsrectangle.h:256
QgsDistanceArea::setEllipsoid
bool setEllipsoid(const QString &ellipsoid)
Sets the ellipsoid by its acronym.
Definition: qgsdistancearea.cpp:89
qgsmaptoolpan.h
QgsCsException
Custom exception class for Coordinate Reference System related exceptions.
Definition: qgsexception.h:65
QgsDistanceArea::measureLine
double measureLine(const QVector< QgsPointXY > &points) const
Measures the length of a line with multiple segments.
Definition: qgsdistancearea.cpp:298
QgsDistanceArea::lengthUnits
QgsUnitTypes::DistanceUnit lengthUnits() const
Returns the units of distance for length calculations made by this object.
Definition: qgsdistancearea.cpp:790
QgsDistanceArea::setSourceCrs
void setSourceCrs(const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &context)
Sets source spatial reference system crs.
Definition: qgsdistancearea.cpp:83
QgsMapTool::activate
virtual void activate()
called when set as currently active map tool
Definition: qgsmaptool.cpp:94
QgsPointXY
A class to represent a 2D point.
Definition: qgspointxy.h:58
QgsMapTool::mCursor
QCursor mCursor
The cursor used in the map tool.
Definition: qgsmaptool.h:339
QgsMapToolPan::panDistanceBearingChanged
void panDistanceBearingChanged(double distance, QgsUnitTypes::DistanceUnit unit, double bearing)
Emitted whenever the distance or bearing of an in-progress panning operation is changed.
QgsMapToolPan::canvasPressEvent
void canvasPressEvent(QgsMapMouseEvent *e) override
Mouse press event for overriding. Default implementation does nothing.
Definition: qgsmaptoolpan.cpp:57
QgsMapMouseEvent
A QgsMapMouseEvent is the result of a user interaction with the mouse on a QgsMapCanvas....
Definition: qgsmapmouseevent.h:35
QgsMapToolPan::~QgsMapToolPan
~QgsMapToolPan() override
Definition: qgsmaptoolpan.cpp:35
QgsDistanceArea
A general purpose distance and area calculator, capable of performing ellipsoid based calculations.
Definition: qgsdistancearea.h:52
QgsMapTool::AllowZoomRect
@ AllowZoomRect
Allow zooming by rectangle (by holding shift and dragging) while the tool is active.
Definition: qgsmaptool.h:114
qgslogger.h
qgsmapmouseevent.h
QgsMapToolPan::activate
void activate() override
called when set as currently active map tool
Definition: qgsmaptoolpan.cpp:40
QgsMapToolPan::canvasDoubleClickEvent
void canvasDoubleClickEvent(QgsMapMouseEvent *e) override
Mouse double-click event for overriding. Default implementation does nothing.
Definition: qgsmaptoolpan.cpp:117
QgsMapTool::ShowContextMenu
@ ShowContextMenu
Show a context menu when right-clicking with the tool (since QGIS 3.14). See populateContextMenu().
Definition: qgsmaptool.h:115
qgsproject.h
QgsDistanceArea::bearing
double bearing(const QgsPointXY &p1, const QgsPointXY &p2) const SIP_THROW(QgsCsException)
Computes the bearing (in radians) between two points.
Definition: qgsdistancearea.cpp:843
QgsMapCanvasInteractionBlocker::Interaction::MapPanOnSingleClick
@ MapPanOnSingleClick
A map pan interaction caused by a single click and release on the map canvas.
QgsMapTool::mToolName
QString mToolName
The translated name of the map tool.
Definition: qgsmaptool.h:354
QgsMapToolPan::QgsMapToolPan
QgsMapToolPan(QgsMapCanvas *canvas)
constructor
Definition: qgsmaptoolpan.cpp:26