Skip to content

Commit 649b1eb

Browse files
committed
Better backwards compatibility for old snapping code
1 parent 19a98b2 commit 649b1eb

File tree

1 file changed

+83
-73
lines changed

1 file changed

+83
-73
lines changed

src/gui/qgsmapcanvassnapper.cpp

Lines changed: 83 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -150,13 +150,61 @@ int QgsMapCanvasSnapper::snapToBackgroundLayers( const QgsPoint& point, QList<Qg
150150
mSnapper->setSnapMode( QgsSnapper::SnapWithResultsWithinTolerances );
151151
}
152152

153+
QgsVectorLayer* currentVectorLayer = dynamic_cast<QgsVectorLayer*>( mMapCanvas->currentLayer() );
154+
if ( !currentVectorLayer )
155+
{
156+
return 1;
157+
}
158+
153159
//read snapping settings from project
154-
bool snappingDefinedInProject, ok;
155-
QStringList layerIdList = QgsProject::instance()->readListEntry( "Digitizing", "/LayerSnappingList", QStringList(), &snappingDefinedInProject );
156-
QStringList enabledList = QgsProject::instance()->readListEntry( "Digitizing", "/LayerSnappingEnabledList", QStringList(), &ok );
157-
QStringList toleranceList = QgsProject::instance()->readListEntry( "Digitizing", "/LayerSnappingToleranceList", QStringList(), &ok );
158-
QStringList toleranceUnitList = QgsProject::instance()->readListEntry( "Digitizing", "/LayerSnappingToleranceUnitList", QStringList(), &ok );
159-
QStringList snapToList = QgsProject::instance()->readListEntry( "Digitizing", "/LayerSnapToList", QStringList(), &ok );
160+
QStringList layerIdList, enabledList, toleranceList, toleranceUnitList, snapToList;
161+
162+
bool ok, snappingDefinedInProject;
163+
164+
QSettings settings;
165+
QString snappingMode = QgsProject::instance()->readEntry( "Digitizing", "/SnappingMode", "current_layer", &snappingDefinedInProject );
166+
QString defaultSnapToleranceUnit = snappingDefinedInProject ? QgsProject::instance()->readEntry( "Digitizing", "/DefaultSnapToleranceUnit" ) : settings.value( "/qgis/digitizing/default_snapping_tolerance_unit", "0" ).toString();
167+
QString defaultSnapType = snappingDefinedInProject ? QgsProject::instance()->readEntry( "Digitizing", "/DefaultSnapType" ) : settings.value( "/qgis/digitizing/default_snap_mode", "off" ).toString();
168+
QString defaultSnapTolerance = snappingDefinedInProject ? QString::number( QgsProject::instance()->readDoubleEntry( "Digitizing", "/DefaultSnapTolerance" ) ) : settings.value( "/qgis/digitizing/default_snapping_tolerance", "0" ).toString();
169+
170+
if ( !snappingDefinedInProject && defaultSnapType == "off" )
171+
{
172+
return 0;
173+
}
174+
175+
if ( snappingMode == "current_layer" || !snappingDefinedInProject )
176+
{
177+
layerIdList.append( currentVectorLayer->id() );
178+
enabledList.append( "enabled" );
179+
toleranceList.append( defaultSnapTolerance );
180+
toleranceUnitList.append( defaultSnapToleranceUnit );
181+
snapToList.append( defaultSnapType );
182+
}
183+
else if ( snappingMode == "all_layers" )
184+
{
185+
QList<QgsMapLayer*> allLayers = mMapCanvas->layers();
186+
QList<QgsMapLayer*>::const_iterator layerIt = allLayers.constBegin();
187+
for ( ; layerIt != allLayers.constEnd(); ++layerIt )
188+
{
189+
if ( !( *layerIt ) )
190+
{
191+
continue;
192+
}
193+
layerIdList.append(( *layerIt )->id() );
194+
enabledList.append( "enabled" );
195+
toleranceList.append( defaultSnapTolerance );
196+
toleranceUnitList.append( defaultSnapToleranceUnit );
197+
snapToList.append( defaultSnapType );
198+
}
199+
}
200+
else //advanced
201+
{
202+
layerIdList = QgsProject::instance()->readListEntry( "Digitizing", "/LayerSnappingList", QStringList(), &ok );
203+
enabledList = QgsProject::instance()->readListEntry( "Digitizing", "/LayerSnappingEnabledList", QStringList(), &ok );
204+
toleranceList = QgsProject::instance()->readListEntry( "Digitizing", "/LayerSnappingToleranceList", QStringList(), &ok );
205+
toleranceUnitList = QgsProject::instance()->readListEntry( "Digitizing", "/LayerSnappingToleranceUnitList", QStringList(), &ok );
206+
snapToList = QgsProject::instance()->readListEntry( "Digitizing", "/LayerSnapToList", QStringList(), &ok );
207+
}
160208

161209
if ( !( layerIdList.size() == enabledList.size() &&
162210
layerIdList.size() == toleranceList.size() &&
@@ -170,89 +218,51 @@ int QgsMapCanvasSnapper::snapToBackgroundLayers( const QgsPoint& point, QList<Qg
170218
QList<QgsSnapper::SnapLayer> snapLayers;
171219
QgsSnapper::SnapLayer snapLayer;
172220

173-
// Use snapping information from the project
174-
if ( snappingDefinedInProject )
221+
222+
223+
// set layers, tolerances, snap to segment/vertex to QgsSnapper
224+
QStringList::const_iterator layerIt( layerIdList.constBegin() );
225+
QStringList::const_iterator tolIt( toleranceList.constBegin() );
226+
QStringList::const_iterator tolUnitIt( toleranceUnitList.constBegin() );
227+
QStringList::const_iterator snapIt( snapToList.constBegin() );
228+
QStringList::const_iterator enabledIt( enabledList.constBegin() );
229+
for ( ; layerIt != layerIdList.constEnd(); ++layerIt, ++tolIt, ++tolUnitIt, ++snapIt, ++enabledIt )
175230
{
176-
// set layers, tolerances, snap to segment/vertex to QgsSnapper
177-
QStringList::const_iterator layerIt( layerIdList.constBegin() );
178-
QStringList::const_iterator tolIt( toleranceList.constBegin() );
179-
QStringList::const_iterator tolUnitIt( toleranceUnitList.constBegin() );
180-
QStringList::const_iterator snapIt( snapToList.constBegin() );
181-
QStringList::const_iterator enabledIt( enabledList.constBegin() );
182-
for ( ; layerIt != layerIdList.constEnd(); ++layerIt, ++tolIt, ++tolUnitIt, ++snapIt, ++enabledIt )
231+
if ( *enabledIt != "enabled" )
183232
{
184-
if ( *enabledIt != "enabled" )
185-
{
186-
// skip layer if snapping is not enabled
187-
continue;
188-
}
189-
190-
//layer
191-
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( QgsMapLayerRegistry::instance()->mapLayer( *layerIt ) );
192-
if ( !vlayer || !vlayer->hasGeometryType() )
193-
continue;
233+
// skip layer if snapping is not enabled
234+
continue;
235+
}
194236

195-
snapLayer.mLayer = vlayer;
237+
//layer
238+
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( QgsMapLayerRegistry::instance()->mapLayer( *layerIt ) );
239+
if ( !vlayer || !vlayer->hasGeometryType() )
240+
continue;
196241

197-
//tolerance
198-
snapLayer.mTolerance = tolIt->toDouble();
199-
snapLayer.mUnitType = ( QgsTolerance::UnitType ) tolUnitIt->toInt();
242+
snapLayer.mLayer = vlayer;
200243

201-
// segment or vertex
202-
if ( *snapIt == "to_vertex" )
203-
{
204-
snapLayer.mSnapTo = QgsSnapper::SnapToVertex;
205-
}
206-
else if ( *snapIt == "to_segment" )
207-
{
208-
snapLayer.mSnapTo = QgsSnapper::SnapToSegment;
209-
}
210-
else
211-
{
212-
// to vertex and segment
213-
snapLayer.mSnapTo = QgsSnapper::SnapToVertexAndSegment;
214-
}
244+
//tolerance
245+
snapLayer.mTolerance = tolIt->toDouble();
246+
snapLayer.mUnitType = ( QgsTolerance::UnitType ) tolUnitIt->toInt();
215247

216-
snapLayers.append( snapLayer );
248+
// segment or vertex
249+
if ( *snapIt == "to vertex" || *snapIt == "to_vertex" )
250+
{
251+
snapLayer.mSnapTo = QgsSnapper::SnapToVertex;
217252
}
218-
}
219-
else
220-
{
221-
// nothing in project. Use default snapping tolerance to vertex of current layer
222-
QgsMapLayer* currentLayer = mMapCanvas->currentLayer();
223-
if ( !currentLayer )
224-
return 2;
225-
226-
QgsVectorLayer* currentVectorLayer = qobject_cast<QgsVectorLayer *>( currentLayer );
227-
if ( !currentVectorLayer )
228-
return 3;
229-
230-
snapLayer.mLayer = currentVectorLayer;
231-
232-
//default snap mode
233-
QSettings settings;
234-
QString defaultSnapString = settings.value( "/qgis/digitizing/default_snap_mode", "off" ).toString();
235-
if ( defaultSnapString == "to segment" )
253+
else if ( *snapIt == "to segment" || *snapIt == "to_segment" )
236254
{
237255
snapLayer.mSnapTo = QgsSnapper::SnapToSegment;
238256
}
239-
else if ( defaultSnapString == "to vertex and segment" )
257+
else if ( *snapIt == "to vertex and segment" || *snapIt == "to_vertex_and_segment" )
240258
{
241259
snapLayer.mSnapTo = QgsSnapper::SnapToVertexAndSegment;
242260
}
243-
else if ( defaultSnapString == "to vertex" )
244-
{
245-
snapLayer.mSnapTo = QgsSnapper::SnapToVertex;
246-
}
247-
else
261+
else //off
248262
{
249-
return 0;
263+
continue;
250264
}
251265

252-
//default snapping tolerance (returned in map units)
253-
snapLayer.mTolerance = QgsTolerance::defaultTolerance( currentVectorLayer, mMapCanvas->mapSettings() );
254-
snapLayer.mUnitType = QgsTolerance::LayerUnits;
255-
256266
snapLayers.append( snapLayer );
257267
}
258268

0 commit comments

Comments
 (0)