Skip to content

Commit 87a60d4

Browse files
authoredMay 17, 2018
Merge pull request #6733 from 3nids/setenumvalue
Save enum values as string in settings
2 parents 1a879b1 + c9b3e2a commit 87a60d4

14 files changed

+209
-70
lines changed
 

‎resources/qgis_global_settings.ini

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,12 @@ digitizing\default_snap_enabled=false
99
digitizing\default_snapping_tolerance=12.0
1010

1111
# Default snap to type
12-
# 1 = Vertices only
13-
# 2 = Vertices and segments
14-
# 3 = Segments only
15-
digitizing\default_snap_type=1
12+
# Vertex, VertexAndSegment, Segment
13+
digitizing\default_snap_type=Vertex
1614

1715
# Default snapping unit
18-
# 0 = Layer units
19-
# 1 = Pixels
20-
# 2 = Project units
21-
digitizing\default_snapping_tolerance_unit=1
16+
# LayerUnits, Pixels, ProjectUnits
17+
digitizing\default_snapping_tolerance_unit=Pixels
2218

2319
# Snap on invisble feature
2420
digitizing\snap_invisible_feature=false
@@ -55,4 +51,3 @@ helpSearchPath=https://docs.qgis.org/$qgis_short_version/$qgis_locale/docs/user_
5551
[providers]
5652
# Default timeout for PostgreSQL servers (seconds)
5753
PostgreSQL\default_timeout=30
58-

‎src/app/qgisapp.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11784,7 +11784,7 @@ void QgisApp::activateDeactivateLayerRelatedActions( QgsMapLayer *layer )
1178411784
mActionSelectPolygon->setEnabled( false );
1178511785
mActionSelectFreehand->setEnabled( false );
1178611786
mActionSelectRadius->setEnabled( false );
11787-
mActionIdentify->setEnabled( QgsSettings().value( QStringLiteral( "/Map/identifyMode" ), 0 ).toInt() != 0 );
11787+
mActionIdentify->setEnabled( QgsSettings().enumValue( QStringLiteral( "/Map/identifyMode" ), QgsMapToolIdentify::ActiveLayer ) != QgsMapToolIdentify::ActiveLayer );
1178811788
mActionSelectByExpression->setEnabled( false );
1178911789
mActionSelectByForm->setEnabled( false );
1179011790
mActionLabeling->setEnabled( false );
@@ -12184,8 +12184,8 @@ void QgisApp::activateDeactivateLayerRelatedActions( QgsMapLayer *layer )
1218412184
mActionIdentify->setEnabled( true );
1218512185

1218612186
QgsSettings settings;
12187-
int identifyMode = settings.value( QStringLiteral( "Map/identifyMode" ), 0 ).toInt();
12188-
if ( identifyMode == 0 )
12187+
QgsMapToolIdentify::IdentifyMode identifyMode = settings.enumValue( QStringLiteral( "Map/identifyMode" ), QgsMapToolIdentify::ActiveLayer );
12188+
if ( identifyMode == QgsMapToolIdentify::ActiveLayer )
1218912189
{
1219012190
const QgsRasterLayer *rlayer = qobject_cast<const QgsRasterLayer *>( layer );
1219112191
const QgsRasterDataProvider *dprovider = rlayer->dataProvider();

‎src/app/qgsidentifyresultsdialog.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -370,12 +370,12 @@ QgsIdentifyResultsDialog::QgsIdentifyResultsDialog( QgsMapCanvas *canvas, QWidge
370370
}
371371

372372
// retrieve mode before on_cmbIdentifyMode_currentIndexChanged resets it on addItem
373-
int identifyMode = mySettings.value( QStringLiteral( "Map/identifyMode" ), 0 ).toInt();
373+
QgsMapToolIdentify::IdentifyMode identifyMode = mySettings.enumValue( QStringLiteral( "Map/identifyMode" ), QgsMapToolIdentify::ActiveLayer );
374374

375-
cmbIdentifyMode->addItem( tr( "Current layer" ), 0 );
376-
cmbIdentifyMode->addItem( tr( "Top down, stop at first" ), 1 );
377-
cmbIdentifyMode->addItem( tr( "Top down" ), 2 );
378-
cmbIdentifyMode->addItem( tr( "Layer selection" ), 3 );
375+
cmbIdentifyMode->addItem( tr( "Current layer" ), QgsMapToolIdentify::ActiveLayer );
376+
cmbIdentifyMode->addItem( tr( "Top down, stop at first" ), QgsMapToolIdentify::TopDownStopAtFirst );
377+
cmbIdentifyMode->addItem( tr( "Top down" ), QgsMapToolIdentify::TopDownAll );
378+
cmbIdentifyMode->addItem( tr( "Layer selection" ), QgsMapToolIdentify::LayerSelection );
379379
cmbIdentifyMode->setCurrentIndex( cmbIdentifyMode->findData( identifyMode ) );
380380
cbxAutoFeatureForm->setChecked( mySettings.value( QStringLiteral( "Map/identifyAutoFeatureForm" ), false ).toBool() );
381381

‎src/app/qgsmaptooloffsetcurve.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -645,10 +645,10 @@ QgsOffsetUserWidget::QgsOffsetUserWidget( QWidget *parent )
645645
mOffsetSpinBox->installEventFilter( this );
646646
connect( mOffsetSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsOffsetUserWidget::offsetChanged );
647647

648-
connect( mJoinStyleComboBox, static_cast < void ( QComboBox::* )( int ) > ( &QComboBox::currentIndexChanged ), this, [ = ] { QgsSettings().setValue( QStringLiteral( "/qgis/digitizing/offset_join_style" ), mJoinStyleComboBox->currentData() ); emit offsetConfigChanged(); } );
648+
connect( mJoinStyleComboBox, static_cast < void ( QComboBox::* )( int ) > ( &QComboBox::currentIndexChanged ), this, [ = ] { QgsSettings().setEnumValue( QStringLiteral( "/qgis/digitizing/offset_join_style" ), ( QgsGeometry::JoinStyle )mJoinStyleComboBox->currentData().toInt() ); emit offsetConfigChanged(); } );
649649
connect( mQuadrantSpinBox, static_cast < void ( QSpinBox::* )( int ) > ( &QSpinBox::valueChanged ), this, [ = ]( const int quadSegments ) { QgsSettings().setValue( QStringLiteral( "/qgis/digitizing/offset_quad_seg" ), quadSegments ); emit offsetConfigChanged(); } );
650650
connect( mMiterLimitSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, [ = ]( const double & miterLimit ) { QgsSettings().setValue( QStringLiteral( "/qgis/digitizing/offset_miter_limit" ), miterLimit ); emit offsetConfigChanged(); } );
651-
connect( mCapStyleComboBox, static_cast < void ( QComboBox::* )( int ) > ( &QComboBox::currentIndexChanged ), this, [ = ] { QgsSettings().setValue( QStringLiteral( "/qgis/digitizing/offset_cap_style" ), mCapStyleComboBox->currentData() ); emit offsetConfigChanged(); } );
651+
connect( mCapStyleComboBox, static_cast < void ( QComboBox::* )( int ) > ( &QComboBox::currentIndexChanged ), this, [ = ] { QgsSettings().setEnumValue( QStringLiteral( "/qgis/digitizing/offset_cap_style" ), ( QgsGeometry::EndCapStyle ) mCapStyleComboBox->currentData().toInt() ); emit offsetConfigChanged(); } );
652652

653653
bool showAdvanced = s.value( QStringLiteral( "/qgis/digitizing/offset_show_advanced" ), false ).toBool();
654654
mShowAdvancedButton->setChecked( showAdvanced );

‎src/app/qgsoptions.cpp

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -581,17 +581,17 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WindowFlags fl, const QList<QgsOpti
581581
mSimplifyDrawingAtProvider->setChecked( !mSettings->value( QStringLiteral( "/qgis/simplifyLocal" ), true ).toBool() );
582582

583583
//segmentation tolerance type
584-
mToleranceTypeComboBox->addItem( tr( "Maximum angle" ), 0 );
585-
mToleranceTypeComboBox->addItem( tr( "Maximum difference" ), 1 );
586-
int toleranceType = mSettings->value( QStringLiteral( "/qgis/segmentationToleranceType" ), "0" ).toInt();
584+
mToleranceTypeComboBox->addItem( tr( "Maximum angle" ), QgsAbstractGeometry::MaximumAngle );
585+
mToleranceTypeComboBox->addItem( tr( "Maximum difference" ), QgsAbstractGeometry::MaximumDifference );
586+
QgsAbstractGeometry::SegmentationToleranceType toleranceType = mSettings->enumValue( QStringLiteral( "/qgis/segmentationToleranceType" ), QgsAbstractGeometry::MaximumAngle );
587587
int toleranceTypeIndex = mToleranceTypeComboBox->findData( toleranceType );
588588
if ( toleranceTypeIndex != -1 )
589589
{
590590
mToleranceTypeComboBox->setCurrentIndex( toleranceTypeIndex );
591591
}
592592

593593
double tolerance = mSettings->value( QStringLiteral( "/qgis/segmentationTolerance" ), "0.01745" ).toDouble();
594-
if ( toleranceType == 0 )
594+
if ( toleranceType == QgsAbstractGeometry::MaximumAngle )
595595
{
596596
tolerance = tolerance * 180.0 / M_PI; //value shown to the user is degree, not rad
597597
}
@@ -616,7 +616,7 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WindowFlags fl, const QList<QgsOpti
616616
mSimplifyAlgorithmComboBox->addItem( tr( "Distance" ), ( int )QgsVectorSimplifyMethod::Distance );
617617
mSimplifyAlgorithmComboBox->addItem( tr( "SnapToGrid" ), ( int )QgsVectorSimplifyMethod::SnapToGrid );
618618
mSimplifyAlgorithmComboBox->addItem( tr( "Visvalingam" ), ( int )QgsVectorSimplifyMethod::Visvalingam );
619-
mSimplifyAlgorithmComboBox->setCurrentIndex( mSimplifyAlgorithmComboBox->findData( mSettings->value( QStringLiteral( "/qgis/simplifyAlgorithm" ), 0 ).toInt() ) );
619+
mSimplifyAlgorithmComboBox->setCurrentIndex( mSimplifyAlgorithmComboBox->findData( mSettings->enumValue( QStringLiteral( "/qgis/simplifyAlgorithm" ), QgsVectorSimplifyMethod::NoSimplification ) ) );
620620

621621
// Slightly awkard here at the settings value is true to use QImage,
622622
// but the checkbox is true to use QPixmap
@@ -633,7 +633,7 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WindowFlags fl, const QList<QgsOpti
633633
mComboCopyFeatureFormat->addItem( tr( "Plain text, no geometry" ), QgsClipboard::AttributesOnly );
634634
mComboCopyFeatureFormat->addItem( tr( "Plain text, WKT geometry" ), QgsClipboard::AttributesWithWKT );
635635
mComboCopyFeatureFormat->addItem( tr( "GeoJSON" ), QgsClipboard::GeoJSON );
636-
mComboCopyFeatureFormat->setCurrentIndex( mComboCopyFeatureFormat->findData( mSettings->value( QStringLiteral( "/qgis/copyFeatureFormat" ), QgsClipboard::AttributesWithWKT ) ) );
636+
mComboCopyFeatureFormat->setCurrentIndex( mComboCopyFeatureFormat->findData( mSettings->enumValue( QStringLiteral( "/qgis/copyFeatureFormat" ), QgsClipboard::AttributesWithWKT ) ) );
637637
leNullValue->setText( QgsApplication::nullRepresentation() );
638638
cbxIgnoreShapeEncoding->setChecked( mSettings->value( QStringLiteral( "/qgis/ignoreShapeEncoding" ), true ).toBool() );
639639

@@ -948,7 +948,7 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WindowFlags fl, const QList<QgsOpti
948948
mDefaultSnapModeComboBox->addItem( tr( "Vertex" ), QgsSnappingConfig::Vertex );
949949
mDefaultSnapModeComboBox->addItem( tr( "Vertex and segment" ), QgsSnappingConfig::VertexAndSegment );
950950
mDefaultSnapModeComboBox->addItem( tr( "Segment" ), QgsSnappingConfig::Segment );
951-
mDefaultSnapModeComboBox->setCurrentIndex( mDefaultSnapModeComboBox->findData( mSettings->value( QStringLiteral( "/qgis/digitizing/default_snap_type" ), QgsSnappingConfig::Vertex ).toInt() ) );
951+
mDefaultSnapModeComboBox->setCurrentIndex( mDefaultSnapModeComboBox->findData( mSettings->enumValue( QStringLiteral( "/qgis/digitizing/default_snap_type" ), QgsSnappingConfig::Vertex ) ) );
952952
mDefaultSnappingToleranceSpinBox->setValue( mSettings->value( QStringLiteral( "/qgis/digitizing/default_snapping_tolerance" ), Qgis::DEFAULT_SNAP_TOLERANCE ).toDouble() );
953953
mSearchRadiusVertexEditSpinBox->setValue( mSettings->value( QStringLiteral( "/qgis/digitizing/search_radius_vertex_edit" ), 10 ).toDouble() );
954954
QgsTolerance::UnitType defSnapUnits = mSettings->enumValue( QStringLiteral( "/qgis/digitizing/default_snapping_tolerance_unit" ), Qgis::DEFAULT_SNAP_UNITS );
@@ -961,7 +961,7 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WindowFlags fl, const QList<QgsOpti
961961
index = mDefaultSnappingToleranceComboBox->findText( tr( "pixels" ) );
962962
}
963963
mDefaultSnappingToleranceComboBox->setCurrentIndex( index );
964-
int defRadiusUnits = mSettings->value( QStringLiteral( "/qgis/digitizing/search_radius_vertex_edit_unit" ), QgsTolerance::Pixels ).toInt();
964+
QgsTolerance::UnitType defRadiusUnits = mSettings->enumValue( QStringLiteral( "/qgis/digitizing/search_radius_vertex_edit_unit" ), QgsTolerance::Pixels );
965965
if ( defRadiusUnits == QgsTolerance::ProjectUnits || defRadiusUnits == QgsTolerance::LayerUnits )
966966
{
967967
index = mSearchRadiusVertexEditComboBox->findText( tr( "map units" ) );
@@ -974,7 +974,6 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WindowFlags fl, const QList<QgsOpti
974974

975975
mSnappingMarkerColorButton->setColor( mSettings->value( QStringLiteral( "/qgis/digitizing/snap_color" ), QColor( Qt::magenta ) ).value<QColor>() );
976976
mSnappingTooltipsCheckbox->setChecked( mSettings->value( QStringLiteral( "/qgis/digitizing/snap_tooltip" ), false ).toBool() );
977-
mEnableSnappingOnInvisibleFeatureCheckbox->setChecked( mSettings->value( QStringLiteral( "/qgis/digitizing/snap_invisible_feature" ), false ).toBool() );
978977

979978
//vertex marker
980979
mMarkersOnlyForSelectedCheckBox->setChecked( mSettings->value( QStringLiteral( "/qgis/digitizing/marker_only_for_selected" ), true ).toBool() );
@@ -1012,10 +1011,10 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WindowFlags fl, const QList<QgsOpti
10121011
mSnappingMainDialogComboBox->addItem( tr( "Dock" ), "dock" );
10131012
mSnappingMainDialogComboBox->setCurrentIndex( mSnappingMainDialogComboBox->findData( mSettings->value( QStringLiteral( "/qgis/mainSnappingWidgetMode" ), "dialog" ).toString() ) );
10141013

1015-
mOffsetJoinStyleComboBox->addItem( tr( "Round" ), 0 );
1016-
mOffsetJoinStyleComboBox->addItem( tr( "Miter" ), 1 );
1017-
mOffsetJoinStyleComboBox->addItem( tr( "Bevel" ), 2 );
1018-
mOffsetJoinStyleComboBox->setCurrentIndex( mSettings->value( QStringLiteral( "/qgis/digitizing/offset_join_style" ), QgsGeometry::JoinStyleRound ).toInt() );
1014+
mOffsetJoinStyleComboBox->addItem( tr( "Round" ), QgsGeometry::JoinStyleRound );
1015+
mOffsetJoinStyleComboBox->addItem( tr( "Miter" ), QgsGeometry::JoinStyleMiter );
1016+
mOffsetJoinStyleComboBox->addItem( tr( "Bevel" ), QgsGeometry::JoinStyleBevel );
1017+
mOffsetJoinStyleComboBox->setCurrentIndex( ( int )mSettings->enumValue( QStringLiteral( "/qgis/digitizing/offset_join_style" ), QgsGeometry::JoinStyleRound ) );
10191018
mOffsetQuadSegSpinBox->setValue( mSettings->value( QStringLiteral( "/qgis/digitizing/offset_quad_seg" ), 8 ).toInt() );
10201019
mCurveOffsetMiterLimitComboBox->setValue( mSettings->value( QStringLiteral( "/qgis/digitizing/offset_miter_limit" ), 5.0 ).toDouble() );
10211020

@@ -1314,7 +1313,7 @@ void QgsOptions::saveOptions()
13141313
mSettings->setValue( QStringLiteral( "/qgis/dataSourceManagerNonModal" ), mDataSourceManagerNonModal->isChecked() );
13151314
mSettings->setValue( QStringLiteral( "/qgis/checkVersion" ), cbxCheckVersion->isChecked() );
13161315
mSettings->setValue( QStringLiteral( "/qgis/dockAttributeTable" ), cbxAttributeTableDocked->isChecked() );
1317-
mSettings->setValue( QStringLiteral( "/qgis/attributeTableBehavior" ), cmbAttrTableBehavior->currentData() );
1316+
mSettings->setEnumValue( QStringLiteral( "/qgis/attributeTableBehavior" ), ( QgsAttributeTableFilterModel::FilterMode )cmbAttrTableBehavior->currentData().toInt() );
13181317
mSettings->setValue( QStringLiteral( "/qgis/attributeTableView" ), mAttrTableViewComboBox->currentData() );
13191318
mSettings->setValue( QStringLiteral( "/qgis/attributeTableRowCache" ), spinBoxAttrTableRowCache->value() );
13201319
mSettings->setValue( QStringLiteral( "/qgis/promptForRasterSublayers" ), cmbPromptRasterSublayers->currentIndex() );
@@ -1330,7 +1329,7 @@ void QgsOptions::saveOptions()
13301329
mSettings->setValue( QStringLiteral( "/qgis/compileExpressions" ), cbxCompileExpressions->isChecked() );
13311330
mSettings->setValue( QStringLiteral( "/qgis/defaultLegendGraphicResolution" ), mLegendGraphicResolutionSpinBox->value() );
13321331
mSettings->setValue( QStringLiteral( "/qgis/mapTipsDelay" ), mMapTipsDelaySpinBox->value() );
1333-
mSettings->setValue( QStringLiteral( "/qgis/copyFeatureFormat" ), mComboCopyFeatureFormat->currentData().toInt() );
1332+
mSettings->setEnumValue( QStringLiteral( "/qgis/copyFeatureFormat" ), ( QgsClipboard::CopyFormat )mComboCopyFeatureFormat->currentData().toInt() );
13341333
QgisApp::instance()->setMapTipsDelay( mMapTipsDelaySpinBox->value() );
13351334

13361335
mSettings->setValue( QStringLiteral( "/qgis/new_layers_visible" ), chkAddedVisibility->isChecked() );
@@ -1351,8 +1350,8 @@ void QgsOptions::saveOptions()
13511350
simplifyHints |= QgsVectorSimplifyMethod::GeometrySimplification;
13521351
if ( mSimplifyDrawingSpinBox->value() > 1 ) simplifyHints |= QgsVectorSimplifyMethod::AntialiasingSimplification;
13531352
}
1354-
mSettings->setValue( QStringLiteral( "/qgis/simplifyDrawingHints" ), ( int ) simplifyHints );
1355-
mSettings->setValue( QStringLiteral( "/qgis/simplifyAlgorithm" ), mSimplifyAlgorithmComboBox->currentData().toInt() );
1353+
mSettings->setEnumValue( QStringLiteral( "/qgis/simplifyDrawingHints" ), simplifyHints );
1354+
mSettings->setEnumValue( QStringLiteral( "/qgis/simplifyAlgorithm" ), ( QgsVectorSimplifyMethod::SimplifyHints )mSimplifyAlgorithmComboBox->currentData().toInt() );
13561355
mSettings->setValue( QStringLiteral( "/qgis/simplifyDrawingTol" ), mSimplifyDrawingSpinBox->value() );
13571356
mSettings->setValue( QStringLiteral( "/qgis/simplifyLocal" ), !mSimplifyDrawingAtProvider->isChecked() );
13581357
mSettings->setValue( QStringLiteral( "/qgis/simplifyMaxScale" ), mSimplifyMaximumScaleComboBox->scale() );
@@ -1361,10 +1360,10 @@ void QgsOptions::saveOptions()
13611360
mSettings->setValue( QStringLiteral( "/qgis/magnifier_factor_default" ), doubleSpinBoxMagnifierDefault->value() / 100 );
13621361

13631362
//curve segmentation
1364-
int segmentationType = mToleranceTypeComboBox->currentData().toInt();
1365-
mSettings->setValue( QStringLiteral( "/qgis/segmentationToleranceType" ), segmentationType );
1363+
QgsAbstractGeometry::SegmentationToleranceType segmentationType = ( QgsAbstractGeometry::SegmentationToleranceType )mToleranceTypeComboBox->currentData().toInt();
1364+
mSettings->setEnumValue( QStringLiteral( "/qgis/segmentationToleranceType" ), segmentationType );
13661365
double segmentationTolerance = mSegmentationToleranceSpinBox->value();
1367-
if ( segmentationType == 0 )
1366+
if ( segmentationType == QgsAbstractGeometry::MaximumAngle )
13681367
{
13691368
segmentationTolerance = segmentationTolerance / 180.0 * M_PI; //user sets angle tolerance in degrees, internal classes need value in rad
13701369
}
@@ -1493,13 +1492,13 @@ void QgsOptions::saveOptions()
14931492

14941493
//default snap mode
14951494
mSettings->setValue( QStringLiteral( "/qgis/digitizing/default_snap_enabled" ), mSnappingEnabledDefault->isChecked() );
1496-
mSettings->setValue( QStringLiteral( "/qgis/digitizing/default_snap_type" ), mDefaultSnapModeComboBox->currentData().toInt() );
1495+
mSettings->setEnumValue( QStringLiteral( "/qgis/digitizing/default_snap_type" ), ( QgsSnappingConfig::SnappingType )mDefaultSnapModeComboBox->currentData().toInt() );
14971496
mSettings->setValue( QStringLiteral( "/qgis/digitizing/default_snapping_tolerance" ), mDefaultSnappingToleranceSpinBox->value() );
14981497
mSettings->setValue( QStringLiteral( "/qgis/digitizing/search_radius_vertex_edit" ), mSearchRadiusVertexEditSpinBox->value() );
1499-
mSettings->setValue( QStringLiteral( "/qgis/digitizing/default_snapping_tolerance_unit" ),
1500-
( mDefaultSnappingToleranceComboBox->currentIndex() == 0 ? QgsTolerance::ProjectUnits : QgsTolerance::Pixels ) );
1501-
mSettings->setValue( QStringLiteral( "/qgis/digitizing/search_radius_vertex_edit_unit" ),
1502-
( mSearchRadiusVertexEditComboBox->currentIndex() == 0 ? QgsTolerance::ProjectUnits : QgsTolerance::Pixels ) );
1498+
mSettings->setEnumValue( QStringLiteral( "/qgis/digitizing/default_snapping_tolerance_unit" ),
1499+
( mDefaultSnappingToleranceComboBox->currentIndex() == 0 ? QgsTolerance::ProjectUnits : QgsTolerance::Pixels ) );
1500+
mSettings->setEnumValue( QStringLiteral( "/qgis/digitizing/search_radius_vertex_edit_unit" ),
1501+
( mSearchRadiusVertexEditComboBox->currentIndex() == 0 ? QgsTolerance::ProjectUnits : QgsTolerance::Pixels ) );
15031502

15041503
mSettings->setValue( QStringLiteral( "/qgis/digitizing/snap_color" ), mSnappingMarkerColorButton->color() );
15051504
mSettings->setValue( QStringLiteral( "/qgis/digitizing/snap_tooltip" ), mSnappingTooltipsCheckbox->isChecked() );
@@ -1526,7 +1525,7 @@ void QgsOptions::saveOptions()
15261525
mSettings->setValue( QStringLiteral( "/qgis/digitizing/disable_enter_attribute_values_dialog" ), chkDisableAttributeValuesDlg->isChecked() );
15271526
mSettings->setValue( QStringLiteral( "/qgis/digitizing/validate_geometries" ), mValidateGeometries->currentIndex() );
15281527

1529-
mSettings->setValue( QStringLiteral( "/qgis/digitizing/offset_join_style" ), mOffsetJoinStyleComboBox->currentData().toInt() );
1528+
mSettings->setEnumValue( QStringLiteral( "/qgis/digitizing/offset_join_style" ), ( QgsGeometry::JoinStyle )mOffsetJoinStyleComboBox->currentData().toInt() );
15301529
mSettings->setValue( QStringLiteral( "/qgis/digitizing/offset_quad_seg" ), mOffsetQuadSegSpinBox->value() );
15311530
mSettings->setValue( QStringLiteral( "/qgis/digitizing/offset_miter_limit" ), mCurveOffsetMiterLimitComboBox->value() );
15321531

‎src/core/qgssettings.h

Lines changed: 134 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
#include "qgis_core.h"
2424
#include "qgis.h"
25+
#include "qgslogger.h"
2526

2627
/**
2728
* \ingroup core
@@ -224,33 +225,155 @@ class CORE_EXPORT QgsSettings : public QObject
224225
* Return the setting value for a setting based on an enum.
225226
* This forces the output to be a valid and existing entry of the enum.
226227
* Hence if the setting value is incorrect, the given default value is returned.
227-
* If \a flag is true, the value is checked for a flag definition.
228+
* This tries first with setting as a string (as the enum) and then as an integer value.
228229
* \note The enum needs to be declared with Q_ENUM, and flags with Q_FLAG (not Q_FLAGS).
230+
* \see setEnumValue
231+
* \see flagValue
229232
*/
230233
template <class T>
231234
T enumValue( const QString &key, const T &defaultValue,
232-
const Section section = NoSection, bool flag = false ) const
235+
const Section section = NoSection )
233236
{
237+
QMetaEnum metaEnum = QMetaEnum::fromType<T>();
238+
Q_ASSERT( metaEnum.isValid() );
239+
if ( !metaEnum.isValid() )
240+
{
241+
QgsDebugMsg( "Invalid metaenum. Enum probably misses Q_ENUM or Q_FLAG declaration." );
242+
}
243+
234244
T v;
235-
if ( !flag )
236-
v = static_cast<T>( value( key, static_cast<int>( defaultValue ), section ).toInt() );
237-
else
238-
v = T( value( key, static_cast<int>( defaultValue ), section ).toInt() );
245+
bool ok = false;
239246

240-
QMetaEnum metaEnum = QMetaEnum::fromType<T>();
241247
if ( metaEnum.isValid() )
242248
{
243-
if ( !flag && !metaEnum.valueToKey( static_cast<int>( v ) ) )
249+
// read as string
250+
QByteArray ba = value( key, metaEnum.valueToKey( defaultValue ) ).toString().toUtf8();
251+
const char *vs = ba.data();
252+
v = static_cast<T>( metaEnum.keyToValue( vs, &ok ) );
253+
}
254+
if ( !ok )
255+
{
256+
// if failed, try to read as int (old behavior)
257+
// this code shall be removed later (probably after QGIS 3.4 LTR for 3.6)
258+
// then the method could be marked as const
259+
v = static_cast<T>( value( key, static_cast<int>( defaultValue ), section ).toInt( &ok ) );
260+
if ( metaEnum.isValid() )
244261
{
245-
v = defaultValue;
262+
if ( !ok || !metaEnum.valueToKey( static_cast<int>( v ) ) )
263+
{
264+
v = defaultValue;
265+
}
266+
else
267+
{
268+
// found setting as an integer
269+
// convert the setting to the new form (string)
270+
setEnumValue( key, v, section );
271+
}
246272
}
247-
else if ( flag && !metaEnum.valueToKeys( static_cast<int>( v ) ).size() )
273+
}
274+
275+
return v;
276+
}
277+
278+
/**
279+
* Set the value of a setting based on an enum.
280+
* The setting will be saved as string.
281+
* \note The enum needs to be declared with Q_ENUM, and flags with Q_FLAG (not Q_FLAGS).
282+
* \see enumValue
283+
* \see setFlagValue
284+
*/
285+
template <class T>
286+
void setEnumValue( const QString &key, const T &value,
287+
const Section section = NoSection )
288+
{
289+
QMetaEnum metaEnum = QMetaEnum::fromType<T>();
290+
Q_ASSERT( metaEnum.isValid() );
291+
if ( metaEnum.isValid() )
292+
{
293+
setValue( key, metaEnum.valueToKey( value ), section );
294+
}
295+
else
296+
{
297+
QgsDebugMsg( "Invalid metaenum. Enum probably misses Q_ENUM or Q_FLAG declaration." );
298+
}
299+
}
300+
301+
/**
302+
* Return the setting value for a setting based on a flag.
303+
* This forces the output to be a valid and existing entry of the flag.
304+
* Hence if the setting value is incorrect, the given default value is returned.
305+
* This tries first with setting as a string (using a byte array) and then as an integer value.
306+
* \note The flag needs to be declared with Q_FLAG (not Q_FLAGS).
307+
* \see setFlagValue
308+
* \see enumValue
309+
*/
310+
template <class T>
311+
T flagValue( const QString &key, const T &defaultValue,
312+
const Section section = NoSection )
313+
{
314+
QMetaEnum metaEnum = QMetaEnum::fromType<T>();
315+
Q_ASSERT( metaEnum.isValid() );
316+
if ( !metaEnum.isValid() )
317+
{
318+
QgsDebugMsg( "Invalid metaenum. Enum probably misses Q_ENUM or Q_FLAG declaration." );
319+
}
320+
321+
T v;
322+
bool ok = false;
323+
324+
if ( metaEnum.isValid() )
325+
{
326+
// read as string
327+
QByteArray ba = value( key, metaEnum.valueToKeys( defaultValue ) ).toString().toUtf8();
328+
const char *vs = ba.data();
329+
v = static_cast<T>( metaEnum.keysToValue( vs, &ok ) );
330+
}
331+
if ( !ok )
332+
{
333+
// if failed, try to read as int (old behavior)
334+
// this code shall be removed later (probably after QGIS 3.4 LTR for 3.6)
335+
// then the method could be marked as const
336+
v = T( value( key, static_cast<int>( defaultValue ), section ).toInt( &ok ) );
337+
if ( metaEnum.isValid() )
248338
{
249-
v = defaultValue;
339+
if ( !ok || !metaEnum.valueToKeys( static_cast<int>( v ) ).size() )
340+
{
341+
v = defaultValue;
342+
}
343+
else
344+
{
345+
// found setting as an integer
346+
// convert the setting to the new form (string)
347+
setFlagValue( key, v, section );
348+
}
250349
}
251350
}
351+
252352
return v;
253353
}
354+
355+
/**
356+
* Set the value of a setting based on a flaf.
357+
* The setting will be saved as string.
358+
* \note The flag needs to be declared with Q_FLAG (not Q_FLAGS).
359+
* \see flagValue
360+
* \see setEnumValue
361+
*/
362+
template <class T>
363+
void setFlagValue( const QString &key, const T &value,
364+
const Section section = NoSection )
365+
{
366+
QMetaEnum metaEnum = QMetaEnum::fromType<T>();
367+
Q_ASSERT( metaEnum.isValid() );
368+
if ( metaEnum.isValid() )
369+
{
370+
setValue( key, metaEnum.valueToKeys( value ), section );
371+
}
372+
else
373+
{
374+
QgsDebugMsg( "Invalid metaenum. Enum probably misses Q_ENUM or Q_FLAG declaration." );
375+
}
376+
}
254377
#endif
255378

256379
/**

‎src/core/qgssnappingconfig.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,7 @@ bool QgsSnappingConfig::addLayers( const QList<QgsMapLayer *> &layers )
368368
{
369369
bool changed = false;
370370
bool enabled = QgsSettings().value( QStringLiteral( "/qgis/digitizing/default_snap_enabled" ), true ).toBool();
371-
SnappingType type = ( SnappingType )QgsSettings().value( QStringLiteral( "/qgis/digitizing/default_snap_type" ), Vertex ).toInt();
371+
SnappingType type = QgsSettings().enumValue( QStringLiteral( "/qgis/digitizing/default_snap_type" ), Vertex );
372372
double tolerance = QgsSettings().value( QStringLiteral( "/qgis/digitizing/default_snapping_tolerance" ), Qgis::DEFAULT_SNAP_TOLERANCE ).toDouble();
373373
QgsTolerance::UnitType units = QgsSettings().enumValue( QStringLiteral( "/qgis/digitizing/default_snapping_tolerance_unit" ), Qgis::DEFAULT_SNAP_UNITS );
374374

‎src/core/qgsvectorlayer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ QgsVectorLayer::QgsVectorLayer( const QString &vectorLayerPath,
165165

166166
// Default simplify drawing settings
167167
QgsSettings settings;
168-
mSimplifyMethod.setSimplifyHints( settings.enumValue( QStringLiteral( "qgis/simplifyDrawingHints" ), mSimplifyMethod.simplifyHints(), QgsSettings::NoSection, true ) );
168+
mSimplifyMethod.setSimplifyHints( settings.flagValue( QStringLiteral( "qgis/simplifyDrawingHints" ), mSimplifyMethod.simplifyHints(), QgsSettings::NoSection ) );
169169
mSimplifyMethod.setSimplifyAlgorithm( settings.enumValue( QStringLiteral( "qgis/simplifyAlgorithm" ), mSimplifyMethod.simplifyAlgorithm() ) );
170170
mSimplifyMethod.setThreshold( settings.value( QStringLiteral( "qgis/simplifyDrawingTol" ), mSimplifyMethod.threshold() ).toFloat() );
171171
mSimplifyMethod.setForceLocalOptimization( settings.value( QStringLiteral( "qgis/simplifyLocal" ), mSimplifyMethod.forceLocalOptimization() ).toBool() );

‎src/gui/layout/qgslayoutviewtooladditem.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ void QgsLayoutViewToolAddItem::layoutReleaseEvent( QgsLayoutViewMouseEvent *even
135135
QgsSettings settings;
136136
settings.setValue( QStringLiteral( "LayoutDesigner/lastItemWidth" ), item->sizeWithUnits().width() );
137137
settings.setValue( QStringLiteral( "LayoutDesigner/lastItemHeight" ), item->sizeWithUnits().height() );
138-
settings.setValue( QStringLiteral( "LayoutDesigner/lastSizeUnit" ), static_cast< int >( item->sizeWithUnits().units() ) );
138+
settings.setEnumValue( QStringLiteral( "LayoutDesigner/lastSizeUnit" ), item->sizeWithUnits().units() );
139139

140140
QgsGui::layoutItemGuiRegistry()->newItemAddedToLayout( mItemMetadataId, item );
141141

‎src/gui/qgscolorwidgets.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1509,7 +1509,7 @@ void QgsColorTextWidget::showMenu()
15091509

15101510
//save format setting
15111511
QgsSettings settings;
1512-
settings.setValue( QStringLiteral( "ColorWidgets/textWidgetFormat" ), ( int )mFormat );
1512+
settings.setEnumValue( QStringLiteral( "ColorWidgets/textWidgetFormat" ), mFormat );
15131513

15141514
updateText();
15151515
}

‎src/providers/grass/qgsgrassoptions.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,8 @@ void QgsGrassOptions::saveOptions()
155155
QgsGrass::instance()->setModulesDebug( mModulesDebugCheckBox->isChecked() );
156156

157157
// Browser
158-
settings.setValue( mImportSettingsPath + "/crsTransform",
159-
mCrsTransformationComboBox->currentData().toInt() );
158+
settings.setEnumValue( mImportSettingsPath + "/crsTransform",
159+
( QgsRasterProjector::Precision )mCrsTransformationComboBox->currentData().toInt() );
160160

161161
settings.setValue( mImportSettingsPath + "/external", mImportExternalCheckBox->isChecked() );
162162

‎src/providers/postgres/qgspostgresconn.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1742,7 +1742,7 @@ QgsDataSourceUri QgsPostgresConn::connUri( const QString &connName )
17421742
QString database = settings.value( key + "/database" ).toString();
17431743

17441744
bool useEstimatedMetadata = settings.value( key + "/estimatedMetadata", false ).toBool();
1745-
int sslmode = settings.value( key + "/sslmode", QgsDataSourceUri::SslPrefer ).toInt();
1745+
QgsDataSourceUri::SslMode sslmode = settings.enumValue( key + "/sslmode", QgsDataSourceUri::SslPrefer );
17461746

17471747
QString username;
17481748
QString password;
@@ -1778,11 +1778,11 @@ QgsDataSourceUri QgsPostgresConn::connUri( const QString &connName )
17781778
QgsDataSourceUri uri;
17791779
if ( !service.isEmpty() )
17801780
{
1781-
uri.setConnection( service, database, username, password, ( QgsDataSourceUri::SslMode ) sslmode, authcfg );
1781+
uri.setConnection( service, database, username, password, sslmode, authcfg );
17821782
}
17831783
else
17841784
{
1785-
uri.setConnection( host, port, database, username, password, ( QgsDataSourceUri::SslMode ) sslmode, authcfg );
1785+
uri.setConnection( host, port, database, username, password, sslmode, authcfg );
17861786
}
17871787
uri.setUseEstimatedMetadata( useEstimatedMetadata );
17881788

‎tests/src/app/testqgisappclipboard.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,12 +140,12 @@ void TestQgisAppClipboard::copyToText()
140140

141141
// attributes only
142142
QgsSettings settings;
143-
settings.setValue( QStringLiteral( "/qgis/copyFeatureFormat" ), QgsClipboard::AttributesOnly );
143+
settings.setEnumValue( QStringLiteral( "/qgis/copyFeatureFormat" ), QgsClipboard::AttributesOnly );
144144
QString result = mQgisApp->clipboard()->generateClipboardText();
145145
QCOMPARE( result, QString( "int_field\tstring_field\n9\tval\n19\tval2" ) );
146146

147147
// attributes with WKT
148-
settings.setValue( QStringLiteral( "/qgis/copyFeatureFormat" ), QgsClipboard::AttributesWithWKT );
148+
settings.setEnumValue( QStringLiteral( "/qgis/copyFeatureFormat" ), QgsClipboard::AttributesWithWKT );
149149
result = mQgisApp->clipboard()->generateClipboardText();
150150
QCOMPARE( result, QString( "wkt_geom\tint_field\tstring_field\nPoint (5 6)\t9\tval\nPoint (7 8)\t19\tval2" ) );
151151

@@ -155,7 +155,7 @@ void TestQgisAppClipboard::copyToText()
155155
QCOMPARE( result, QString( "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"><html><head><meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\"/></head><body><table border=\"1\"><tr><td>wkt_geom</td><td>int_field</td><td>string_field</td></tr><tr><td>Point (5 6)</td><td>9</td><td>val</td></tr><tr><td>Point (7 8)</td><td>19</td><td>val2</td></tr></table></body></html>" ) );
156156

157157
// GeoJSON
158-
settings.setValue( QStringLiteral( "/qgis/copyFeatureFormat" ), QgsClipboard::GeoJSON );
158+
settings.setEnumValue( QStringLiteral( "/qgis/copyFeatureFormat" ), QgsClipboard::GeoJSON );
159159
result = mQgisApp->clipboard()->generateClipboardText();
160160
QString expected = "{ \"type\": \"FeatureCollection\",\n \"features\":[\n"
161161
"{\n \"type\":\"Feature\",\n"

‎tests/src/core/testqgssettings.cpp

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class TestQgsSettings : public QObject
3131

3232
private slots:
3333
void enumValue();
34+
void flagValue();
3435
};
3536

3637

@@ -40,6 +41,7 @@ void TestQgsSettings::enumValue()
4041

4142
// assign to inexisting value
4243
settings.setValue( QStringLiteral( "qgis/testing/my_value_for_units" ), -1 );
44+
settings.setValue( QStringLiteral( "qgis/testing/my_value_for_units_as_string" ), QStringLiteral( "myString" ) );
4345
// just to be sure it really doesn't exist
4446
QVERIFY( static_cast<int>( QgsUnitTypes::LayoutMeters ) != -1 );
4547

@@ -50,22 +52,42 @@ void TestQgsSettings::enumValue()
5052
// enum method returns default value if current setting is incorrect
5153
QgsUnitTypes::LayoutUnit v2 = settings.enumValue( QStringLiteral( "qgis/testing/my_value_for_units" ), QgsUnitTypes::LayoutMeters );
5254
QCOMPARE( v2, QgsUnitTypes::LayoutMeters );
55+
QgsUnitTypes::LayoutUnit v2s = settings.enumValue( QStringLiteral( "qgis/testing/my_value_for_units_as_string" ), QgsUnitTypes::LayoutMeters );
56+
QCOMPARE( v2s, QgsUnitTypes::LayoutMeters );
5357

5458
// test a different value than default
5559
settings.setValue( QStringLiteral( "qgis/testing/my_value_for_units" ), QgsUnitTypes::LayoutCentimeters );
5660
QgsUnitTypes::LayoutUnit v3 = settings.enumValue( QStringLiteral( "qgis/testing/my_value_for_units" ), QgsUnitTypes::LayoutMeters );
5761
QCOMPARE( v3, QgsUnitTypes::LayoutCentimeters );
62+
settings.setEnumValue( QStringLiteral( "qgis/testing/my_value_for_units" ), QgsUnitTypes::LayoutCentimeters );
63+
// auto conversion of old settings (int to str)
64+
QCOMPARE( settings.value( "qgis/testing/my_value_for_units" ).toString(), QStringLiteral( "LayoutCentimeters" ) );
65+
QgsUnitTypes::LayoutUnit v3s = settings.enumValue( QStringLiteral( "qgis/testing/my_value_for_units" ), QgsUnitTypes::LayoutMeters );
66+
QCOMPARE( v3s, QgsUnitTypes::LayoutCentimeters );
67+
QString v3ss = settings.value( QStringLiteral( "qgis/testing/my_value_for_units" ), QStringLiteral( "myDummyValue" ) ).toString();
68+
QCOMPARE( v3ss, QStringLiteral( "LayoutCentimeters" ) );
69+
}
5870

59-
// test for flags
71+
void TestQgsSettings::flagValue()
72+
{
73+
QgsSettings settings;
6074
QgsMapLayerProxyModel::Filters pointAndLine = QgsMapLayerProxyModel::Filters( QgsMapLayerProxyModel::PointLayer | QgsMapLayerProxyModel::LineLayer );
6175
QgsMapLayerProxyModel::Filters pointAndPolygon = QgsMapLayerProxyModel::Filters( QgsMapLayerProxyModel::PointLayer | QgsMapLayerProxyModel::PolygonLayer );
6276
settings.setValue( QStringLiteral( "qgis/testing/my_value_for_a_flag" ), 1e8 ); // invalid
6377
QgsMapLayerProxyModel::Filters v4 = settings.enumValue( QStringLiteral( "qgis/testing/my_value_for_a_flag" ), pointAndLine );
6478
QCOMPARE( v4, pointAndLine );
6579

6680
settings.setValue( QStringLiteral( "qgis/testing/my_value_for_a_flag" ), static_cast<int>( pointAndPolygon ) );
67-
QgsMapLayerProxyModel::Filters v5 = settings.enumValue( QStringLiteral( "qgis/testing/my_value_for_a_flag" ), pointAndLine, QgsSettings::NoSection, true );
81+
QgsMapLayerProxyModel::Filters v5 = settings.flagValue( QStringLiteral( "qgis/testing/my_value_for_a_flag" ), pointAndLine, QgsSettings::NoSection );
6882
QCOMPARE( v5, pointAndPolygon );
83+
// auto conversion of old settings (int to str)
84+
QCOMPARE( settings.value( "qgis/testing/my_value_for_a_flag" ).toString(), QStringLiteral( "PointLayer|PolygonLayer" ) );
85+
86+
settings.setFlagValue( QStringLiteral( "qgis/testing/my_value_for_a_flag_as_string" ), pointAndPolygon, QgsSettings::NoSection );
87+
QgsMapLayerProxyModel::Filters v5s = settings.flagValue( QStringLiteral( "qgis/testing/my_value_for_a_flag_as_string" ), pointAndLine, QgsSettings::NoSection );
88+
QCOMPARE( v5s, pointAndPolygon );
89+
QString v5ss = settings.value( QStringLiteral( "qgis/testing/my_value_for_a_flag_as_string" ), QStringLiteral( "myDummyString" ), QgsSettings::NoSection ).toString();
90+
QCOMPARE( v5ss, QStringLiteral( "PointLayer|PolygonLayer" ) );
6991
}
7092

7193

0 commit comments

Comments
 (0)
Please sign in to comment.