Skip to content

Commit 06d37fc

Browse files
committedSep 6, 2018
[processing] Port CRS widget wrapper to c++ classes
1 parent d79d911 commit 06d37fc

12 files changed

+181
-24
lines changed
 

‎python/gui/auto_generated/processing/qgsprocessingguiregistry.sip.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ If no factory is registered which handles the given ``parameter``, a None will b
105105

106106
QgsProcessingModelerParameterWidget *createModelerParameterWidget( QgsProcessingModelAlgorithm *model,
107107
const QString &childId,
108-
const QgsProcessingParameterDefinition *parameter, const QgsProcessingContext &context ) /Factory/;
108+
const QgsProcessingParameterDefinition *parameter, QgsProcessingContext &context ) /Factory/;
109109
%Docstring
110110
Creates a new modeler parameter widget for the given ``parameter``. This widget allows
111111
configuration of the parameter's value when used inside a Processing ``model``.

‎python/gui/auto_generated/processing/qgsprocessingmodelerparameterwidget.sip.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ QgsGui.processingGuiRegistry()->createModelerParameterWidget().
3939
QgsProcessingModelerParameterWidget( QgsProcessingModelAlgorithm *model,
4040
const QString &childId,
4141
const QgsProcessingParameterDefinition *parameter,
42-
const QgsProcessingContext &context,
42+
QgsProcessingContext &context,
4343
QWidget *parent /TransferThis/ = 0 );
4444
%Docstring
4545
Constructor for QgsProcessingModelerParameterWidget, for the specified

‎python/gui/auto_generated/processing/qgsprocessingwidgetwrapper.sip.in

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ Constructor for QgsAbstractProcessingParameterWidgetWrapper, for the specified
7373
Returns the dialog type for which widgets and labels will be created by this wrapper.
7474
%End
7575

76-
QWidget *createWrappedWidget( const QgsProcessingContext &context ) /Factory/;
76+
QWidget *createWrappedWidget( QgsProcessingContext &context ) /Factory/;
7777
%Docstring
7878
Creates and return a new wrapped widget which allows customization of the parameter's value.
7979

@@ -118,7 +118,7 @@ Returns the current wrapped label, if any.
118118
Returns the parameter definition associated with this wrapper.
119119
%End
120120

121-
void setParameterValue( const QVariant &value, const QgsProcessingContext &context );
121+
void setParameterValue( const QVariant &value, QgsProcessingContext &context );
122122
%Docstring
123123
Sets the current ``value`` for the parameter.
124124

@@ -178,7 +178,7 @@ widget itself).
178178
.. seealso:: :py:func:`createWidget`
179179
%End
180180

181-
virtual void setWidgetValue( const QVariant &value, const QgsProcessingContext &context ) = 0;
181+
virtual void setWidgetValue( const QVariant &value, QgsProcessingContext &context ) = 0;
182182
%Docstring
183183
Sets the current ``value`` for the parameter to show in the widget.
184184

@@ -237,7 +237,7 @@ The ``type`` argument indicates the dialog type to create a wrapper for.
237237
virtual QgsProcessingModelerParameterWidget *createModelerWidgetWrapper( QgsProcessingModelAlgorithm *model,
238238
const QString &childId,
239239
const QgsProcessingParameterDefinition *parameter,
240-
const QgsProcessingContext &context );
240+
QgsProcessingContext &context );
241241
%Docstring
242242
Creates a new modeler parameter widget for the given ``parameter``. This widget allows
243243
configuration of the parameter's value when used inside a Processing ``model``.

‎src/gui/processing/qgsprocessingguiregistry.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ QgsProcessingGuiRegistry::QgsProcessingGuiRegistry()
2828
addAlgorithmConfigurationWidgetFactory( new QgsFilterAlgorithmConfigurationWidgetFactory() );
2929

3030
addParameterWidgetFactory( new QgsProcessingBooleanWidgetWrapper() );
31+
addParameterWidgetFactory( new QgsProcessingCrsWidgetWrapper() );
3132
addParameterWidgetFactory( new QgsProcessingStringWidgetWrapper() );
3233
}
3334

@@ -101,7 +102,7 @@ QgsAbstractProcessingParameterWidgetWrapper *QgsProcessingGuiRegistry::createPar
101102
return mParameterWidgetFactories.value( parameterType )->createWidgetWrapper( parameter, type );
102103
}
103104

104-
QgsProcessingModelerParameterWidget *QgsProcessingGuiRegistry::createModelerParameterWidget( QgsProcessingModelAlgorithm *model, const QString &childId, const QgsProcessingParameterDefinition *parameter, const QgsProcessingContext &context )
105+
QgsProcessingModelerParameterWidget *QgsProcessingGuiRegistry::createModelerParameterWidget( QgsProcessingModelAlgorithm *model, const QString &childId, const QgsProcessingParameterDefinition *parameter, QgsProcessingContext &context )
105106
{
106107
if ( !parameter )
107108
return nullptr;

‎src/gui/processing/qgsprocessingguiregistry.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ class GUI_EXPORT QgsProcessingGuiRegistry
136136
*/
137137
QgsProcessingModelerParameterWidget *createModelerParameterWidget( QgsProcessingModelAlgorithm *model,
138138
const QString &childId,
139-
const QgsProcessingParameterDefinition *parameter, const QgsProcessingContext &context ) SIP_FACTORY;
139+
const QgsProcessingParameterDefinition *parameter, QgsProcessingContext &context ) SIP_FACTORY;
140140

141141
private:
142142

‎src/gui/processing/qgsprocessingmodelerparameterwidget.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131

3232
QgsProcessingModelerParameterWidget::QgsProcessingModelerParameterWidget( QgsProcessingModelAlgorithm *model,
3333
const QString &childId,
34-
const QgsProcessingParameterDefinition *parameter, const QgsProcessingContext &context,
34+
const QgsProcessingParameterDefinition *parameter, QgsProcessingContext &context,
3535
QWidget *parent )
3636
: QWidget( parent )
3737
, mModel( model )

‎src/gui/processing/qgsprocessingmodelerparameterwidget.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ class GUI_EXPORT QgsProcessingModelerParameterWidget : public QWidget
7777
QgsProcessingModelerParameterWidget( QgsProcessingModelAlgorithm *model,
7878
const QString &childId,
7979
const QgsProcessingParameterDefinition *parameter,
80-
const QgsProcessingContext &context,
80+
QgsProcessingContext &context,
8181
QWidget *parent SIP_TRANSFERTHIS = nullptr );
8282

8383
~QgsProcessingModelerParameterWidget() override;
@@ -150,7 +150,7 @@ class GUI_EXPORT QgsProcessingModelerParameterWidget : public QWidget
150150
QgsProcessingModelAlgorithm *mModel = nullptr;
151151
const QString mChildId;
152152
const QgsProcessingParameterDefinition *mParameterDefinition = nullptr;
153-
const QgsProcessingContext &mContext;
153+
QgsProcessingContext &mContext;
154154

155155
QVariant mStaticValue;
156156
QString mModelInputParameterName;

‎src/gui/processing/qgsprocessingwidgetwrapper.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ QgsProcessingGui::WidgetType QgsAbstractProcessingParameterWidgetWrapper::type()
3535
return mType;
3636
}
3737

38-
QWidget *QgsAbstractProcessingParameterWidgetWrapper::createWrappedWidget( const QgsProcessingContext &context )
38+
QWidget *QgsAbstractProcessingParameterWidgetWrapper::createWrappedWidget( QgsProcessingContext &context )
3939
{
4040
if ( mWidget )
4141
return mWidget;
@@ -86,7 +86,7 @@ const QgsProcessingParameterDefinition *QgsAbstractProcessingParameterWidgetWrap
8686
return mParameterDefinition;
8787
}
8888

89-
void QgsAbstractProcessingParameterWidgetWrapper::setParameterValue( const QVariant &value, const QgsProcessingContext &context )
89+
void QgsAbstractProcessingParameterWidgetWrapper::setParameterValue( const QVariant &value, QgsProcessingContext &context )
9090
{
9191
if ( mPropertyButton && value.canConvert< QgsProperty >() )
9292
{
@@ -207,7 +207,7 @@ void QgsAbstractProcessingParameterWidgetWrapper::setDynamicParentLayerParameter
207207
}
208208
}
209209

210-
QgsProcessingModelerParameterWidget *QgsProcessingParameterWidgetFactoryInterface::createModelerWidgetWrapper( QgsProcessingModelAlgorithm *model, const QString &childId, const QgsProcessingParameterDefinition *parameter, const QgsProcessingContext &context )
210+
QgsProcessingModelerParameterWidget *QgsProcessingParameterWidgetFactoryInterface::createModelerWidgetWrapper( QgsProcessingModelAlgorithm *model, const QString &childId, const QgsProcessingParameterDefinition *parameter, QgsProcessingContext &context )
211211
{
212212
std::unique_ptr< QgsProcessingModelerParameterWidget > widget = qgis::make_unique< QgsProcessingModelerParameterWidget >( model, childId, parameter, context );
213213
widget->populateSources( compatibleParameterTypes(), compatibleOutputTypes(), compatibleDataTypes() );

‎src/gui/processing/qgsprocessingwidgetwrapper.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ class GUI_EXPORT QgsAbstractProcessingParameterWidgetWrapper : public QObject
106106
*
107107
* \see createWrappedLabel()
108108
*/
109-
QWidget *createWrappedWidget( const QgsProcessingContext &context ) SIP_FACTORY;
109+
QWidget *createWrappedWidget( QgsProcessingContext &context ) SIP_FACTORY;
110110

111111
/**
112112
* Creates and returns a new label to accompany widgets created by the wrapper.
@@ -147,7 +147,7 @@ class GUI_EXPORT QgsAbstractProcessingParameterWidgetWrapper : public QObject
147147
*
148148
* \see parameterValue()
149149
*/
150-
void setParameterValue( const QVariant &value, const QgsProcessingContext &context );
150+
void setParameterValue( const QVariant &value, QgsProcessingContext &context );
151151

152152
/**
153153
* Returns the current value of the parameter.
@@ -209,7 +209,7 @@ class GUI_EXPORT QgsAbstractProcessingParameterWidgetWrapper : public QObject
209209
*
210210
* \see widgetValue()
211211
*/
212-
virtual void setWidgetValue( const QVariant &value, const QgsProcessingContext &context ) = 0;
212+
virtual void setWidgetValue( const QVariant &value, QgsProcessingContext &context ) = 0;
213213

214214
/**
215215
* Returns the current value of the parameter.
@@ -293,7 +293,7 @@ class GUI_EXPORT QgsProcessingParameterWidgetFactoryInterface
293293
virtual QgsProcessingModelerParameterWidget *createModelerWidgetWrapper( QgsProcessingModelAlgorithm *model,
294294
const QString &childId,
295295
const QgsProcessingParameterDefinition *parameter,
296-
const QgsProcessingContext &context );
296+
QgsProcessingContext &context );
297297

298298
protected:
299299

‎src/gui/processing/qgsprocessingwidgetwrapperimpl.cpp

Lines changed: 124 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "qgsprocessingwidgetwrapperimpl.h"
1919
#include "qgsprocessingparameters.h"
2020
#include "qgsprocessingoutputs.h"
21+
#include "qgsprojectionselectionwidget.h"
2122
#include <QLabel>
2223
#include <QHBoxLayout>
2324
#include <QCheckBox>
@@ -85,7 +86,7 @@ QLabel *QgsProcessingBooleanWidgetWrapper::createLabel()
8586
return QgsAbstractProcessingParameterWidgetWrapper::createLabel();
8687
}
8788

88-
void QgsProcessingBooleanWidgetWrapper::setWidgetValue( const QVariant &value, const QgsProcessingContext &context )
89+
void QgsProcessingBooleanWidgetWrapper::setWidgetValue( const QVariant &value, QgsProcessingContext &context )
8990
{
9091
switch ( type() )
9192
{
@@ -162,6 +163,127 @@ QgsAbstractProcessingParameterWidgetWrapper *QgsProcessingBooleanWidgetWrapper::
162163
}
163164

164165

166+
//
167+
// QgsProcessingCrsWidgetWrapper
168+
//
169+
170+
QgsProcessingCrsWidgetWrapper::QgsProcessingCrsWidgetWrapper( const QgsProcessingParameterDefinition *parameter, QgsProcessingGui::WidgetType type, QWidget *parent )
171+
: QgsAbstractProcessingParameterWidgetWrapper( parameter, type, parent )
172+
{
173+
174+
}
175+
176+
QWidget *QgsProcessingCrsWidgetWrapper::createWidget()
177+
{
178+
mProjectionSelectionWidget = new QgsProjectionSelectionWidget();
179+
mProjectionSelectionWidget->setToolTip( parameterDefinition()->toolTip() );
180+
181+
if ( parameterDefinition()->flags() & QgsProcessingParameterDefinition::FlagOptional )
182+
mProjectionSelectionWidget->setOptionVisible( QgsProjectionSelectionWidget::CrsNotSet, true );
183+
else
184+
mProjectionSelectionWidget->setOptionVisible( QgsProjectionSelectionWidget::CrsNotSet, false );
185+
186+
connect( mProjectionSelectionWidget, &QgsProjectionSelectionWidget::crsChanged, this, [ = ]
187+
{
188+
emit widgetValueHasChanged( this );
189+
} );
190+
191+
switch ( type() )
192+
{
193+
case QgsProcessingGui::Standard:
194+
case QgsProcessingGui::Batch:
195+
{
196+
return mProjectionSelectionWidget;
197+
};
198+
199+
case QgsProcessingGui::Modeler:
200+
{
201+
QWidget *w = new QWidget();
202+
w->setToolTip( parameterDefinition()->toolTip() );
203+
204+
QVBoxLayout *vl = new QVBoxLayout();
205+
vl->setMargin( 0 );
206+
vl->setContentsMargins( 0, 0, 0, 0 );
207+
w->setLayout( vl );
208+
209+
mUseProjectCrsCheckBox = new QCheckBox( tr( "Use project CRS" ) );
210+
mUseProjectCrsCheckBox->setToolTip( tr( "Always use the current project CRS when running the model" ) );
211+
vl->addWidget( mUseProjectCrsCheckBox );
212+
connect( mUseProjectCrsCheckBox, &QCheckBox::toggled, mProjectionSelectionWidget, &QgsProjectionSelectionWidget::setDisabled );
213+
214+
vl->addWidget( mProjectionSelectionWidget );
215+
216+
return w;
217+
}
218+
}
219+
return nullptr;
220+
}
221+
222+
void QgsProcessingCrsWidgetWrapper::setWidgetValue( const QVariant &value, QgsProcessingContext &context )
223+
{
224+
if ( mUseProjectCrsCheckBox )
225+
{
226+
if ( value.toString().compare( QLatin1String( "ProjectCrs" ), Qt::CaseInsensitive ) == 0 )
227+
{
228+
mUseProjectCrsCheckBox->setChecked( true );
229+
return;
230+
}
231+
else
232+
{
233+
mUseProjectCrsCheckBox->setChecked( false );
234+
}
235+
}
236+
237+
const QgsCoordinateReferenceSystem v = QgsProcessingParameters::parameterAsCrs( parameterDefinition(), value, context );
238+
if ( mProjectionSelectionWidget )
239+
mProjectionSelectionWidget->setCrs( v );
240+
}
241+
242+
QVariant QgsProcessingCrsWidgetWrapper::widgetValue() const
243+
{
244+
if ( mUseProjectCrsCheckBox && mUseProjectCrsCheckBox->isChecked() )
245+
return QStringLiteral( "ProjectCrs" );
246+
else if ( mProjectionSelectionWidget )
247+
return mProjectionSelectionWidget->crs().isValid() ? mProjectionSelectionWidget->crs() : QVariant();
248+
else
249+
return QVariant();
250+
}
251+
252+
QStringList QgsProcessingCrsWidgetWrapper::compatibleParameterTypes() const
253+
{
254+
return QStringList()
255+
<< QgsProcessingParameterCrs::typeName()
256+
<< QgsProcessingParameterExpression::typeName()
257+
<< QgsProcessingParameterString::typeName()
258+
<< QgsProcessingParameterRasterLayer::typeName()
259+
<< QgsProcessingParameterVectorLayer::typeName()
260+
<< QgsProcessingParameterFeatureSource::typeName();
261+
}
262+
263+
QStringList QgsProcessingCrsWidgetWrapper::compatibleOutputTypes() const
264+
{
265+
return QStringList() << QgsProcessingOutputVectorLayer::typeName()
266+
<< QgsProcessingOutputRasterLayer::typeName()
267+
<< QgsProcessingOutputMapLayer::typeName()
268+
<< QgsProcessingOutputString::typeName();
269+
}
270+
271+
QList<int> QgsProcessingCrsWidgetWrapper::compatibleDataTypes() const
272+
{
273+
return QList< int >();
274+
}
275+
276+
QString QgsProcessingCrsWidgetWrapper::parameterType() const
277+
{
278+
return QgsProcessingParameterCrs::typeName();
279+
}
280+
281+
QgsAbstractProcessingParameterWidgetWrapper *QgsProcessingCrsWidgetWrapper::createWidgetWrapper( const QgsProcessingParameterDefinition *parameter, QgsProcessingGui::WidgetType type )
282+
{
283+
return new QgsProcessingCrsWidgetWrapper( parameter, type );
284+
}
285+
286+
165287

166288
//
167289
// QgsProcessingStringWidgetWrapper
@@ -219,7 +341,7 @@ QWidget *QgsProcessingStringWidgetWrapper::createWidget()
219341
return nullptr;
220342
}
221343

222-
void QgsProcessingStringWidgetWrapper::setWidgetValue( const QVariant &value, const QgsProcessingContext &context )
344+
void QgsProcessingStringWidgetWrapper::setWidgetValue( const QVariant &value, QgsProcessingContext &context )
223345
{
224346
const QString v = QgsProcessingParameters::parameterAsString( parameterDefinition(), value, context );
225347
if ( mLineEdit )

‎src/gui/processing/qgsprocessingwidgetwrapperimpl.h

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class QCheckBox;
2626
class QComboBox;
2727
class QLineEdit;
2828
class QPlainTextEdit;
29-
29+
class QgsProjectionSelectionWidget;
3030

3131
///@cond PRIVATE
3232

@@ -49,7 +49,7 @@ class GUI_EXPORT QgsProcessingBooleanWidgetWrapper : public QgsAbstractProcessin
4949

5050
protected:
5151

52-
void setWidgetValue( const QVariant &value, const QgsProcessingContext &context ) override;
52+
void setWidgetValue( const QVariant &value, QgsProcessingContext &context ) override;
5353
QVariant widgetValue() const override;
5454

5555
QStringList compatibleParameterTypes() const override;
@@ -66,6 +66,40 @@ class GUI_EXPORT QgsProcessingBooleanWidgetWrapper : public QgsAbstractProcessin
6666
friend class TestProcessingGui;
6767
};
6868

69+
class GUI_EXPORT QgsProcessingCrsWidgetWrapper : public QgsAbstractProcessingParameterWidgetWrapper, public QgsProcessingParameterWidgetFactoryInterface
70+
{
71+
Q_OBJECT
72+
73+
public:
74+
75+
QgsProcessingCrsWidgetWrapper( const QgsProcessingParameterDefinition *parameter = nullptr,
76+
QgsProcessingGui::WidgetType type = QgsProcessingGui::Standard, QWidget *parent = nullptr );
77+
78+
// QgsProcessingParameterWidgetFactoryInterface
79+
QString parameterType() const override;
80+
QgsAbstractProcessingParameterWidgetWrapper *createWidgetWrapper( const QgsProcessingParameterDefinition *parameter, QgsProcessingGui::WidgetType type ) override;
81+
82+
// QgsProcessingParameterWidgetWrapper interface
83+
QWidget *createWidget() override SIP_FACTORY;
84+
85+
protected:
86+
87+
void setWidgetValue( const QVariant &value, QgsProcessingContext &context ) override;
88+
QVariant widgetValue() const override;
89+
90+
QStringList compatibleParameterTypes() const override;
91+
92+
QStringList compatibleOutputTypes() const override;
93+
94+
QList< int > compatibleDataTypes() const override;
95+
96+
private:
97+
98+
QgsProjectionSelectionWidget *mProjectionSelectionWidget = nullptr;
99+
QCheckBox *mUseProjectCrsCheckBox = nullptr;
100+
101+
friend class TestProcessingGui;
102+
};
69103

70104
class GUI_EXPORT QgsProcessingStringWidgetWrapper : public QgsAbstractProcessingParameterWidgetWrapper, public QgsProcessingParameterWidgetFactoryInterface
71105
{
@@ -85,7 +119,7 @@ class GUI_EXPORT QgsProcessingStringWidgetWrapper : public QgsAbstractProcessing
85119

86120
protected:
87121

88-
void setWidgetValue( const QVariant &value, const QgsProcessingContext &context ) override;
122+
void setWidgetValue( const QVariant &value, QgsProcessingContext &context ) override;
89123
QVariant widgetValue() const override;
90124

91125
QStringList compatibleParameterTypes() const override;

0 commit comments

Comments
 (0)