18 #include <QDomElement> 19 #include <QHeaderView> 31 , mTolerance( tolerance )
82 return mValid != other.mValid
83 || mEnabled != other.mEnabled
84 || mType != other.mType
85 || mTolerance != other.mTolerance
86 || mUnits != other.mUnits;
91 return mValid == other.mValid
92 && mEnabled == other.mEnabled
93 && mType == other.mType
94 && mTolerance == other.mTolerance
95 && mUnits == other.mUnits;
100 : mProject( project )
108 return mEnabled == other.mEnabled
109 && mMode == other.mMode
110 && mType == other.mType
111 && mTolerance == other.mTolerance
112 && mUnits == other.mUnits
113 && mIntersectionSnapping == other.mIntersectionSnapping
114 && mIndividualLayerSettings == other.mIndividualLayerSettings;
120 bool enabled =
QgsSettings().
value( QStringLiteral(
"/qgis/digitizing/default_snap_enabled" ),
false ).toBool();
146 mIntersectionSnapping =
false;
149 mIndividualLayerSettings = QHash<QgsVectorLayer *, IndividualLayerSettings>();
167 if ( mEnabled == enabled )
209 if ( mTolerance == tolerance )
223 if ( mUnits == units )
232 return mIntersectionSnapping;
237 mIntersectionSnapping =
enabled;
242 return mIndividualLayerSettings;
247 if ( vl && mIndividualLayerSettings.contains( vl ) )
249 return mIndividualLayerSettings.value( vl );
264 mIndividualLayerSettings.insert( vl, individualLayerSettings );
269 return mEnabled != other.mEnabled
270 || mMode != other.mMode
271 || mType != other.mType
272 || mTolerance != other.mTolerance
273 || mUnits != other.mUnits
274 || mIndividualLayerSettings != other.mIndividualLayerSettings;
279 QDomElement snapSettingsElem = doc.firstChildElement( QStringLiteral(
"qgis" ) ).firstChildElement( QStringLiteral(
"snapping-settings" ) );
280 if ( snapSettingsElem.isNull() )
282 readLegacySettings();
286 if ( snapSettingsElem.hasAttribute( QStringLiteral(
"enabled" ) ) )
287 mEnabled = snapSettingsElem.attribute( QStringLiteral(
"enabled" ) ) == QLatin1String(
"1" );
289 if ( snapSettingsElem.hasAttribute( QStringLiteral(
"mode" ) ) )
290 mMode = (
SnappingMode )snapSettingsElem.attribute( QStringLiteral(
"mode" ) ).toInt();
292 if ( snapSettingsElem.hasAttribute( QStringLiteral(
"type" ) ) )
293 mType = (
SnappingType )snapSettingsElem.attribute( QStringLiteral(
"type" ) ).toInt();
295 if ( snapSettingsElem.hasAttribute( QStringLiteral(
"tolerance" ) ) )
296 mTolerance = snapSettingsElem.attribute( QStringLiteral(
"tolerance" ) ).toDouble();
298 if ( snapSettingsElem.hasAttribute( QStringLiteral(
"unit" ) ) )
301 if ( snapSettingsElem.hasAttribute( QStringLiteral(
"intersection-snapping" ) ) )
302 mIntersectionSnapping = snapSettingsElem.attribute( QStringLiteral(
"intersection-snapping" ) ) == QLatin1String(
"1" );
305 QDomNodeList nodes = snapSettingsElem.elementsByTagName( QStringLiteral(
"individual-layer-settings" ) );
308 QDomNode node = nodes.item( 0 );
309 QDomNodeList settingNodes = node.childNodes();
310 int layerCount = settingNodes.count();
311 for (
int i = 0; i < layerCount; ++i )
313 QDomElement settingElement = settingNodes.at( i ).toElement();
314 if ( settingElement.tagName() != QLatin1String(
"layer-setting" ) )
316 QgsLogger::warning( QApplication::translate(
"QgsProjectSnappingSettings",
"Cannot read individual settings. Unexpected tag '%1'" ).arg( settingElement.tagName() ) );
320 QString layerId = settingElement.attribute( QStringLiteral(
"id" ) );
321 bool enabled = settingElement.attribute( QStringLiteral(
"enabled" ) ) == QLatin1String(
"1" );
323 double tolerance = settingElement.attribute( QStringLiteral(
"tolerance" ) ).toDouble();
333 mIndividualLayerSettings.insert( vl, setting );
340 QDomElement snapSettingsElem = doc.createElement( QStringLiteral(
"snapping-settings" ) );
341 snapSettingsElem.setAttribute( QStringLiteral(
"enabled" ), QString::number( mEnabled ) );
342 snapSettingsElem.setAttribute( QStringLiteral(
"mode" ), static_cast<int>( mMode ) );
343 snapSettingsElem.setAttribute( QStringLiteral(
"type" ), static_cast<int>( mType ) );
344 snapSettingsElem.setAttribute( QStringLiteral(
"tolerance" ), mTolerance );
345 snapSettingsElem.setAttribute( QStringLiteral(
"unit" ), static_cast<int>( mUnits ) );
346 snapSettingsElem.setAttribute( QStringLiteral(
"intersection-snapping" ), QString::number( mIntersectionSnapping ) );
348 QDomElement ilsElement = doc.createElement( QStringLiteral(
"individual-layer-settings" ) );
349 QHash<QgsVectorLayer *, IndividualLayerSettings>::const_iterator layerIt = mIndividualLayerSettings.constBegin();
350 for ( ; layerIt != mIndividualLayerSettings.constEnd(); ++layerIt )
354 QDomElement layerElement = doc.createElement( QStringLiteral(
"layer-setting" ) );
355 layerElement.setAttribute( QStringLiteral(
"id" ), layerIt.key()->id() );
356 layerElement.setAttribute( QStringLiteral(
"enabled" ), QString::number( setting.
enabled() ) );
357 layerElement.setAttribute( QStringLiteral(
"type" ), static_cast<int>( setting.
type() ) );
358 layerElement.setAttribute( QStringLiteral(
"tolerance" ), setting.
tolerance() );
359 layerElement.setAttribute( QStringLiteral(
"units" ), static_cast<int>( setting.
units() ) );
360 ilsElement.appendChild( layerElement );
362 snapSettingsElem.appendChild( ilsElement );
364 doc.firstChildElement( QStringLiteral(
"qgis" ) ).appendChild( snapSettingsElem );
369 bool changed =
false;
370 bool enabled =
QgsSettings().
value( QStringLiteral(
"/qgis/digitizing/default_snap_enabled" ),
true ).toBool();
389 bool changed =
false;
395 mIndividualLayerSettings.remove( vl );
402 void QgsSnappingConfig::readLegacySettings()
407 QString snapMode = mProject->
readEntry( QStringLiteral(
"Digitizing" ), QStringLiteral(
"/SnappingMode" ) );
409 mTolerance = mProject->
readDoubleEntry( QStringLiteral(
"Digitizing" ), QStringLiteral(
"/DefaultSnapTolerance" ), 0 );
412 mIntersectionSnapping = mProject->
readNumEntry( QStringLiteral(
"Digitizing" ), QStringLiteral(
"/IntersectionSnapping" ), 0 );
415 QStringList layerIdList = mProject->
readListEntry( QStringLiteral(
"Digitizing" ), QStringLiteral(
"/LayerSnappingList" ), QStringList() );
416 QStringList enabledList = mProject->
readListEntry( QStringLiteral(
"Digitizing" ), QStringLiteral(
"/LayerSnappingEnabledList" ), QStringList() );
417 QStringList toleranceList = mProject->
readListEntry( QStringLiteral(
"Digitizing" ), QStringLiteral(
"/LayerSnappingToleranceList" ), QStringList() );
418 QStringList toleranceUnitList = mProject->
readListEntry( QStringLiteral(
"Digitizing" ), QStringLiteral(
"/LayerSnappingToleranceUnitList" ), QStringList() );
419 QStringList snapToList = mProject->
readListEntry( QStringLiteral(
"Digitizing" ), QStringLiteral(
"/LayerSnapToList" ), QStringList() );
422 if ( layerIdList.size() != enabledList.size() ||
423 layerIdList.size() != toleranceList.size() ||
424 layerIdList.size() != toleranceUnitList.size() ||
425 layerIdList.size() != snapToList.size() )
429 if ( snapMode == QLatin1String(
"current_layer" ) )
431 else if ( snapMode == QLatin1String(
"all_layers" ) )
437 QStringList::const_iterator layerIt( layerIdList.constBegin() );
438 QStringList::const_iterator tolIt( toleranceList.constBegin() );
439 QStringList::const_iterator tolUnitIt( toleranceUnitList.constBegin() );
440 QStringList::const_iterator snapIt( snapToList.constBegin() );
441 QStringList::const_iterator enabledIt( enabledList.constBegin() );
442 for ( ; layerIt != layerIdList.constEnd(); ++layerIt, ++tolIt, ++tolUnitIt, ++snapIt, ++enabledIt )
449 ( *snapIt == QLatin1String(
"to_segment" ) ?
Segment :
457 QString snapType = mProject->
readEntry( QStringLiteral(
"Digitizing" ), QStringLiteral(
"/DefaultSnapType" ), QStringLiteral(
"off" ) );
459 if ( snapType == QLatin1String(
"to segment" ) )
461 else if ( snapType == QLatin1String(
"to vertex and segment" ) )
463 else if ( snapType == QLatin1String(
"to vertex" ) )
478 if ( mProject != project )
void setEnabled(bool enabled)
enables the snapping
SnappingMode
SnappingMode defines on which layer the snapping is performed.
void setEnabled(bool enabled)
enables the snapping
double tolerance() const
Returns the tolerance.
Base class for all map layer types.
QgsMapLayer::LayerType type() const
Returns the type of the layer.
This class is a composition of two QSettings instances:
Both on vertices and segments.
void writeProject(QDomDocument &doc)
Writes the configuration to the specified QGIS project document.
bool valid() const
Returns if settings are valid.
QgsProject * project() const
The project from which the snapped layers should be retrieved.
bool enabled() const
Returns if snapping is enabled.
static void warning(const QString &msg)
Goes to qWarning.
bool operator!=(const QgsSnappingConfig::IndividualLayerSettings &other) const
Compare this configuration to other.
bool operator==(const QgsSnappingConfig::IndividualLayerSettings &other) const
UnitType
Type of unit of tolerance value from settings.
QgsSnappingConfig(QgsProject *project=nullptr)
Constructor with default parameters defined in global settings.
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
QStringList readListEntry(const QString &scope, const QString &key, const QStringList &def=QStringList(), bool *ok=nullptr) const
Key value accessors.
bool operator!=(const QgsSnappingConfig &other) const
Compare this configuration to other.
QString readEntry(const QString &scope, const QString &key, const QString &def=QString(), bool *ok=nullptr) const
void reset()
reset to default values
bool isSpatial() const FINAL
Returns true if this is a geometry layer and false in case of NoGeometry (table only) or UnknownGeome...
SnappingType type() const
Returns the type (vertices and/or segments)
void setIndividualLayerSettings(QgsVectorLayer *vl, const QgsSnappingConfig::IndividualLayerSettings &individualLayerSettings)
Sets individual layer snappings settings (applied if mode is AdvancedConfiguration) ...
QgsTolerance::UnitType units() const
Returns the type of units.
void setUnits(QgsTolerance::UnitType units)
Sets the type of units.
void readProject(const QDomDocument &doc)
Reads the configuration from the specified QGIS project document.
static const double DEFAULT_SNAP_TOLERANCE
Default snapping distance tolerance.
void setIntersectionSnapping(bool enabled)
Sets if the snapping on intersection is enabled.
bool intersectionSnapping() const
Returns if the snapping on intersection is enabled.
QgsSnappingConfig::SnappingType type() const
Returns the type (vertices and/or segments)
Reads and writes project states.
This is a container of advanced configuration (per layer) of the snapping of the project.
On a per layer configuration basis.
bool operator==(const QgsSnappingConfig &other) const
QHash< QgsVectorLayer *, QgsSnappingConfig::IndividualLayerSettings > individualLayerSettings() const
Returns individual snapping settings for all layers.
static const QgsTolerance::UnitType DEFAULT_SNAP_UNITS
Default snapping distance units.
bool enabled() const
Returns if snapping is enabled.
void setTolerance(double tolerance)
Sets the tolerance.
bool addLayers(const QList< QgsMapLayer * > &layers)
Adds the specified layers as individual layers to the configuration with standard configuration...
void setType(QgsSnappingConfig::SnappingType type)
define the type of snapping
int readNumEntry(const QString &scope, const QString &key, int def=0, bool *ok=nullptr) const
void setMode(SnappingMode mode)
define the mode of snapping
bool removeLayers(const QList< QgsMapLayer * > &layers)
Removes the specified layers from the individual layer configuration.
SnappingMode mode() const
Returns the mode (all layers, active layer, per layer settings)
double readDoubleEntry(const QString &scope, const QString &key, double def=0, bool *ok=nullptr) const
SnappingType
SnappingType defines on what object the snapping is performed.
Map (project) units. Added in 2.8.
QgsTolerance::UnitType units() const
Returns the type of units.
QgsMapLayer * mapLayer(const QString &layerId) const
Retrieve a pointer to a registered layer by layer ID.
IndividualLayerSettings()=default
Constructs an invalid setting.
void setType(SnappingType type)
define the type of snapping
double tolerance() const
Returns the tolerance.
T enumValue(const QString &key, const T &defaultValue, const Section section=NoSection)
Returns the setting value for a setting based on an enum.
This is a container for configuration of the snapping of the project.
void setUnits(QgsTolerance::UnitType units)
Sets the type of units.
void setProject(QgsProject *project)
The project from which the snapped layers should be retrieved.
Represents a vector layer which manages a vector based data sets.
QMap< QString, QgsMapLayer * > mapLayers() const
Returns a map of all registered layers by layer ID.
void setTolerance(double tolerance)
Sets the tolerance.