QGIS API Documentation  3.2.0-Bonn (bc43194)
qgssnapindicator.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgssnapindicator.cpp
3  --------------------------------------
4  Date : October 2017
5  Copyright : (C) 2017 by Martin Dobias
6  Email : wonder dot 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 "qgssnapindicator.h"
17 
18 #include "qgsmapcanvas.h"
19 #include "qgssettings.h"
20 #include "qgsvectorlayer.h"
21 #include "qgsvertexmarker.h"
22 
23 #include <QToolTip>
24 
25 
27  : mCanvas( canvas )
28 {
29 }
30 
32 
33 
35 {
36  mMatch = match;
37 
38  if ( !mMatch.isValid() )
39  {
40  mSnappingMarker.reset();
41  QToolTip::hideText();
42  }
43  else
44  {
45  if ( !mSnappingMarker )
46  {
47  mSnappingMarker.reset( new QgsVertexMarker( mCanvas ) );
48  mSnappingMarker->setPenWidth( 3 );
49  }
50 
51  QgsSettings s;
52 
53  QColor color = s.value( QStringLiteral( "/qgis/digitizing/snap_color" ), QColor( Qt::magenta ) ).value<QColor>();
54  mSnappingMarker->setColor( color );
55 
56  int iconType;
57  if ( match.hasVertex() )
58  {
59  if ( match.layer() )
60  iconType = QgsVertexMarker::ICON_BOX; // vertex snap
61  else
62  iconType = QgsVertexMarker::ICON_X; // intersection snap
63  }
64  else // must be segment snap
65  {
67  }
68  mSnappingMarker->setIconType( iconType );
69 
70  mSnappingMarker->setCenter( match.point() );
71 
72  // tooltip
73  if ( s.value( QStringLiteral( "/qgis/digitizing/snap_tooltip" ), false ).toBool() )
74  {
75  QPoint ptCanvas = mSnappingMarker->toCanvasCoordinates( match.point() ).toPoint();
76  QPoint ptGlobal = mCanvas->mapToGlobal( ptCanvas );
77  QRect rect( ptCanvas.x(), ptCanvas.y(), 1, 1 ); // area where is the tooltip valid
78  QString layerName = match.layer() ? match.layer()->name() : QString();
79  QToolTip::showText( ptGlobal, layerName, mCanvas, rect );
80  }
81  }
82 }
83 
84 void QgsSnapIndicator::setVisible( bool visible )
85 {
86  mSnappingMarker->setVisible( visible );
87 }
88 
90 {
91  return mSnappingMarker->isVisible();
92 }
void setMatch(const QgsPointLocator::Match &match)
Sets snapping match that should be displayed in map canvas. Invalid match hides the indicator...
QgsVectorLayer * layer() const
The vector layer where the snap occurred.
This class is a composition of two QSettings instances:
Definition: qgssettings.h:58
QgsPointLocator::Match match() const
Returns currently displayed snapping match.
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
Map canvas is a class for displaying all GIS data types on a canvas.
Definition: qgsmapcanvas.h:74
A class for marking vertices of features using e.g.
QgsPointXY point() const
for vertex / edge match coords depending on what class returns it (geom.cache: layer coords...
bool isVisible() const
Returns whether the snapping indicator is visible.
QString name
Definition: qgsmaplayer.h:65
void setVisible(bool visible=true)
Sets whether the snapping indicator is visible.
QgsSnapIndicator(QgsMapCanvas *canvas)
Constructs an indicator for the given map canvas.