Skip to content

Commit

Permalink
[processing] Allow algorithms to provide additional configuration wid…
Browse files Browse the repository at this point in the history
…gets
  • Loading branch information
m-kuhn committed Apr 9, 2018
1 parent 9e8c995 commit e6ef763
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 6 deletions.
8 changes: 6 additions & 2 deletions python/core/processing/qgsprocessingalgorithm.sip.in
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,10 @@




%ModuleHeaderCode
#include <qgsprocessingmodelalgorithm.h>
%End


class QgsProcessingAlgorithm
{
%Docstring
Expand Down Expand Up @@ -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 &parameters,
Expand Down
2 changes: 1 addition & 1 deletion python/plugins/processing/modeler/ModelerGraphicItem.py
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ def editElement(self):
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())
Expand Down
12 changes: 11 additions & 1 deletion python/plugins/processing/modeler/ModelerParametersDialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,13 +63,15 @@


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
Expand All @@ -87,6 +89,8 @@ def setupUi(self):
self.wrappers = {}
self.valueItems = {}
self.dependentItems = {}
self.algorithmItem = None

self.resize(650, 450)
self.buttonBox = QDialogButtonBox()
self.buttonBox.setOrientation(Qt.Horizontal)
Expand Down Expand Up @@ -114,6 +118,10 @@ def setupUi(self):
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:
Expand Down Expand Up @@ -284,6 +292,8 @@ def createAlgorithm(self):
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
Expand Down
5 changes: 5 additions & 0 deletions src/core/processing/qgsprocessingalgorithm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,11 @@ QWidget *QgsProcessingAlgorithm::createCustomParametersWidget( QWidget * ) const
return nullptr;
}

QgsProcessingAlgorithmConfigurationWidget *QgsProcessingAlgorithm::createModelerWidget() const
{
return nullptr;
}

QgsExpressionContext QgsProcessingAlgorithm::createExpressionContext( const QVariantMap &parameters,
QgsProcessingContext &context, QgsProcessingFeatureSource *source ) const
{
Expand Down
10 changes: 8 additions & 2 deletions src/core/processing/qgsprocessingalgorithm.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,15 +33,15 @@ class QgsProcessingProvider;
class QgsProcessingFeedback;
class QgsFeatureSink;
class QgsProcessingFeedback;

class QgsProcessingModelAlgorithm;
class QgsProcessingAlgorithmConfigurationWidget;

#ifdef SIP_RUN
% ModuleHeaderCode
#include <qgsprocessingmodelalgorithm.h>
% End
#endif


/**
* \class QgsProcessingAlgorithm
* \ingroup core
Expand Down Expand Up @@ -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.
Expand Down

0 comments on commit e6ef763

Please sign in to comment.