[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, QgsProcessingModelerParameterWidget *createModelerParameterWidget( QgsProcessingModelAlgorithm *model,
const QString &childId, const QString &childId,
const QgsProcessingParameterDefinition *parameter, const QgsProcessingContext &context ) /Factory/; const QgsProcessingParameterDefinition *parameter, QgsProcessingContext &context ) /Factory/;
%Docstring %Docstring
Creates a new modeler parameter widget for the given ``parameter``. This widget allows 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``. configuration of the parameter's value when used inside a Processing ``model``.

View File

@ -39,7 +39,7 @@ QgsGui.processingGuiRegistry()->createModelerParameterWidget().
QgsProcessingModelerParameterWidget( QgsProcessingModelAlgorithm *model, QgsProcessingModelerParameterWidget( QgsProcessingModelAlgorithm *model,
const QString &childId, const QString &childId,
const QgsProcessingParameterDefinition *parameter, const QgsProcessingParameterDefinition *parameter,
const QgsProcessingContext &context, QgsProcessingContext &context,
QWidget *parent /TransferThis/ = 0 ); QWidget *parent /TransferThis/ = 0 );
%Docstring %Docstring
Constructor for QgsProcessingModelerParameterWidget, for the specified 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. Returns the dialog type for which widgets and labels will be created by this wrapper.
%End %End
QWidget *createWrappedWidget( const QgsProcessingContext &context ) /Factory/; QWidget *createWrappedWidget( QgsProcessingContext &context ) /Factory/;
%Docstring %Docstring
Creates and return a new wrapped widget which allows customization of the parameter's value. 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. Returns the parameter definition associated with this wrapper.
%End %End
void setParameterValue( const QVariant &value, const QgsProcessingContext &context ); void setParameterValue( const QVariant &value, QgsProcessingContext &context );
%Docstring %Docstring
Sets the current ``value`` for the parameter. Sets the current ``value`` for the parameter.
@ -178,7 +178,7 @@ widget itself).
.. seealso:: :py:func:`createWidget` .. seealso:: :py:func:`createWidget`
%End %End
virtual void setWidgetValue( const QVariant &value, const QgsProcessingContext &context ) = 0; virtual void setWidgetValue( const QVariant &value, QgsProcessingContext &context ) = 0;
%Docstring %Docstring
Sets the current ``value`` for the parameter to show in the widget. 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, virtual QgsProcessingModelerParameterWidget *createModelerWidgetWrapper( QgsProcessingModelAlgorithm *model,
const QString &childId, const QString &childId,
const QgsProcessingParameterDefinition *parameter, const QgsProcessingParameterDefinition *parameter,
const QgsProcessingContext &context ); QgsProcessingContext &context );
%Docstring %Docstring
Creates a new modeler parameter widget for the given ``parameter``. This widget allows 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``. configuration of the parameter's value when used inside a Processing ``model``.

View File

@ -28,6 +28,7 @@ QgsProcessingGuiRegistry::QgsProcessingGuiRegistry()
addAlgorithmConfigurationWidgetFactory( new QgsFilterAlgorithmConfigurationWidgetFactory() ); addAlgorithmConfigurationWidgetFactory( new QgsFilterAlgorithmConfigurationWidgetFactory() );
addParameterWidgetFactory( new QgsProcessingBooleanWidgetWrapper() ); addParameterWidgetFactory( new QgsProcessingBooleanWidgetWrapper() );
addParameterWidgetFactory( new QgsProcessingCrsWidgetWrapper() );
addParameterWidgetFactory( new QgsProcessingStringWidgetWrapper() ); addParameterWidgetFactory( new QgsProcessingStringWidgetWrapper() );
} }
@ -101,7 +102,7 @@ QgsAbstractProcessingParameterWidgetWrapper *QgsProcessingGuiRegistry::createPar
return mParameterWidgetFactories.value( parameterType )->createWidgetWrapper( parameter, type ); 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 ) if ( !parameter )
return nullptr; return nullptr;

View File

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

View File

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

View File

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

View File

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

View File

@ -106,7 +106,7 @@ class GUI_EXPORT QgsAbstractProcessingParameterWidgetWrapper : public QObject
* *
* \see createWrappedLabel() * \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. * 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() * \see parameterValue()
*/ */
void setParameterValue( const QVariant &value, const QgsProcessingContext &context ); void setParameterValue( const QVariant &value, QgsProcessingContext &context );
/** /**
* Returns the current value of the parameter. * Returns the current value of the parameter.
@ -209,7 +209,7 @@ class GUI_EXPORT QgsAbstractProcessingParameterWidgetWrapper : public QObject
* *
* \see widgetValue() * \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. * Returns the current value of the parameter.
@ -293,7 +293,7 @@ class GUI_EXPORT QgsProcessingParameterWidgetFactoryInterface
virtual QgsProcessingModelerParameterWidget *createModelerWidgetWrapper( QgsProcessingModelAlgorithm *model, virtual QgsProcessingModelerParameterWidget *createModelerWidgetWrapper( QgsProcessingModelAlgorithm *model,
const QString &childId, const QString &childId,
const QgsProcessingParameterDefinition *parameter, const QgsProcessingParameterDefinition *parameter,
const QgsProcessingContext &context ); QgsProcessingContext &context );
protected: protected:

View File

@ -18,6 +18,7 @@
#include "qgsprocessingwidgetwrapperimpl.h" #include "qgsprocessingwidgetwrapperimpl.h"
#include "qgsprocessingparameters.h" #include "qgsprocessingparameters.h"
#include "qgsprocessingoutputs.h" #include "qgsprocessingoutputs.h"
#include "qgsprojectionselectionwidget.h"
#include <QLabel> #include <QLabel>
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QCheckBox> #include <QCheckBox>
@ -85,7 +86,7 @@ QLabel *QgsProcessingBooleanWidgetWrapper::createLabel()
return QgsAbstractProcessingParameterWidgetWrapper::createLabel(); return QgsAbstractProcessingParameterWidgetWrapper::createLabel();
} }
void QgsProcessingBooleanWidgetWrapper::setWidgetValue( const QVariant &value, const QgsProcessingContext &context ) void QgsProcessingBooleanWidgetWrapper::setWidgetValue( const QVariant &value, QgsProcessingContext &context )
{ {
switch ( type() ) 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 // QgsProcessingStringWidgetWrapper
@ -219,7 +341,7 @@ QWidget *QgsProcessingStringWidgetWrapper::createWidget()
return nullptr; 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 ); const QString v = QgsProcessingParameters::parameterAsString( parameterDefinition(), value, context );
if ( mLineEdit ) if ( mLineEdit )

View File

@ -26,7 +26,7 @@ class QCheckBox;
class QComboBox; class QComboBox;
class QLineEdit; class QLineEdit;
class QPlainTextEdit; class QPlainTextEdit;
class QgsProjectionSelectionWidget;
///@cond PRIVATE ///@cond PRIVATE
@ -49,7 +49,7 @@ class GUI_EXPORT QgsProcessingBooleanWidgetWrapper : public QgsAbstractProcessin
protected: protected:
void setWidgetValue( const QVariant &value, const QgsProcessingContext &context ) override; void setWidgetValue( const QVariant &value, QgsProcessingContext &context ) override;
QVariant widgetValue() const override; QVariant widgetValue() const override;
QStringList compatibleParameterTypes() const override; QStringList compatibleParameterTypes() const override;
@ -66,6 +66,40 @@ class GUI_EXPORT QgsProcessingBooleanWidgetWrapper : public QgsAbstractProcessin
friend class TestProcessingGui; 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 class GUI_EXPORT QgsProcessingStringWidgetWrapper : public QgsAbstractProcessingParameterWidgetWrapper, public QgsProcessingParameterWidgetFactoryInterface
{ {
@ -85,7 +119,7 @@ class GUI_EXPORT QgsProcessingStringWidgetWrapper : public QgsAbstractProcessing
protected: protected:
void setWidgetValue( const QVariant &value, const QgsProcessingContext &context ) override; void setWidgetValue( const QVariant &value, QgsProcessingContext &context ) override;
QVariant widgetValue() const override; QVariant widgetValue() const override;
QStringList compatibleParameterTypes() const override; QStringList compatibleParameterTypes() const override;

View File

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