From 5e6e75662f2c5959bfe2fc6bbe1760cfbc1fc8bb Mon Sep 17 00:00:00 2001 From: David Signer Date: Mon, 16 Dec 2019 17:26:26 +0100 Subject: [PATCH] available values in value relations --- .../qgsvaluerelationfieldformatter.sip.in | 3 +++ .../qgsvaluerelationfieldformatter.cpp | 18 ++++++++++++++++++ .../qgsvaluerelationfieldformatter.h | 4 +++- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/python/core/auto_generated/fieldformatter/qgsvaluerelationfieldformatter.sip.in b/python/core/auto_generated/fieldformatter/qgsvaluerelationfieldformatter.sip.in index e4a5d9e8591..6085b54fe24 100644 --- a/python/core/auto_generated/fieldformatter/qgsvaluerelationfieldformatter.sip.in +++ b/python/core/auto_generated/fieldformatter/qgsvaluerelationfieldformatter.sip.in @@ -128,6 +128,9 @@ Returns the (possibly NULL) layer from the widget's ``config`` and ``project`` .. versionadded:: 3.8 %End + + virtual QList availableValues( const QVariantMap &config, int countLimit ) const; + }; diff --git a/src/core/fieldformatter/qgsvaluerelationfieldformatter.cpp b/src/core/fieldformatter/qgsvaluerelationfieldformatter.cpp index eecf9b54de9..4faa20503d7 100644 --- a/src/core/fieldformatter/qgsvaluerelationfieldformatter.cpp +++ b/src/core/fieldformatter/qgsvaluerelationfieldformatter.cpp @@ -40,6 +40,11 @@ bool orderByValueLessThan( const QgsValueRelationFieldFormatter::ValueRelationIt return qgsVariantLessThan( p1.value, p2.value ); } +QgsValueRelationFieldFormatter::QgsValueRelationFieldFormatter() +{ + setFlags( flags() | QgsFieldFormatter::CanProvideAvailableValues ); +} + QString QgsValueRelationFieldFormatter::id() const { return QStringLiteral( "ValueRelation" ); @@ -183,6 +188,19 @@ QList QgsValueRelationFieldFormatter::layerDependencies( cons return result; } +QList QgsValueRelationFieldFormatter::availableValues( const QVariantMap &config, int countLimit ) const +{ + QList values; + + const QgsVectorLayer *referencedLayer = qobject_cast( QgsProject::instance()->mapLayer( config[QStringLiteral( "Layer" )].toString() ) ); + if ( referencedLayer ) + { + int fieldIndex = referencedLayer->fields().indexOf( config.value( QStringLiteral( "Key" ) ).toString() ); + values = referencedLayer->uniqueValues( fieldIndex, countLimit ).toList(); + } + return values; +} + QStringList QgsValueRelationFieldFormatter::valueToStringList( const QVariant &value ) { QStringList checkList; diff --git a/src/core/fieldformatter/qgsvaluerelationfieldformatter.h b/src/core/fieldformatter/qgsvaluerelationfieldformatter.h index db799ded4cf..d3454d45c8f 100644 --- a/src/core/fieldformatter/qgsvaluerelationfieldformatter.h +++ b/src/core/fieldformatter/qgsvaluerelationfieldformatter.h @@ -56,7 +56,7 @@ class CORE_EXPORT QgsValueRelationFieldFormatter : public QgsFieldFormatter /** * Constructor for QgsValueRelationFieldFormatter. */ - QgsValueRelationFieldFormatter() = default; + QgsValueRelationFieldFormatter(); QString id() const override; QString representValue( QgsVectorLayer *layer, int fieldIndex, const QVariantMap &config, const QVariant &cache, const QVariant &value ) const override; @@ -126,6 +126,8 @@ class CORE_EXPORT QgsValueRelationFieldFormatter : public QgsFieldFormatter static QgsVectorLayer *resolveLayer( const QVariantMap &config, const QgsProject *project ); QList layerDependencies( const QVariantMap &config ) const override SIP_SKIP; + + QList availableValues( const QVariantMap &config, int countLimit ) const override; }; Q_DECLARE_METATYPE( QgsValueRelationFieldFormatter::ValueRelationCache )