Skip to content

Commit f3f6267

Browse files
committed
[processing] Fixes to distance inputs for models
- fix parameter can get converted to plain number parameter after edits - allow parameter to be linked to parent parameters, so that the correct distance unit and choices are shown for the parameter (cherry picked from commit 4f6df29)
1 parent 8edc570 commit f3f6267

File tree

2 files changed

+50
-3
lines changed

2 files changed

+50
-3
lines changed

python/plugins/processing/modeler/ModelerParameterDefinitionDialog.py

+46-3
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,26 @@ def setupUi(self):
209209
self.verticalLayout.addWidget(self.datatypeCombo)
210210
elif (self.paramType == parameters.PARAMETER_NUMBER or self.paramType == parameters.PARAMETER_DISTANCE or
211211
isinstance(self.param, (QgsProcessingParameterNumber, QgsProcessingParameterDistance))):
212+
213+
if (self.paramType == parameters.PARAMETER_DISTANCE or
214+
isinstance(self.param, QgsProcessingParameterDistance)):
215+
self.verticalLayout.addWidget(QLabel(self.tr('Linked input')))
216+
self.parentCombo = QComboBox()
217+
self.parentCombo.addItem('', '')
218+
idx = 1
219+
for param in list(self.alg.parameterComponents().values()):
220+
definition = self.alg.parameterDefinition(param.parameterName())
221+
if isinstance(definition, (QgsProcessingParameterFeatureSource,
222+
QgsProcessingParameterVectorLayer,
223+
QgsProcessingParameterMapLayer,
224+
QgsProcessingParameterCrs)):
225+
self.parentCombo.addItem(definition.description(), definition.name())
226+
if self.param is not None:
227+
if self.param.parentParameterName() == definition.name():
228+
self.parentCombo.setCurrentIndex(idx)
229+
idx += 1
230+
self.verticalLayout.addWidget(self.parentCombo)
231+
212232
self.verticalLayout.addWidget(QLabel(self.tr('Min value')))
213233
self.minTextBox = QLineEdit()
214234
self.verticalLayout.addWidget(self.minTextBox)
@@ -399,11 +419,34 @@ def accept(self):
399419
self.param = QgsProcessingParameterMultipleLayers(
400420
name, description,
401421
self.datatypeCombo.currentData())
422+
elif (self.paramType == parameters.PARAMETER_DISTANCE or
423+
isinstance(self.param, QgsProcessingParameterDistance)):
424+
self.param = QgsProcessingParameterDistance(name, description,
425+
self.defaultTextBox.text())
426+
try:
427+
vmin = self.minTextBox.text().strip()
428+
if not vmin == '':
429+
self.param.setMinimum(float(vmin))
430+
vmax = self.maxTextBox.text().strip()
431+
if not vmax == '':
432+
self.param.setMaximum(float(vmax))
433+
except:
434+
QMessageBox.warning(self, self.tr('Unable to define parameter'),
435+
self.tr('Wrong or missing parameter values'))
436+
return
437+
438+
if self.parentCombo.currentIndex() < 0:
439+
QMessageBox.warning(self, self.tr('Unable to define parameter'),
440+
self.tr('Wrong or missing parameter values'))
441+
return
442+
parent = self.parentCombo.currentData()
443+
if parent:
444+
self.param.setParentParameterName(parent)
402445
elif (self.paramType == parameters.PARAMETER_NUMBER or
403-
isinstance(self.param, (QgsProcessingParameterNumber, QgsProcessingParameterDistance))):
446+
isinstance(self.param, QgsProcessingParameterNumber)):
447+
self.param = QgsProcessingParameterNumber(name, description, QgsProcessingParameterNumber.Double,
448+
self.defaultTextBox.text())
404449
try:
405-
self.param = QgsProcessingParameterNumber(name, description, QgsProcessingParameterNumber.Double,
406-
self.defaultTextBox.text())
407450
vmin = self.minTextBox.text().strip()
408451
if not vmin == '':
409452
self.param.setMinimum(float(vmin))

python/plugins/processing/modeler/ModelerScene.py

+4
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,12 @@ def paintModel(self, model, controls=True):
103103
for input_name in list(model.parameterComponents().keys()):
104104
idx = 0
105105
parameter_def = model.parameterDefinition(input_name)
106+
parent_name = None
106107
if hasattr(parameter_def, 'parentLayerParameterName') and parameter_def.parentLayerParameterName():
107108
parent_name = parameter_def.parentLayerParameterName()
109+
elif hasattr(parameter_def, 'parentParameterName') and parameter_def.parentParameterName():
110+
parent_name = parameter_def.parentParameterName()
111+
if parent_name:
108112
if input_name in self.paramItems and parent_name in self.paramItems:
109113
input_item = self.paramItems[input_name]
110114
parent_item = self.paramItems[parent_name]

0 commit comments

Comments
 (0)