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