From 7af13f62c05dbfa328dc6f6f141d9ff39d2d959a Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Thu, 20 Sep 2018 08:26:42 +1000 Subject: [PATCH] Set widget context for widget wrappers --- .../qgsprocessingmodelerparameterwidget.sip.in | 9 +++++++++ python/plugins/processing/gui/BatchPanel.py | 5 +++++ .../plugins/processing/gui/ParametersPanel.py | 9 ++++++++- .../modeler/ModelerParametersDialog.py | 8 +++++++- .../qgsprocessingmodelerparameterwidget.cpp | 6 ++++++ .../qgsprocessingmodelerparameterwidget.h | 10 ++++++++++ tests/src/gui/testprocessinggui.cpp | 17 +++++++++++++++++ 7 files changed, 62 insertions(+), 2 deletions(-) diff --git a/python/gui/auto_generated/processing/qgsprocessingmodelerparameterwidget.sip.in b/python/gui/auto_generated/processing/qgsprocessingmodelerparameterwidget.sip.in index 7a8f155ed21..466b0e4d804 100644 --- a/python/gui/auto_generated/processing/qgsprocessingmodelerparameterwidget.sip.in +++ b/python/gui/auto_generated/processing/qgsprocessingmodelerparameterwidget.sip.in @@ -57,6 +57,15 @@ last for the lifetime of the widget. ~QgsProcessingModelerParameterWidget(); + void setWidgetContext( const QgsProcessingParameterWidgetContext &context ); +%Docstring +Sets the ``context`` in which the modeler parameter widget is shown, e.g., the +parent model algorithm and other relevant information which allows the widget +to fine-tune its behavior. + +.. seealso:: :py:func:`widgetContext` +%End + void populateSources( const QStringList &compatibleParameterTypes, const QStringList &compatibleOutputTypes, const QList< int > &compatibleDataTypes ); diff --git a/python/plugins/processing/gui/BatchPanel.py b/python/plugins/processing/gui/BatchPanel.py index 54c5fa1523a..890afb270e4 100644 --- a/python/plugins/processing/gui/BatchPanel.py +++ b/python/plugins/processing/gui/BatchPanel.py @@ -36,6 +36,8 @@ from qgis.core import (Qgis, QgsApplication, QgsSettings, QgsProcessingParameterDefinition) +from qgis.gui import QgsProcessingParameterWidgetContext +from qgis.utils import iface from processing.gui.wrappers import WidgetWrapperFactory, WidgetWrapper from processing.gui.BatchOutputSelectionPanel import BatchOutputSelectionPanel @@ -253,6 +255,9 @@ class BatchPanel(BASE, WIDGET): # TODO QGIS 4.0 - remove is_cpp_wrapper = not issubclass(wrapper.__class__, WidgetWrapper) if is_cpp_wrapper: + widget_context = QgsProcessingParameterWidgetContext() + widget_context.setMapCanvas(iface.mapCanvas()) + wrapper.setWidgetContext(widget_context) widget = wrapper.createWrappedWidget(context) else: widget = wrapper.widget diff --git a/python/plugins/processing/gui/ParametersPanel.py b/python/plugins/processing/gui/ParametersPanel.py index 9b9ebd98d9f..4dd7fa4d407 100644 --- a/python/plugins/processing/gui/ParametersPanel.py +++ b/python/plugins/processing/gui/ParametersPanel.py @@ -42,7 +42,9 @@ from qgis.core import (QgsProcessingParameterDefinition, QgsProcessingParameterFeatureSink, QgsProcessingParameterVectorDestination, QgsProject) -from qgis.gui import QgsProcessingContextGenerator +from qgis.gui import (QgsProcessingContextGenerator, + QgsProcessingParameterWidgetContext) +from qgis.utils import iface from qgis.PyQt import uic from qgis.PyQt.QtCore import QCoreApplication, Qt @@ -122,6 +124,10 @@ class ParametersPanel(BASE, WIDGET): if param.flags() & QgsProcessingParameterDefinition.FlagAdvanced: self.grpAdvanced.show() break + + widget_context = QgsProcessingParameterWidgetContext() + widget_context.setMapCanvas(iface.mapCanvas()) + # Create widgets and put them in layouts for param in self.alg.parameterDefinitions(): if param.flags() & QgsProcessingParameterDefinition.FlagHidden: @@ -142,6 +148,7 @@ class ParametersPanel(BASE, WIDGET): # TODO QGIS 4.0 - remove is_python_wrapper = issubclass(wrapper.__class__, WidgetWrapper) if not is_python_wrapper: + wrapper.setWidgetContext(widget_context) widget = wrapper.createWrappedWidget(self.processing_context) wrapper.registerProcessingContextGenerator(self.context_generator) else: diff --git a/python/plugins/processing/modeler/ModelerParametersDialog.py b/python/plugins/processing/modeler/ModelerParametersDialog.py index 5488fa936c4..d15e94b052e 100644 --- a/python/plugins/processing/modeler/ModelerParametersDialog.py +++ b/python/plugins/processing/modeler/ModelerParametersDialog.py @@ -58,7 +58,9 @@ from qgis.gui import (QgsGui, QgsScrollArea, QgsFilterLineEdit, QgsHelp, - QgsProcessingModelerParameterWidget) + QgsProcessingModelerParameterWidget, + QgsProcessingParameterWidgetContext) +from qgis.utils import iface from processing.gui.wrappers import WidgetWrapperFactory from processing.gui.wrappers import InvalidParameterValue @@ -131,6 +133,9 @@ class ModelerParametersDialog(QDialog): self.algorithmItem.setConfiguration(self.configuration) self.verticalLayout.addWidget(self.algorithmItem) + widget_context = QgsProcessingParameterWidgetContext() + widget_context.setMapCanvas(iface.mapCanvas()) + for param in self._alg.parameterDefinitions(): if param.flags() & QgsProcessingParameterDefinition.FlagAdvanced: self.advancedButton = QPushButton() @@ -150,6 +155,7 @@ class ModelerParametersDialog(QDialog): self.wrappers[param.name()] = wrapper if issubclass(wrapper.__class__, QgsProcessingModelerParameterWidget): + wrapper.setWidgetContext(widget_context) widget = wrapper else: widget = wrapper.widget diff --git a/src/gui/processing/qgsprocessingmodelerparameterwidget.cpp b/src/gui/processing/qgsprocessingmodelerparameterwidget.cpp index 61fac3dc111..02cc8db7179 100644 --- a/src/gui/processing/qgsprocessingmodelerparameterwidget.cpp +++ b/src/gui/processing/qgsprocessingmodelerparameterwidget.cpp @@ -113,6 +113,12 @@ QgsProcessingModelerParameterWidget::QgsProcessingModelerParameterWidget( QgsPro QgsProcessingModelerParameterWidget::~QgsProcessingModelerParameterWidget() = default; +void QgsProcessingModelerParameterWidget::setWidgetContext( const QgsProcessingParameterWidgetContext &context ) +{ + if ( mStaticWidgetWrapper ) + mStaticWidgetWrapper->setWidgetContext( context ); +} + const QgsProcessingParameterDefinition *QgsProcessingModelerParameterWidget::parameterDefinition() const { return mParameterDefinition; diff --git a/src/gui/processing/qgsprocessingmodelerparameterwidget.h b/src/gui/processing/qgsprocessingmodelerparameterwidget.h index afef71f55e2..564f8fb8334 100644 --- a/src/gui/processing/qgsprocessingmodelerparameterwidget.h +++ b/src/gui/processing/qgsprocessingmodelerparameterwidget.h @@ -30,6 +30,7 @@ class QgsProcessingParameterDefinition; class QgsAbstractProcessingParameterWidgetWrapper; class QgsExpressionLineEdit; class QgsProcessingModelAlgorithm; +class QgsProcessingParameterWidgetContext; class QLabel; class QToolButton; @@ -82,6 +83,15 @@ class GUI_EXPORT QgsProcessingModelerParameterWidget : public QWidget ~QgsProcessingModelerParameterWidget() override; + /** + * Sets the \a context in which the modeler parameter widget is shown, e.g., the + * parent model algorithm and other relevant information which allows the widget + * to fine-tune its behavior. + * + * \see widgetContext() + */ + void setWidgetContext( const QgsProcessingParameterWidgetContext &context ); + /** * Populates the widget with available sources for the parameter's value, e.g. * adding the available child algorithm outputs and model input parameter diff --git a/tests/src/gui/testprocessinggui.cpp b/tests/src/gui/testprocessinggui.cpp index f2d6b33dd46..ebca66c5e4a 100644 --- a/tests/src/gui/testprocessinggui.cpp +++ b/tests/src/gui/testprocessinggui.cpp @@ -40,6 +40,8 @@ #include "qgsprojectionselectionwidget.h" #include "qgsdoublespinbox.h" #include "qgsspinbox.h" +#include "qgsmapcanvas.h" +#include "models/qgsprocessingmodelalgorithm.h" class TestParamType : public QgsProcessingParameterDefinition { @@ -306,6 +308,21 @@ void TestProcessingGui::testWrapperGeneral() w = falseDefault.createWrappedWidget( context ); QVERIFY( !falseDefault.widgetValue().toBool() ); delete w; + + std::unique_ptr< QgsMapCanvas > mc = qgis::make_unique< QgsMapCanvas >(); + QgsProcessingParameterWidgetContext widgetContext; + widgetContext.setMapCanvas( mc.get() ); + QCOMPARE( widgetContext.mapCanvas(), mc.get() ); + std::unique_ptr< QgsProcessingModelAlgorithm > model = qgis::make_unique< QgsProcessingModelAlgorithm >(); + widgetContext.setModel( model.get() ); + QCOMPARE( widgetContext.model(), model.get() ); + widgetContext.setModelChildAlgorithmId( QStringLiteral( "xx" ) ); + QCOMPARE( widgetContext.modelChildAlgorithmId(), QStringLiteral( "xx" ) ); + + wrapper.setWidgetContext( widgetContext ); + QCOMPARE( wrapper.widgetContext().mapCanvas(), mc.get() ); + QCOMPARE( wrapper.widgetContext().model(), model.get() ); + QCOMPARE( wrapper.widgetContext().modelChildAlgorithmId(), QStringLiteral( "xx" ) ); } class TestProcessingContextGenerator : public QgsProcessingContextGenerator