diff --git a/python/core/processing/qgsprocessingalgorithm.sip.in b/python/core/processing/qgsprocessingalgorithm.sip.in index e955ee146c2..6a49351bcbf 100644 --- a/python/core/processing/qgsprocessingalgorithm.sip.in +++ b/python/core/processing/qgsprocessingalgorithm.sip.in @@ -10,12 +10,10 @@ - %ModuleHeaderCode #include %End - class QgsProcessingAlgorithm { %Docstring @@ -351,6 +349,12 @@ If an algorithm subclass implements a custom parameters widget, a copy of this w should be constructed and returned by this method. The base class implementation returns None, which indicates that an autogenerated parameters widget should be used. +%End + + virtual QgsProcessingAlgorithmConfigurationWidget *createModelerWidget() const /Factory/; +%Docstring +If an algorithm subclass implements a configuration widget for the algorithm itself, +a new instance of this widget should be returned by this method. %End QgsExpressionContext createExpressionContext( const QVariantMap ¶meters, diff --git a/python/plugins/processing/modeler/ModelerGraphicItem.py b/python/plugins/processing/modeler/ModelerGraphicItem.py index 140d8b0cd93..9af40660a14 100644 --- a/python/plugins/processing/modeler/ModelerGraphicItem.py +++ b/python/plugins/processing/modeler/ModelerGraphicItem.py @@ -208,7 +208,7 @@ class ModelerGraphicItem(QGraphicsItem): self.scene.dialog.repaintModel() elif isinstance(self.element, QgsProcessingModelChildAlgorithm): elemAlg = self.element.algorithm() - dlg = ModelerParametersDialog(elemAlg, self.model, self.element.childId()) + dlg = ModelerParametersDialog(elemAlg, self.model, self.element.childId(), self.element.configuration()) if dlg.exec_(): alg = dlg.createAlgorithm() alg.setChildId(self.element.childId()) diff --git a/python/plugins/processing/modeler/ModelerParametersDialog.py b/python/plugins/processing/modeler/ModelerParametersDialog.py index f82079b1aad..6d5aa3e167f 100644 --- a/python/plugins/processing/modeler/ModelerParametersDialog.py +++ b/python/plugins/processing/modeler/ModelerParametersDialog.py @@ -63,13 +63,15 @@ from processing.gui.MultipleInputPanel import MultipleInputPanel class ModelerParametersDialog(QDialog): - def __init__(self, alg, model, algName=None): + + def __init__(self, alg, model, algName=None, configuration=None): QDialog.__init__(self) self.setModal(True) self._alg = alg # The algorithm to define in this dialog. It is an instance of QgsProcessingAlgorithm self.model = model # The model this algorithm is going to be added to. It is an instance of QgsProcessingModelAlgorithm self.childId = algName # The name of the algorithm in the model, in case we are editing it and not defining it for the first time + self.configuration = configuration self.setupUi() self.params = None @@ -87,6 +89,8 @@ class ModelerParametersDialog(QDialog): self.wrappers = {} self.valueItems = {} self.dependentItems = {} + self.algorithmItem = None + self.resize(650, 450) self.buttonBox = QDialogButtonBox() self.buttonBox.setOrientation(Qt.Horizontal) @@ -114,6 +118,10 @@ class ModelerParametersDialog(QDialog): line.setFrameShape(QFrame.HLine) line.setFrameShadow(QFrame.Sunken) self.verticalLayout.addWidget(line) + self.algorithmItem = self._alg.createModelerWidget() + if self.configuration: + self.algorithmItem.setConfiguration(self.configuration) + self.verticalLayout.addWidget(self.algorithmItem) for param in self._alg.parameterDefinitions(): if param.flags() & QgsProcessingParameterDefinition.FlagAdvanced: @@ -284,6 +292,8 @@ class ModelerParametersDialog(QDialog): else: alg.setChildId(self.childId) alg.setDescription(self.descriptionBox.text()) + if self.algorithmItem: + alg.setConfiguration(self.algorithmItem.configuration()) for param in self._alg.parameterDefinitions(): if param.isDestination() or param.flags() & QgsProcessingParameterDefinition.FlagHidden: continue diff --git a/src/core/processing/qgsprocessingalgorithm.cpp b/src/core/processing/qgsprocessingalgorithm.cpp index e83e9302acd..74f653f0855 100644 --- a/src/core/processing/qgsprocessingalgorithm.cpp +++ b/src/core/processing/qgsprocessingalgorithm.cpp @@ -131,6 +131,11 @@ QWidget *QgsProcessingAlgorithm::createCustomParametersWidget( QWidget * ) const return nullptr; } +QgsProcessingAlgorithmConfigurationWidget *QgsProcessingAlgorithm::createModelerWidget() const +{ + return nullptr; +} + QgsExpressionContext QgsProcessingAlgorithm::createExpressionContext( const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessingFeatureSource *source ) const { diff --git a/src/core/processing/qgsprocessingalgorithm.h b/src/core/processing/qgsprocessingalgorithm.h index f24b90ba6b3..9e176c57bcc 100644 --- a/src/core/processing/qgsprocessingalgorithm.h +++ b/src/core/processing/qgsprocessingalgorithm.h @@ -33,7 +33,8 @@ class QgsProcessingProvider; class QgsProcessingFeedback; class QgsFeatureSink; class QgsProcessingFeedback; - +class QgsProcessingModelAlgorithm; +class QgsProcessingAlgorithmConfigurationWidget; #ifdef SIP_RUN % ModuleHeaderCode @@ -41,7 +42,6 @@ class QgsProcessingFeedback; % End #endif - /** * \class QgsProcessingAlgorithm * \ingroup core @@ -356,6 +356,12 @@ class CORE_EXPORT QgsProcessingAlgorithm */ virtual QWidget *createCustomParametersWidget( QWidget *parent = nullptr ) const SIP_FACTORY; + /** + * If an algorithm subclass implements a configuration widget for the algorithm itself, + * a new instance of this widget should be returned by this method. + */ + virtual QgsProcessingAlgorithmConfigurationWidget *createModelerWidget() const SIP_FACTORY; + /** * Creates an expression context relating to the algorithm. This can be called by algorithms * to create a new expression context ready for evaluating expressions within the algorithm.