[processing] Port CRS widget wrapper to c++ classes

This commit is contained in:
Nyall Dawson 2018-09-05 17:42:10 +10:00
parent d79d91160d
commit 06d37fced4
12 changed files with 181 additions and 24 deletions

View File

@ -105,7 +105,7 @@ If no factory is registered which handles the given ``parameter``, a None will b
QgsProcessingModelerParameterWidget *createModelerParameterWidget( QgsProcessingModelAlgorithm *model,
const QString &childId,
const QgsProcessingParameterDefinition *parameter, const QgsProcessingContext &context ) /Factory/;
const QgsProcessingParameterDefinition *parameter, QgsProcessingContext &context ) /Factory/;
%Docstring
Creates a new modeler parameter widget for the given ``parameter``. This widget allows
configuration of the parameter's value when used inside a Processing ``model``.

View File

@ -39,7 +39,7 @@ QgsGui.processingGuiRegistry()->createModelerParameterWidget().
QgsProcessingModelerParameterWidget( QgsProcessingModelAlgorithm *model,
const QString &childId,
const QgsProcessingParameterDefinition *parameter,
const QgsProcessingContext &context,
QgsProcessingContext &context,
QWidget *parent /TransferThis/ = 0 );
%Docstring
Constructor for QgsProcessingModelerParameterWidget, for the specified

View File

@ -73,7 +73,7 @@ Constructor for QgsAbstractProcessingParameterWidgetWrapper, for the specified
Returns the dialog type for which widgets and labels will be created by this wrapper.
%End
QWidget *createWrappedWidget( const QgsProcessingContext &context ) /Factory/;
QWidget *createWrappedWidget( QgsProcessingContext &context ) /Factory/;
%Docstring
Creates and return a new wrapped widget which allows customization of the parameter's value.
@ -118,7 +118,7 @@ Returns the current wrapped label, if any.
Returns the parameter definition associated with this wrapper.
%End
void setParameterValue( const QVariant &value, const QgsProcessingContext &context );
void setParameterValue( const QVariant &value, QgsProcessingContext &context );
%Docstring
Sets the current ``value`` for the parameter.
@ -178,7 +178,7 @@ widget itself).
.. seealso:: :py:func:`createWidget`
%End
virtual void setWidgetValue( const QVariant &value, const QgsProcessingContext &context ) = 0;
virtual void setWidgetValue( const QVariant &value, QgsProcessingContext &context ) = 0;
%Docstring
Sets the current ``value`` for the parameter to show in the widget.
@ -237,7 +237,7 @@ The ``type`` argument indicates the dialog type to create a wrapper for.
virtual QgsProcessingModelerParameterWidget *createModelerWidgetWrapper( QgsProcessingModelAlgorithm *model,
const QString &childId,
const QgsProcessingParameterDefinition *parameter,
const QgsProcessingContext &context );
QgsProcessingContext &context );
%Docstring
Creates a new modeler parameter widget for the given ``parameter``. This widget allows
configuration of the parameter's value when used inside a Processing ``model``.

View File

@ -28,6 +28,7 @@ QgsProcessingGuiRegistry::QgsProcessingGuiRegistry()
addAlgorithmConfigurationWidgetFactory( new QgsFilterAlgorithmConfigurationWidgetFactory() );
addParameterWidgetFactory( new QgsProcessingBooleanWidgetWrapper() );
addParameterWidgetFactory( new QgsProcessingCrsWidgetWrapper() );
addParameterWidgetFactory( new QgsProcessingStringWidgetWrapper() );
}
@ -101,7 +102,7 @@ QgsAbstractProcessingParameterWidgetWrapper *QgsProcessingGuiRegistry::createPar
return mParameterWidgetFactories.value( parameterType )->createWidgetWrapper( parameter, type );
}
QgsProcessingModelerParameterWidget *QgsProcessingGuiRegistry::createModelerParameterWidget( QgsProcessingModelAlgorithm *model, const QString &childId, const QgsProcessingParameterDefinition *parameter, const QgsProcessingContext &context )
QgsProcessingModelerParameterWidget *QgsProcessingGuiRegistry::createModelerParameterWidget( QgsProcessingModelAlgorithm *model, const QString &childId, const QgsProcessingParameterDefinition *parameter, QgsProcessingContext &context )
{
if ( !parameter )
return nullptr;

View File

@ -136,7 +136,7 @@ class GUI_EXPORT QgsProcessingGuiRegistry
*/
QgsProcessingModelerParameterWidget *createModelerParameterWidget( QgsProcessingModelAlgorithm *model,
const QString &childId,
const QgsProcessingParameterDefinition *parameter, const QgsProcessingContext &context ) SIP_FACTORY;
const QgsProcessingParameterDefinition *parameter, QgsProcessingContext &context ) SIP_FACTORY;
private:

View File

@ -31,7 +31,7 @@
QgsProcessingModelerParameterWidget::QgsProcessingModelerParameterWidget( QgsProcessingModelAlgorithm *model,
const QString &childId,
const QgsProcessingParameterDefinition *parameter, const QgsProcessingContext &context,
const QgsProcessingParameterDefinition *parameter, QgsProcessingContext &context,
QWidget *parent )
: QWidget( parent )
, mModel( model )

View File

@ -77,7 +77,7 @@ class GUI_EXPORT QgsProcessingModelerParameterWidget : public QWidget
QgsProcessingModelerParameterWidget( QgsProcessingModelAlgorithm *model,
const QString &childId,
const QgsProcessingParameterDefinition *parameter,
const QgsProcessingContext &context,
QgsProcessingContext &context,
QWidget *parent SIP_TRANSFERTHIS = nullptr );
~QgsProcessingModelerParameterWidget() override;
@ -150,7 +150,7 @@ class GUI_EXPORT QgsProcessingModelerParameterWidget : public QWidget
QgsProcessingModelAlgorithm *mModel = nullptr;
const QString mChildId;
const QgsProcessingParameterDefinition *mParameterDefinition = nullptr;
const QgsProcessingContext &mContext;
QgsProcessingContext &mContext;
QVariant mStaticValue;
QString mModelInputParameterName;

View File

@ -35,7 +35,7 @@ QgsProcessingGui::WidgetType QgsAbstractProcessingParameterWidgetWrapper::type()
return mType;
}
QWidget *QgsAbstractProcessingParameterWidgetWrapper::createWrappedWidget( const QgsProcessingContext &context )
QWidget *QgsAbstractProcessingParameterWidgetWrapper::createWrappedWidget( QgsProcessingContext &context )
{
if ( mWidget )
return mWidget;
@ -86,7 +86,7 @@ const QgsProcessingParameterDefinition *QgsAbstractProcessingParameterWidgetWrap
return mParameterDefinition;
}
void QgsAbstractProcessingParameterWidgetWrapper::setParameterValue( const QVariant &value, const QgsProcessingContext &context )
void QgsAbstractProcessingParameterWidgetWrapper::setParameterValue( const QVariant &value, QgsProcessingContext &context )
{
if ( mPropertyButton && value.canConvert< QgsProperty >() )
{
@ -207,7 +207,7 @@ void QgsAbstractProcessingParameterWidgetWrapper::setDynamicParentLayerParameter
}
}
QgsProcessingModelerParameterWidget *QgsProcessingParameterWidgetFactoryInterface::createModelerWidgetWrapper( QgsProcessingModelAlgorithm *model, const QString &childId, const QgsProcessingParameterDefinition *parameter, const QgsProcessingContext &context )
QgsProcessingModelerParameterWidget *QgsProcessingParameterWidgetFactoryInterface::createModelerWidgetWrapper( QgsProcessingModelAlgorithm *model, const QString &childId, const QgsProcessingParameterDefinition *parameter, QgsProcessingContext &context )
{
std::unique_ptr< QgsProcessingModelerParameterWidget > widget = qgis::make_unique< QgsProcessingModelerParameterWidget >( model, childId, parameter, context );
widget->populateSources( compatibleParameterTypes(), compatibleOutputTypes(), compatibleDataTypes() );

View File

@ -106,7 +106,7 @@ class GUI_EXPORT QgsAbstractProcessingParameterWidgetWrapper : public QObject
*
* \see createWrappedLabel()
*/
QWidget *createWrappedWidget( const QgsProcessingContext &context ) SIP_FACTORY;
QWidget *createWrappedWidget( QgsProcessingContext &context ) SIP_FACTORY;
/**
* Creates and returns a new label to accompany widgets created by the wrapper.
@ -147,7 +147,7 @@ class GUI_EXPORT QgsAbstractProcessingParameterWidgetWrapper : public QObject
*
* \see parameterValue()
*/
void setParameterValue( const QVariant &value, const QgsProcessingContext &context );
void setParameterValue( const QVariant &value, QgsProcessingContext &context );
/**
* Returns the current value of the parameter.
@ -209,7 +209,7 @@ class GUI_EXPORT QgsAbstractProcessingParameterWidgetWrapper : public QObject
*
* \see widgetValue()
*/
virtual void setWidgetValue( const QVariant &value, const QgsProcessingContext &context ) = 0;
virtual void setWidgetValue( const QVariant &value, QgsProcessingContext &context ) = 0;
/**
* Returns the current value of the parameter.
@ -293,7 +293,7 @@ class GUI_EXPORT QgsProcessingParameterWidgetFactoryInterface
virtual QgsProcessingModelerParameterWidget *createModelerWidgetWrapper( QgsProcessingModelAlgorithm *model,
const QString &childId,
const QgsProcessingParameterDefinition *parameter,
const QgsProcessingContext &context );
QgsProcessingContext &context );
protected:

View File

@ -18,6 +18,7 @@
#include "qgsprocessingwidgetwrapperimpl.h"
#include "qgsprocessingparameters.h"
#include "qgsprocessingoutputs.h"
#include "qgsprojectionselectionwidget.h"
#include <QLabel>
#include <QHBoxLayout>
#include <QCheckBox>
@ -85,7 +86,7 @@ QLabel *QgsProcessingBooleanWidgetWrapper::createLabel()
return QgsAbstractProcessingParameterWidgetWrapper::createLabel();
}
void QgsProcessingBooleanWidgetWrapper::setWidgetValue( const QVariant &value, const QgsProcessingContext &context )
void QgsProcessingBooleanWidgetWrapper::setWidgetValue( const QVariant &value, QgsProcessingContext &context )
{
switch ( type() )
{
@ -162,6 +163,127 @@ QgsAbstractProcessingParameterWidgetWrapper *QgsProcessingBooleanWidgetWrapper::
}
//
// QgsProcessingCrsWidgetWrapper
//
QgsProcessingCrsWidgetWrapper::QgsProcessingCrsWidgetWrapper( const QgsProcessingParameterDefinition *parameter, QgsProcessingGui::WidgetType type, QWidget *parent )
: QgsAbstractProcessingParameterWidgetWrapper( parameter, type, parent )
{
}
QWidget *QgsProcessingCrsWidgetWrapper::createWidget()
{
mProjectionSelectionWidget = new QgsProjectionSelectionWidget();
mProjectionSelectionWidget->setToolTip( parameterDefinition()->toolTip() );
if ( parameterDefinition()->flags() & QgsProcessingParameterDefinition::FlagOptional )
mProjectionSelectionWidget->setOptionVisible( QgsProjectionSelectionWidget::CrsNotSet, true );
else
mProjectionSelectionWidget->setOptionVisible( QgsProjectionSelectionWidget::CrsNotSet, false );
connect( mProjectionSelectionWidget, &QgsProjectionSelectionWidget::crsChanged, this, [ = ]
{
emit widgetValueHasChanged( this );
} );
switch ( type() )
{
case QgsProcessingGui::Standard:
case QgsProcessingGui::Batch:
{
return mProjectionSelectionWidget;
};
case QgsProcessingGui::Modeler:
{
QWidget *w = new QWidget();
w->setToolTip( parameterDefinition()->toolTip() );
QVBoxLayout *vl = new QVBoxLayout();
vl->setMargin( 0 );
vl->setContentsMargins( 0, 0, 0, 0 );
w->setLayout( vl );
mUseProjectCrsCheckBox = new QCheckBox( tr( "Use project CRS" ) );
mUseProjectCrsCheckBox->setToolTip( tr( "Always use the current project CRS when running the model" ) );
vl->addWidget( mUseProjectCrsCheckBox );
connect( mUseProjectCrsCheckBox, &QCheckBox::toggled, mProjectionSelectionWidget, &QgsProjectionSelectionWidget::setDisabled );
vl->addWidget( mProjectionSelectionWidget );
return w;
}
}
return nullptr;
}
void QgsProcessingCrsWidgetWrapper::setWidgetValue( const QVariant &value, QgsProcessingContext &context )
{
if ( mUseProjectCrsCheckBox )
{
if ( value.toString().compare( QLatin1String( "ProjectCrs" ), Qt::CaseInsensitive ) == 0 )
{
mUseProjectCrsCheckBox->setChecked( true );
return;
}
else
{
mUseProjectCrsCheckBox->setChecked( false );
}
}
const QgsCoordinateReferenceSystem v = QgsProcessingParameters::parameterAsCrs( parameterDefinition(), value, context );
if ( mProjectionSelectionWidget )
mProjectionSelectionWidget->setCrs( v );
}
QVariant QgsProcessingCrsWidgetWrapper::widgetValue() const
{
if ( mUseProjectCrsCheckBox && mUseProjectCrsCheckBox->isChecked() )
return QStringLiteral( "ProjectCrs" );
else if ( mProjectionSelectionWidget )
return mProjectionSelectionWidget->crs().isValid() ? mProjectionSelectionWidget->crs() : QVariant();
else
return QVariant();
}
QStringList QgsProcessingCrsWidgetWrapper::compatibleParameterTypes() const
{
return QStringList()
<< QgsProcessingParameterCrs::typeName()
<< QgsProcessingParameterExpression::typeName()
<< QgsProcessingParameterString::typeName()
<< QgsProcessingParameterRasterLayer::typeName()
<< QgsProcessingParameterVectorLayer::typeName()
<< QgsProcessingParameterFeatureSource::typeName();
}
QStringList QgsProcessingCrsWidgetWrapper::compatibleOutputTypes() const
{
return QStringList() << QgsProcessingOutputVectorLayer::typeName()
<< QgsProcessingOutputRasterLayer::typeName()
<< QgsProcessingOutputMapLayer::typeName()
<< QgsProcessingOutputString::typeName();
}
QList<int> QgsProcessingCrsWidgetWrapper::compatibleDataTypes() const
{
return QList< int >();
}
QString QgsProcessingCrsWidgetWrapper::parameterType() const
{
return QgsProcessingParameterCrs::typeName();
}
QgsAbstractProcessingParameterWidgetWrapper *QgsProcessingCrsWidgetWrapper::createWidgetWrapper( const QgsProcessingParameterDefinition *parameter, QgsProcessingGui::WidgetType type )
{
return new QgsProcessingCrsWidgetWrapper( parameter, type );
}
//
// QgsProcessingStringWidgetWrapper
@ -219,7 +341,7 @@ QWidget *QgsProcessingStringWidgetWrapper::createWidget()
return nullptr;
}
void QgsProcessingStringWidgetWrapper::setWidgetValue( const QVariant &value, const QgsProcessingContext &context )
void QgsProcessingStringWidgetWrapper::setWidgetValue( const QVariant &value, QgsProcessingContext &context )
{
const QString v = QgsProcessingParameters::parameterAsString( parameterDefinition(), value, context );
if ( mLineEdit )

View File

@ -26,7 +26,7 @@ class QCheckBox;
class QComboBox;
class QLineEdit;
class QPlainTextEdit;
class QgsProjectionSelectionWidget;
///@cond PRIVATE
@ -49,7 +49,7 @@ class GUI_EXPORT QgsProcessingBooleanWidgetWrapper : public QgsAbstractProcessin
protected:
void setWidgetValue( const QVariant &value, const QgsProcessingContext &context ) override;
void setWidgetValue( const QVariant &value, QgsProcessingContext &context ) override;
QVariant widgetValue() const override;
QStringList compatibleParameterTypes() const override;
@ -66,6 +66,40 @@ class GUI_EXPORT QgsProcessingBooleanWidgetWrapper : public QgsAbstractProcessin
friend class TestProcessingGui;
};
class GUI_EXPORT QgsProcessingCrsWidgetWrapper : public QgsAbstractProcessingParameterWidgetWrapper, public QgsProcessingParameterWidgetFactoryInterface
{
Q_OBJECT
public:
QgsProcessingCrsWidgetWrapper( const QgsProcessingParameterDefinition *parameter = nullptr,
QgsProcessingGui::WidgetType type = QgsProcessingGui::Standard, QWidget *parent = nullptr );
// QgsProcessingParameterWidgetFactoryInterface
QString parameterType() const override;
QgsAbstractProcessingParameterWidgetWrapper *createWidgetWrapper( const QgsProcessingParameterDefinition *parameter, QgsProcessingGui::WidgetType type ) override;
// QgsProcessingParameterWidgetWrapper interface
QWidget *createWidget() override SIP_FACTORY;
protected:
void setWidgetValue( const QVariant &value, QgsProcessingContext &context ) override;
QVariant widgetValue() const override;
QStringList compatibleParameterTypes() const override;
QStringList compatibleOutputTypes() const override;
QList< int > compatibleDataTypes() const override;
private:
QgsProjectionSelectionWidget *mProjectionSelectionWidget = nullptr;
QCheckBox *mUseProjectCrsCheckBox = nullptr;
friend class TestProcessingGui;
};
class GUI_EXPORT QgsProcessingStringWidgetWrapper : public QgsAbstractProcessingParameterWidgetWrapper, public QgsProcessingParameterWidgetFactoryInterface
{
@ -85,7 +119,7 @@ class GUI_EXPORT QgsProcessingStringWidgetWrapper : public QgsAbstractProcessing
protected:
void setWidgetValue( const QVariant &value, const QgsProcessingContext &context ) override;
void setWidgetValue( const QVariant &value, QgsProcessingContext &context ) override;
QVariant widgetValue() const override;
QStringList compatibleParameterTypes() const override;

View File

@ -79,7 +79,7 @@ class TestWidgetWrapper : public QgsAbstractProcessingParameterWidgetWrapper
return nullptr;
}
void setWidgetValue( const QVariant &, const QgsProcessingContext & ) override
void setWidgetValue( const QVariant &, QgsProcessingContext & ) override
{
}