1 /***************************************************************************
2   qgsappmaptools.cpp
3   --------------------------------------
4   Date                 : March 2021
5   Copyright            : (C) 2021 by Nyall Dawson
6   Email                : nyall dot dawson 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 "qgsappmaptools.h"
17 #include "qgisapp.h"
18 #include "qgsmaptool.h"
19 #include "qgsmaptoolselect.h"
20 #include "qgsmaptoolidentifyaction.h"
21 #include "qgsmaptooladdfeature.h"
22 #include "qgsmaptoolzoom.h"
23 #include "qgsmaptoolpan.h"
24 #include "qgsmaptoolfeatureaction.h"
25 #include "qgsmeasuretool.h"
26 #include "qgsmaptooltextannotation.h"
27 #include "qgsmaptoolhtmlannotation.h"
28 #include "qgsmaptoolannotation.h"
29 #include "qgsmaptoolcircle2points.h"
30 #include "qgsmaptoolcircle3points.h"
31 #include "qgsmaptoolcircle2tangentspoint.h"
32 #include "qgsmaptoolmeasureangle.h"
33 #include "qgsmaptoolmeasurebearing.h"
34 #include "qgsmaptoolformannotation.h"
35 #include "qgsmaptoolsvgannotation.h"
36 #include "qgsmaptoolcircularstringcurvepoint.h"
37 #include "qgsmaptoolcircularstringradius.h"
38 #include "qgsmaptoolcircle3tangents.h"
39 #include "qgsmaptoolcirclecenterpoint.h"
40 #include "qgsmaptoolellipsecenter2points.h"
41 #include "qgsmaptoolellipsecenterpoint.h"
42 #include "qgsmaptoolellipseextent.h"
43 #include "qgsmaptoolellipsefoci.h"
44 #include "qgsmaptoolrectangle3points.h"
45 #include "qgsmaptoolrectanglecenter.h"
46 #include "qgsmaptoolrectangleextent.h"
47 #include "qgsmaptoolregularpolygon2points.h"
48 #include "qgsmaptoolregularpolygoncentercorner.h"
49 #include "qgsmaptoolregularpolygoncenterpoint.h"
50 #include "qgsmaptoolrotatefeature.h"
51 #include "qgsmaptoolscalefeature.h"
52 #include "qgsmaptoolmovefeature.h"
53 #include "qgsmaptooloffsetcurve.h"
54 #include "qgsmaptoolreshape.h"
55 #include "qgsmaptoolsplitfeatures.h"
56 #include "qgsmaptoolsplitparts.h"
57 #include "qgsmaptoolreverseline.h"
58 #include "qgsmaptooladdring.h"
59 #include "qgsmaptoolfillring.h"
60 #include "qgsmaptoolsimplify.h"
61 #include "qgsmaptooldeletepart.h"
62 #include "qgsmaptooldeletering.h"
63 #include "qgsmaptooladdpart.h"
64 #include "vertextool/qgsvertextool.h"
65 #include "qgsmaptoolrotatepointsymbols.h"
66 #include "qgsmaptoolrotatelabel.h"
67 #include "qgsmaptooltrimextendfeature.h"
68 #include "qgsmaptoolshowhidelabels.h"
69 #include "qgsmaptoolmovelabel.h"
70 #include "qgsmaptoolchangelabelproperties.h"
71 #include "qgsmaptoolpinlabels.h"
72 #include "qgsmaptooloffsetpointsymbol.h"
73 #include "qgsmaptooleditmeshframe.h"
74 #include "qgsspinbox.h"
75 #include "qgssettingsregistrycore.h"
76 #include "qgsmaptoolmodifyannotation.h"
77 
78 //
79 // QgsStreamDigitizingSettingsAction
80 //
81 
QgsStreamDigitizingSettingsAction(QWidget * parent)82 QgsStreamDigitizingSettingsAction::QgsStreamDigitizingSettingsAction( QWidget *parent )
83   : QWidgetAction( parent )
84 {
85   QGridLayout *gLayout = new QGridLayout();
86   gLayout->setContentsMargins( 3, 2, 3, 2 );
87 
88   mStreamToleranceSpinBox = new QgsSpinBox();
89   mStreamToleranceSpinBox->setSuffix( tr( "px" ) );
90   mStreamToleranceSpinBox->setKeyboardTracking( false );
91   mStreamToleranceSpinBox->setRange( 1, 200 );
92   mStreamToleranceSpinBox->setWrapping( false );
93   mStreamToleranceSpinBox->setSingleStep( 1 );
94   mStreamToleranceSpinBox->setClearValue( 2 );
95   mStreamToleranceSpinBox->setValue( QgsSettingsRegistryCore::settingsDigitizingStreamTolerance.value() );
96 
97   QLabel *label = new QLabel( tr( "Streaming Tolerance" ) );
98   gLayout->addWidget( label, 1, 0 );
99   gLayout->addWidget( mStreamToleranceSpinBox, 1, 1 );
100   connect( mStreamToleranceSpinBox, qOverload<int>( &QgsSpinBox::valueChanged ), this, [ = ]( int value )
101   {
102     QgsSettingsRegistryCore::settingsDigitizingStreamTolerance.setValue( value );
103   } );
104 
105   QWidget *w = new QWidget( parent );
106   w->setLayout( gLayout );
107   setDefaultWidget( w );
108 }
109 
110 QgsStreamDigitizingSettingsAction::~QgsStreamDigitizingSettingsAction() = default;
111 
112 
113 //
114 // QgsAppMapTools
115 //
116 
QgsAppMapTools(QgsMapCanvas * canvas,QgsAdvancedDigitizingDockWidget * cadDock)117 QgsAppMapTools::QgsAppMapTools( QgsMapCanvas *canvas, QgsAdvancedDigitizingDockWidget *cadDock )
118 {
119   mTools.insert( Tool::ZoomIn, new QgsMapToolZoom( canvas, false /* zoomIn */ ) );
120   mTools.insert( Tool::ZoomOut, new QgsMapToolZoom( canvas, true /* zoomOut */ ) );
121   mTools.insert( Tool::Pan, new QgsMapToolPan( canvas ) );
122   mTools.insert( Tool::Identify, new QgsMapToolIdentifyAction( canvas ) );
123   mTools.insert( Tool::FeatureAction, new QgsMapToolFeatureAction( canvas ) );
124   mTools.insert( Tool::MeasureDistance, new QgsMeasureTool( canvas, false /* area */ ) );
125   mTools.insert( Tool::MeasureArea, new QgsMeasureTool( canvas, true /* area */ ) );
126   mTools.insert( Tool::MeasureAngle, new QgsMapToolMeasureAngle( canvas ) );
127   mTools.insert( Tool::MeasureBearing, new QgsMapToolMeasureBearing( canvas ) );
128   mTools.insert( Tool::TextAnnotation, new QgsMapToolTextAnnotation( canvas ) );
129   mTools.insert( Tool::FormAnnotation, new QgsMapToolFormAnnotation( canvas ) );
130   mTools.insert( Tool::HtmlAnnotation, new QgsMapToolHtmlAnnotation( canvas ) );
131   mTools.insert( Tool::SvgAnnotation, new QgsMapToolSvgAnnotation( canvas ) );
132   mTools.insert( Tool::Annotation, new QgsMapToolAnnotation( canvas ) );
133   mTools.insert( Tool::AddFeature, new QgsMapToolAddFeature( canvas, QgsMapToolCapture::CaptureNone ) );
134   QgsMapToolCapture *addFeatureTool = qobject_cast< QgsMapToolCapture *>( mTools.value( Tool::AddFeature ) );
135   mTools.insert( Tool::CircularStringCurvePoint, new QgsMapToolCircularStringCurvePoint( addFeatureTool, canvas ) );
136   mTools.insert( Tool::CircularStringRadius, new QgsMapToolCircularStringRadius( addFeatureTool, canvas ) );
137   mTools.insert( Tool::Circle2Points, new QgsMapToolCircle2Points( addFeatureTool, canvas ) );
138   mTools.insert( Tool::Circle3Points, new QgsMapToolCircle3Points( addFeatureTool, canvas ) );
139   mTools.insert( Tool::Circle3Tangents, new QgsMapToolCircle3Tangents( addFeatureTool, canvas ) );
140   mTools.insert( Tool::Circle2TangentsPoint, new QgsMapToolCircle2TangentsPoint( addFeatureTool, canvas ) );
141   mTools.insert( Tool::CircleCenterPoint, new QgsMapToolCircleCenterPoint( addFeatureTool, canvas ) );
142   mTools.insert( Tool::EllipseCenter2Points, new QgsMapToolEllipseCenter2Points( addFeatureTool, canvas ) );
143   mTools.insert( Tool::EllipseCenterPoint, new QgsMapToolEllipseCenterPoint( addFeatureTool, canvas ) );
144   mTools.insert( Tool::EllipseExtent, new QgsMapToolEllipseExtent( addFeatureTool, canvas ) );
145   mTools.insert( Tool::EllipseFoci, new QgsMapToolEllipseFoci( addFeatureTool, canvas ) );
146   mTools.insert( Tool::RectangleCenterPoint, new QgsMapToolRectangleCenter( addFeatureTool, canvas ) );
147   mTools.insert( Tool::RectangleExtent, new QgsMapToolRectangleExtent( addFeatureTool, canvas ) );
148   mTools.insert( Tool::Rectangle3PointsDistance, new QgsMapToolRectangle3Points( addFeatureTool, canvas, QgsMapToolRectangle3Points::DistanceMode ) );
149   mTools.insert( Tool::Rectangle3PointsProjected, new QgsMapToolRectangle3Points( addFeatureTool, canvas, QgsMapToolRectangle3Points::ProjectedMode ) );
150   mTools.insert( Tool::RegularPolygon2Points, new QgsMapToolRegularPolygon2Points( addFeatureTool, canvas ) );
151   mTools.insert( Tool::RegularPolygonCenterPoint, new QgsMapToolRegularPolygonCenterPoint( addFeatureTool, canvas ) );
152   mTools.insert( Tool::RegularPolygonCenterCorner, new QgsMapToolRegularPolygonCenterCorner( addFeatureTool, canvas ) );
153   mTools.insert( Tool::MoveFeature, new QgsMapToolMoveFeature( canvas, QgsMapToolMoveFeature::Move ) );
154   mTools.insert( Tool::MoveFeatureCopy, new QgsMapToolMoveFeature( canvas, QgsMapToolMoveFeature::CopyMove ) );
155   mTools.insert( Tool::RotateFeature, new QgsMapToolRotateFeature( canvas ) );
156   mTools.insert( Tool::ScaleFeature, new QgsMapToolScaleFeature( canvas ) );
157   mTools.insert( Tool::OffsetCurve, new QgsMapToolOffsetCurve( canvas ) );
158   mTools.insert( Tool::ReshapeFeatures, new QgsMapToolReshape( canvas ) );
159   mTools.insert( Tool::ReverseLine, new QgsMapToolReverseLine( canvas ) );
160   mTools.insert( Tool::SplitFeatures, new QgsMapToolSplitFeatures( canvas ) );
161   mTools.insert( Tool::SplitParts, new QgsMapToolSplitParts( canvas ) );
162   mTools.insert( Tool::SelectFeatures, new QgsMapToolSelect( canvas ) );
163   mTools.insert( Tool::SelectPolygon, new QgsMapToolSelect( canvas ) );
164   mTools.insert( Tool::SelectFreehand, new QgsMapToolSelect( canvas ) );
165   mTools.insert( Tool::SelectRadius, new QgsMapToolSelect( canvas ) );
166   mTools.insert( Tool::AddRing, new QgsMapToolAddRing( canvas ) );
167   mTools.insert( Tool::FillRing, new QgsMapToolFillRing( canvas ) );
168   mTools.insert( Tool::AddPart, new QgsMapToolAddPart( canvas ) );
169   mTools.insert( Tool::SimplifyFeature, new QgsMapToolSimplify( canvas ) );
170   mTools.insert( Tool::DeleteRing, new QgsMapToolDeleteRing( canvas ) );
171   mTools.insert( Tool::DeletePart, new QgsMapToolDeletePart( canvas ) );
172   mTools.insert( Tool::VertexTool, new QgsVertexTool( canvas, cadDock ) );
173   mTools.insert( Tool::VertexToolActiveLayer, new QgsVertexTool( canvas, cadDock, QgsVertexTool::ActiveLayer ) );
174   mTools.insert( Tool::RotatePointSymbolsTool, new QgsMapToolRotatePointSymbols( canvas ) );
175   mTools.insert( Tool::OffsetPointSymbolTool, new QgsMapToolOffsetPointSymbol( canvas ) );
176   mTools.insert( Tool::TrimExtendFeature, new QgsMapToolTrimExtendFeature( canvas ) );
177   mTools.insert( Tool::PinLabels, new QgsMapToolPinLabels( canvas, cadDock ) );
178   mTools.insert( Tool::ShowHideLabels, new QgsMapToolShowHideLabels( canvas, cadDock ) );
179   mTools.insert( Tool::MoveLabel, new QgsMapToolMoveLabel( canvas, cadDock ) );
180   mTools.insert( Tool::RotateLabel, new QgsMapToolRotateLabel( canvas, cadDock ) );
181   mTools.insert( Tool::ChangeLabelProperties, new QgsMapToolChangeLabelProperties( canvas, cadDock ) );
182   mTools.insert( Tool::EditMeshFrame, new QgsMapToolEditMeshFrame( canvas ) );
183   mTools.insert( Tool::AnnotationEdit, new QgsMapToolModifyAnnotation( canvas, cadDock ) );
184 
185   mStreamDigitizingSettingsAction = new QgsStreamDigitizingSettingsAction( QgisApp::instance() );
186 }
187 
~QgsAppMapTools()188 QgsAppMapTools::~QgsAppMapTools()
189 {
190   for ( auto it = mTools.constBegin(); it != mTools.constEnd(); ++it )
191   {
192     delete it.value();
193   }
194 }
195 
mapTool(QgsAppMapTools::Tool tool)196 QgsMapTool *QgsAppMapTools::mapTool( QgsAppMapTools::Tool tool )
197 {
198   return mTools.value( tool );
199 }
200 
201 
captureTools() const202 QList<QgsMapToolCapture *> QgsAppMapTools::captureTools() const
203 {
204   QList< QgsMapToolCapture * > res;
205   for ( auto it = mTools.constBegin(); it != mTools.constEnd(); ++it )
206   {
207     if ( QgsMapToolCapture *captureTool = qobject_cast< QgsMapToolCapture * >( it.value() ) )
208       res << captureTool;
209   }
210   return res;
211 }
212 
streamDigitizingSettingsAction()213 QWidgetAction *QgsAppMapTools::streamDigitizingSettingsAction()
214 {
215   return mStreamDigitizingSettingsAction;
216 }
217 
218