QGIS API Documentation 3.99.0-Master (2fe06baccd8)
Loading...
Searching...
No Matches
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 "qgsguiutils.h"
19#include "qgsmapcanvas.h"
22#include "qgsvectorlayer.h"
23#include "qgsvertexmarker.h"
24
25#include <QToolTip>
26
28 : mCanvas( canvas )
29{
30 mSnappingMarker.setParentOwner( canvas );
31}
32
34
36{
37 mMatch = match;
38
39 if ( !mMatch.isValid() )
40 {
41 if ( mSnappingMarker )
42 {
43 mCanvas->scene()->removeItem( mSnappingMarker );
44 mSnappingMarker.reset(); // need to delete since QGraphicsSene::removeItem transfers back ownership
45 }
46 QToolTip::hideText();
47 }
48 else
49 {
50 if ( !mSnappingMarker )
51 {
52 mSnappingMarker.reset( new QgsVertexMarker( mCanvas ) );
53 mSnappingMarker->setIconSize( QgsGuiUtils::scaleIconSize( 10 ) );
54 mSnappingMarker->setPenWidth( QgsGuiUtils::scaleIconSize( 3 ) );
55 }
56
57 const QColor color = QgsSettingsRegistryCore::settingsDigitizingSnapColor->value();
58 mSnappingMarker->setColor( color );
59
60 int iconType;
61 if ( match.hasLineEndpoint() )
62 {
63 iconType = QgsVertexMarker::ICON_INVERTED_TRIANGLE; // line endpoint snap
64 }
65 else if ( match.hasVertex() )
66 {
67 if ( match.layer() )
68 iconType = QgsVertexMarker::ICON_BOX; // vertex snap
69 else
70 iconType = QgsVertexMarker::ICON_X; // intersection snap
71 }
72 else if ( match.hasMiddleSegment() )
73 {
74 iconType = QgsVertexMarker::ICON_TRIANGLE; // middle snap
75 }
76 else if ( match.hasCentroid() )
77 {
78 iconType = QgsVertexMarker::ICON_CIRCLE; // centroid snap
79 }
80 else if ( match.hasArea() )
81 {
82 iconType = QgsVertexMarker::ICON_RHOMBUS; // area snap
83 }
84 else // must be segment snap
85 {
87 }
88
89 mSnappingMarker->setIconType( iconType );
90
91 mSnappingMarker->setCenter( match.point() );
92
93 // tooltip
95 {
96 const QPoint ptCanvas = mSnappingMarker->toCanvasCoordinates( match.point() ).toPoint();
97 const QPoint ptGlobal = mCanvas->mapToGlobal( ptCanvas );
98 const QRect rect( ptCanvas.x(), ptCanvas.y(), 1, 1 ); // area where is the tooltip valid
99 const QString layerName = match.layer() ? match.layer()->name() : QString();
100 QToolTip::showText( ptGlobal, layerName, mCanvas, rect );
101 }
102 }
103}
104
106{
107 if ( mSnappingMarker )
108 mSnappingMarker->setVisible( visible );
109}
110
112{
113 if ( mSnappingMarker )
114 return mSnappingMarker->isVisible();
115
116 return false;
117}
Map canvas is a class for displaying all GIS data types on a canvas.
static const QgsSettingsEntryBool * settingsDigitizingSnapTooltip
Settings entry digitizing snap tooltip.
static const QgsSettingsEntryColor * settingsDigitizingSnapColor
Settings entry digitizing snap color.
QgsPointLocator::Match match() const
Returns currently displayed snapping match.
void setVisible(bool visible=true)
Sets whether the snapping indicator is visible.
void setMatch(const QgsPointLocator::Match &match)
Sets snapping match that should be displayed in map canvas. Invalid match hides the indicator.
QgsSnapIndicator(QgsMapCanvas *canvas)
Constructs an indicator for the given map canvas.
bool isVisible() const
Returns whether the snapping indicator is visible.
A map canvas item for marking vertices of features using e.g.
@ ICON_TRIANGLE
Added in QGIS 3.12.
@ ICON_DOUBLE_TRIANGLE
Added in QGIS 3.0.
@ ICON_INVERTED_TRIANGLE
Added in QGIS 3.20.
@ ICON_RHOMBUS
Added in QGIS 3.12.
int scaleIconSize(int standardSize)
Scales an icon size to compensate for display pixel density, making the icon size hi-dpi friendly,...