Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[processing] Fix incorrect parameter definition used when evaluating
parent layer parameter in the gui for dynamic properties data defined
buttons

(cherry picked from commit d3bd137)
  • Loading branch information
nyalldawson committed Feb 12, 2019
1 parent a2b5ee9 commit 72d6cbf
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 10 deletions.
8 changes: 4 additions & 4 deletions src/gui/processing/qgsprocessingwidgetwrapper.cpp
Expand Up @@ -200,7 +200,7 @@ void QgsAbstractProcessingParameterWidgetWrapper::postInitialize( const QList<Qg
{
if ( wrapper->parameterDefinition()->name() == parameterDefinition()->dynamicLayerParameterName() )
{
setDynamicParentLayerParameter( wrapper->parameterValue() );
setDynamicParentLayerParameter( wrapper );
connect( wrapper, &QgsAbstractProcessingParameterWidgetWrapper::widgetValueHasChanged, this, &QgsAbstractProcessingParameterWidgetWrapper::parentLayerChanged );
break;
}
Expand Down Expand Up @@ -259,11 +259,11 @@ void QgsAbstractProcessingParameterWidgetWrapper::parentLayerChanged( QgsAbstrac
{
if ( wrapper )
{
setDynamicParentLayerParameter( wrapper->parameterValue() );
setDynamicParentLayerParameter( wrapper );
}
}

void QgsAbstractProcessingParameterWidgetWrapper::setDynamicParentLayerParameter( const QVariant &value )
void QgsAbstractProcessingParameterWidgetWrapper::setDynamicParentLayerParameter( const QgsAbstractProcessingParameterWidgetWrapper *parentWrapper )
{
if ( mPropertyButton )
{
Expand All @@ -279,7 +279,7 @@ void QgsAbstractProcessingParameterWidgetWrapper::setDynamicParentLayerParameter
context = tmpContext.get();
}

QgsVectorLayer *layer = QgsProcessingParameters::parameterAsVectorLayer( parameterDefinition(), value, *context );
QgsVectorLayer *layer = QgsProcessingParameters::parameterAsVectorLayer( parentWrapper->parameterDefinition(), parentWrapper->parameterValue(), *context );
if ( !layer )
{
mPropertyButton->setVectorLayer( nullptr );
Expand Down
2 changes: 1 addition & 1 deletion src/gui/processing/qgsprocessingwidgetwrapper.h
Expand Up @@ -334,7 +334,7 @@ class GUI_EXPORT QgsAbstractProcessingParameterWidgetWrapper : public QObject, p
QgsProcessingGui::WidgetType mType = QgsProcessingGui::Standard;
const QgsProcessingParameterDefinition *mParameterDefinition = nullptr;

void setDynamicParentLayerParameter( const QVariant &value );
void setDynamicParentLayerParameter( const QgsAbstractProcessingParameterWidgetWrapper *parentWrapper );

QPointer< QWidget > mWidget;
QPointer< QgsPropertyOverrideButton > mPropertyButton;
Expand Down
31 changes: 26 additions & 5 deletions tests/src/gui/testprocessinggui.cpp
Expand Up @@ -346,6 +346,20 @@ class TestProcessingContextGenerator : public QgsProcessingContextGenerator
QgsProcessingContext &mContext;
};


class TestLayerWrapper : public QgsAbstractProcessingParameterWidgetWrapper
{
public:
TestLayerWrapper( const QgsProcessingParameterDefinition *parameter = nullptr )
: QgsAbstractProcessingParameterWidgetWrapper( parameter )
{}
QWidget *createWidget() override { return nullptr; }
void setWidgetValue( const QVariant &val, QgsProcessingContext & ) override { v = val;}
QVariant widgetValue() const override { return v; }

QVariant v;
};

void TestProcessingGui::testWrapperDynamic()
{
const QgsProcessingAlgorithm *centroidAlg = QgsApplication::processingRegistry()->algorithmById( QStringLiteral( "native:centroids" ) );
Expand Down Expand Up @@ -379,15 +393,20 @@ void TestProcessingGui::testWrapperDynamic()
QgsVectorLayer *vl = new QgsVectorLayer( QStringLiteral( "LineString" ), QStringLiteral( "x" ), QStringLiteral( "memory" ) );
p.addMapLayer( vl );

TestLayerWrapper layerWrapper( layerDef );

QVERIFY( !allPartsWrapper.mPropertyButton->vectorLayer() );
allPartsWrapper.setDynamicParentLayerParameter( QVariant::fromValue( vl ) );
layerWrapper.setWidgetValue( QVariant::fromValue( vl ), context );
allPartsWrapper.setDynamicParentLayerParameter( &layerWrapper );
QCOMPARE( allPartsWrapper.mPropertyButton->vectorLayer(), vl );
// should not be owned by wrapper
QVERIFY( !allPartsWrapper.mDynamicLayer.get() );
allPartsWrapper.setDynamicParentLayerParameter( QVariant() );
layerWrapper.setWidgetValue( QVariant(), context );
allPartsWrapper.setDynamicParentLayerParameter( &layerWrapper );
QVERIFY( !allPartsWrapper.mPropertyButton->vectorLayer() );

allPartsWrapper.setDynamicParentLayerParameter( vl->id() );
layerWrapper.setWidgetValue( vl->id(), context );
allPartsWrapper.setDynamicParentLayerParameter( &layerWrapper );
QVERIFY( !allPartsWrapper.mPropertyButton->vectorLayer() );
QVERIFY( !allPartsWrapper.mDynamicLayer.get() );

Expand All @@ -396,13 +415,15 @@ void TestProcessingGui::testWrapperDynamic()
TestProcessingContextGenerator generator( context );
allPartsWrapper.registerProcessingContextGenerator( &generator );

allPartsWrapper.setDynamicParentLayerParameter( vl->id() );
layerWrapper.setWidgetValue( vl->id(), context );
allPartsWrapper.setDynamicParentLayerParameter( &layerWrapper );
QCOMPARE( allPartsWrapper.mPropertyButton->vectorLayer(), vl );
QVERIFY( !allPartsWrapper.mDynamicLayer.get() );

// non-project layer
QString pointFileName = TEST_DATA_DIR + QStringLiteral( "/points.shp" );
allPartsWrapper.setDynamicParentLayerParameter( pointFileName );
layerWrapper.setWidgetValue( pointFileName, context );
allPartsWrapper.setDynamicParentLayerParameter( &layerWrapper );
QCOMPARE( allPartsWrapper.mPropertyButton->vectorLayer()->publicSource(), pointFileName );
// must be owned by wrapper, or layer may be deleted while still required by wrapper
QCOMPARE( allPartsWrapper.mDynamicLayer->publicSource(), pointFileName );
Expand Down

0 comments on commit 72d6cbf

Please sign in to comment.