Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[settings] proper fix for value with default override
correctly call convertToVariant
for enum/flag, save default value as enum and not QVariant
  • Loading branch information
3nids authored and nyalldawson committed Jan 31, 2023
1 parent 6efbcc5 commit ca6ea75
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 19 deletions.
20 changes: 4 additions & 16 deletions src/core/settings/qgssettingsentry.h
Expand Up @@ -407,19 +407,13 @@ class QgsSettingsEntryByReference : public QgsSettingsEntryBase
//! Returns the settings value with a \a defaultValueOverride and with an optional \a dynamicKeyPart
inline T valueWithDefaultOverride( const T &defaultValueOverride, const QString &dynamicKeyPart = QString() ) const
{
if ( this->exists( dynamicKeyPart ) )
return this->value( dynamicKeyPart );
else
return defaultValueOverride;
return this->convertFromVariant( valueAsVariantWithDefaultOverride( convertToVariant( defaultValueOverride ), dynamicKeyPart ) );
}

//! Returns the settings value with a \a defaultValueOverride for the \a dynamicKeyPartList
inline T valueWithDefaultOverride( const T &defaultValueOverride, const QStringList &dynamicKeyPartList ) const
{
if ( this->exists( dynamicKeyPartList ) )
return this->value( dynamicKeyPartList );
else
return defaultValueOverride;
return this->convertFromVariant( valueAsVariantWithDefaultOverride( convertToVariant( defaultValueOverride ), dynamicKeyPartList ) );
}

/**
Expand Down Expand Up @@ -575,19 +569,13 @@ class QgsSettingsEntryByValue : public QgsSettingsEntryBase
//! Returns the settings value with a \a defaultValueOverride and with an optional \a dynamicKeyPart
inline T valueWithDefaultOverride( T defaultValueOverride, const QString &dynamicKeyPart = QString() ) const
{
if ( this->exists( dynamicKeyPart ) )
return this->value( dynamicKeyPart );
else
return defaultValueOverride;
return this->convertFromVariant( valueAsVariantWithDefaultOverride( convertToVariant( defaultValueOverride ), dynamicKeyPart ) );
}

//! Returns the settings value with a \a defaultValueOverride for the \a dynamicKeyPartList
inline T valueWithDefaultOverride( T defaultValueOverride, const QStringList &dynamicKeyPartList ) const
{
if ( this->exists( dynamicKeyPartList ) )
return this->value( dynamicKeyPartList );
else
return defaultValueOverride;
return this->convertFromVariant( valueAsVariantWithDefaultOverride( convertToVariant( defaultValueOverride ), dynamicKeyPartList ) );
}

/**
Expand Down
11 changes: 10 additions & 1 deletion src/core/settings/qgssettingsentryenumflag.h
Expand Up @@ -74,7 +74,7 @@ class QgsSettingsEntryEnumFlag : public QgsSettingsEntryByValue<T>
QgsSettingsEntryEnumFlag( const QString &key, const QString &section, T defaultValue, const QString &description = QString(), Qgis::SettingsOptions options = Qgis::SettingsOptions() )
: QgsSettingsEntryByValue<T>( key,
section,
QMetaEnum::fromType<T>().isFlag() ? qgsFlagValueToKeys( defaultValue ) : qgsEnumValueToKey( defaultValue ),
QVariant::fromValue( defaultValue ),
description,
options )
{
Expand All @@ -84,6 +84,15 @@ class QgsSettingsEntryEnumFlag : public QgsSettingsEntryByValue<T>
QgsDebugMsg( QStringLiteral( "Invalid metaenum. Enum/Flag probably misses Q_ENUM/Q_FLAG declaration. Settings key: '%1'" ).arg( this->key() ) );
}

QVariant convertToVariant( T value ) const override
{
if ( mMetaEnum.isFlag() )
return qgsFlagValueToKeys( value );
else
return qgsEnumValueToKey( value );
}


/**
* Returns settings default value.
*/
Expand Down
10 changes: 8 additions & 2 deletions tests/src/core/testqgssettingsentry.cpp
Expand Up @@ -141,10 +141,16 @@ void TestQgsSettingsEntry::flagValue()
// Make sure the setting is not existing
QgsSettings().remove( settingsKey );

const QgsSettingsEntryEnumFlag settingsEntryFlag( settingsKey, mSettingsSection, pointAndLine, QStringLiteral( "Filters" ) );
const QgsSettingsEntryEnumFlag settingsEntryFlag( settingsKey, mSettingsSection, QgsMapLayerProxyModel::Filters(), QStringLiteral( "Filters" ) );

// Check default value
QCOMPARE( settingsEntryFlag.defaultValue(), pointAndLine );
QCOMPARE( settingsEntryFlag.defaultValue(), QgsMapLayerProxyModel::Filters() );

// check no value
QCOMPARE( settingsEntryFlag.exists(), false );
QCOMPARE( settingsEntryFlag.value(), QgsMapLayerProxyModel::Filters() );

QCOMPARE( settingsEntryFlag.valueWithDefaultOverride( pointAndLine ), pointAndLine );

// Check set value
{
Expand Down

0 comments on commit ca6ea75

Please sign in to comment.