Skip to content

Commit 7af13f6

Browse files
committedSep 21, 2018
Set widget context for widget wrappers
1 parent 55e22b9 commit 7af13f6

File tree

7 files changed

+62
-2
lines changed

7 files changed

+62
-2
lines changed
 

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,15 @@ last for the lifetime of the widget.
5757

5858
~QgsProcessingModelerParameterWidget();
5959

60+
void setWidgetContext( const QgsProcessingParameterWidgetContext &context );
61+
%Docstring
62+
Sets the ``context`` in which the modeler parameter widget is shown, e.g., the
63+
parent model algorithm and other relevant information which allows the widget
64+
to fine-tune its behavior.
65+
66+
.. seealso:: :py:func:`widgetContext`
67+
%End
68+
6069
void populateSources( const QStringList &compatibleParameterTypes,
6170
const QStringList &compatibleOutputTypes,
6271
const QList< int > &compatibleDataTypes );

‎python/plugins/processing/gui/BatchPanel.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636
QgsApplication,
3737
QgsSettings,
3838
QgsProcessingParameterDefinition)
39+
from qgis.gui import QgsProcessingParameterWidgetContext
40+
from qgis.utils import iface
3941

4042
from processing.gui.wrappers import WidgetWrapperFactory, WidgetWrapper
4143
from processing.gui.BatchOutputSelectionPanel import BatchOutputSelectionPanel
@@ -253,6 +255,9 @@ def setCellWrapper(self, row, column, wrapper, context):
253255
# TODO QGIS 4.0 - remove
254256
is_cpp_wrapper = not issubclass(wrapper.__class__, WidgetWrapper)
255257
if is_cpp_wrapper:
258+
widget_context = QgsProcessingParameterWidgetContext()
259+
widget_context.setMapCanvas(iface.mapCanvas())
260+
wrapper.setWidgetContext(widget_context)
256261
widget = wrapper.createWrappedWidget(context)
257262
else:
258263
widget = wrapper.widget

‎python/plugins/processing/gui/ParametersPanel.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@
4242
QgsProcessingParameterFeatureSink,
4343
QgsProcessingParameterVectorDestination,
4444
QgsProject)
45-
from qgis.gui import QgsProcessingContextGenerator
45+
from qgis.gui import (QgsProcessingContextGenerator,
46+
QgsProcessingParameterWidgetContext)
47+
from qgis.utils import iface
4648

4749
from qgis.PyQt import uic
4850
from qgis.PyQt.QtCore import QCoreApplication, Qt
@@ -122,6 +124,10 @@ def initWidgets(self):
122124
if param.flags() & QgsProcessingParameterDefinition.FlagAdvanced:
123125
self.grpAdvanced.show()
124126
break
127+
128+
widget_context = QgsProcessingParameterWidgetContext()
129+
widget_context.setMapCanvas(iface.mapCanvas())
130+
125131
# Create widgets and put them in layouts
126132
for param in self.alg.parameterDefinitions():
127133
if param.flags() & QgsProcessingParameterDefinition.FlagHidden:
@@ -142,6 +148,7 @@ def initWidgets(self):
142148
# TODO QGIS 4.0 - remove
143149
is_python_wrapper = issubclass(wrapper.__class__, WidgetWrapper)
144150
if not is_python_wrapper:
151+
wrapper.setWidgetContext(widget_context)
145152
widget = wrapper.createWrappedWidget(self.processing_context)
146153
wrapper.registerProcessingContextGenerator(self.context_generator)
147154
else:

‎python/plugins/processing/modeler/ModelerParametersDialog.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@
5858
QgsScrollArea,
5959
QgsFilterLineEdit,
6060
QgsHelp,
61-
QgsProcessingModelerParameterWidget)
61+
QgsProcessingModelerParameterWidget,
62+
QgsProcessingParameterWidgetContext)
63+
from qgis.utils import iface
6264

6365
from processing.gui.wrappers import WidgetWrapperFactory
6466
from processing.gui.wrappers import InvalidParameterValue
@@ -131,6 +133,9 @@ def setupUi(self):
131133
self.algorithmItem.setConfiguration(self.configuration)
132134
self.verticalLayout.addWidget(self.algorithmItem)
133135

136+
widget_context = QgsProcessingParameterWidgetContext()
137+
widget_context.setMapCanvas(iface.mapCanvas())
138+
134139
for param in self._alg.parameterDefinitions():
135140
if param.flags() & QgsProcessingParameterDefinition.FlagAdvanced:
136141
self.advancedButton = QPushButton()
@@ -150,6 +155,7 @@ def setupUi(self):
150155
self.wrappers[param.name()] = wrapper
151156

152157
if issubclass(wrapper.__class__, QgsProcessingModelerParameterWidget):
158+
wrapper.setWidgetContext(widget_context)
153159
widget = wrapper
154160
else:
155161
widget = wrapper.widget

‎src/gui/processing/qgsprocessingmodelerparameterwidget.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,12 @@ QgsProcessingModelerParameterWidget::QgsProcessingModelerParameterWidget( QgsPro
113113

114114
QgsProcessingModelerParameterWidget::~QgsProcessingModelerParameterWidget() = default;
115115

116+
void QgsProcessingModelerParameterWidget::setWidgetContext( const QgsProcessingParameterWidgetContext &context )
117+
{
118+
if ( mStaticWidgetWrapper )
119+
mStaticWidgetWrapper->setWidgetContext( context );
120+
}
121+
116122
const QgsProcessingParameterDefinition *QgsProcessingModelerParameterWidget::parameterDefinition() const
117123
{
118124
return mParameterDefinition;

‎src/gui/processing/qgsprocessingmodelerparameterwidget.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class QgsProcessingParameterDefinition;
3030
class QgsAbstractProcessingParameterWidgetWrapper;
3131
class QgsExpressionLineEdit;
3232
class QgsProcessingModelAlgorithm;
33+
class QgsProcessingParameterWidgetContext;
3334

3435
class QLabel;
3536
class QToolButton;
@@ -82,6 +83,15 @@ class GUI_EXPORT QgsProcessingModelerParameterWidget : public QWidget
8283

8384
~QgsProcessingModelerParameterWidget() override;
8485

86+
/**
87+
* Sets the \a context in which the modeler parameter widget is shown, e.g., the
88+
* parent model algorithm and other relevant information which allows the widget
89+
* to fine-tune its behavior.
90+
*
91+
* \see widgetContext()
92+
*/
93+
void setWidgetContext( const QgsProcessingParameterWidgetContext &context );
94+
8595
/**
8696
* Populates the widget with available sources for the parameter's value, e.g.
8797
* adding the available child algorithm outputs and model input parameter

‎tests/src/gui/testprocessinggui.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
#include "qgsprojectionselectionwidget.h"
4141
#include "qgsdoublespinbox.h"
4242
#include "qgsspinbox.h"
43+
#include "qgsmapcanvas.h"
44+
#include "models/qgsprocessingmodelalgorithm.h"
4345

4446
class TestParamType : public QgsProcessingParameterDefinition
4547
{
@@ -306,6 +308,21 @@ void TestProcessingGui::testWrapperGeneral()
306308
w = falseDefault.createWrappedWidget( context );
307309
QVERIFY( !falseDefault.widgetValue().toBool() );
308310
delete w;
311+
312+
std::unique_ptr< QgsMapCanvas > mc = qgis::make_unique< QgsMapCanvas >();
313+
QgsProcessingParameterWidgetContext widgetContext;
314+
widgetContext.setMapCanvas( mc.get() );
315+
QCOMPARE( widgetContext.mapCanvas(), mc.get() );
316+
std::unique_ptr< QgsProcessingModelAlgorithm > model = qgis::make_unique< QgsProcessingModelAlgorithm >();
317+
widgetContext.setModel( model.get() );
318+
QCOMPARE( widgetContext.model(), model.get() );
319+
widgetContext.setModelChildAlgorithmId( QStringLiteral( "xx" ) );
320+
QCOMPARE( widgetContext.modelChildAlgorithmId(), QStringLiteral( "xx" ) );
321+
322+
wrapper.setWidgetContext( widgetContext );
323+
QCOMPARE( wrapper.widgetContext().mapCanvas(), mc.get() );
324+
QCOMPARE( wrapper.widgetContext().model(), model.get() );
325+
QCOMPARE( wrapper.widgetContext().modelChildAlgorithmId(), QStringLiteral( "xx" ) );
309326
}
310327

311328
class TestProcessingContextGenerator : public QgsProcessingContextGenerator

0 commit comments

Comments
 (0)
Please sign in to comment.