QGIS API Documentation  3.0.2-Girona (307d082)
qgsmapmouseevent.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsmapmouseevent.cpp - mouse event in map coordinates and ability to snap
3  ----------------------
4  begin : October 2014
5  copyright : (C) Denis Rouzaud
6  email : [email protected]
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 
17 #include "qgsmapmouseevent.h"
18 #include "qgsmapcanvas.h"
19 
20 #include "qgssnappingutils.h"
21 #include "qgssnappingconfig.h"
22 
23 QgsMapMouseEvent::QgsMapMouseEvent( QgsMapCanvas *mapCanvas, QMouseEvent *event )
24  : QMouseEvent( event->type(), event->pos(), event->button(), event->buttons(), event->modifiers() )
25  , mHasCachedSnapResult( false )
26  , mOriginalMapPoint( mapCanvas ? mapCanvas->mapSettings().mapToPixel().toMapCoordinates( event->pos() ) : QgsPointXY() )
27  , mMapPoint( mOriginalMapPoint )
28  , mPixelPoint( event->pos() )
29  , mMapCanvas( mapCanvas )
30 {
31 }
32 
33 QgsMapMouseEvent::QgsMapMouseEvent( QgsMapCanvas *mapCanvas, QEvent::Type type, QPoint pos, Qt::MouseButton button, Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers )
34  : QMouseEvent( type, pos, button, buttons, modifiers )
35  , mHasCachedSnapResult( false )
36  , mOriginalMapPoint( mapCanvas ? mapCanvas->mapSettings().mapToPixel().toMapCoordinates( pos ) : QgsPointXY() )
37  , mMapPoint( mOriginalMapPoint )
38  , mPixelPoint( pos )
39  , mMapCanvas( mapCanvas )
40 {
41 }
42 
44 {
45  // Use cached result
46  if ( mHasCachedSnapResult )
47  return mMapPoint;
48 
49  mHasCachedSnapResult = true;
50 
51  QgsSnappingUtils *snappingUtils = mMapCanvas->snappingUtils();
52  mSnapMatch = snappingUtils->snapToMap( mMapPoint );
53 
54  if ( mSnapMatch.isValid() )
55  {
56  mMapPoint = mSnapMatch.point();
57  mPixelPoint = mapToPixelCoordinates( mMapPoint );
58  }
59  else
60  {
61  mMapPoint = mOriginalMapPoint;
62  mPixelPoint = pos();
63  }
64 
65  return mMapPoint;
66 }
67 
69 {
70  mMapPoint = point;
71  mPixelPoint = mapToPixelCoordinates( point );
72 }
73 
74 QPoint QgsMapMouseEvent::mapToPixelCoordinates( const QgsPointXY &point )
75 {
76  double x = point.x(), y = point.y();
77 
78  mMapCanvas->mapSettings().mapToPixel().transformInPlace( x, y );
79 
80  return QPoint( std::round( x ), std::round( y ) );
81 }
double y
Definition: qgspointxy.h:48
A class to represent a 2D point.
Definition: qgspointxy.h:43
QgsMapMouseEvent(QgsMapCanvas *mapCanvas, QMouseEvent *event)
Creates a new QgsMapMouseEvent.
void setMapPoint(const QgsPointXY &point)
Set the (snapped) point this event points to in map coordinates.
Map canvas is a class for displaying all GIS data types on a canvas.
Definition: qgsmapcanvas.h:74
void transformInPlace(double &x, double &y) const
Transform device coordinates to map coordinates.
const QgsMapToPixel & mapToPixel() const
double x
Definition: qgspointxy.h:47
const QgsMapSettings & mapSettings() const
Get access to properties used for map rendering.
QgsPointXY point() const
for vertex / edge match coords depending on what class returns it (geom.cache: layer coords...
This class has all the configuration of snapping and can return answers to snapping queries...
QgsPointLocator::Match snapToMap(QPoint point, QgsPointLocator::MatchFilter *filter=nullptr)
Snap to map according to the current configuration. Optional filter allows discarding unwanted matche...
QgsSnappingUtils * snappingUtils() const
Return snapping utility class that is associated with map canvas.
QgsPointXY snapPoint()
snapPoint will snap the points using the map canvas snapping utils configuration