Skip to content

Commit 8139786

Browse files
committed
Allow adding manual layers in modeler multi layer alg parameters
This allows creation of models with child algorithms which do things like merge a selected layer with a predefined static layer, or create a vrt with a mix of static and user selected layers.
1 parent aefd5cc commit 8139786

File tree

2 files changed

+24
-14
lines changed

2 files changed

+24
-14
lines changed

python/plugins/processing/gui/MultipleInputDialog.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@
3232
from qgis.core import (QgsSettings,
3333
QgsProcessing,
3434
QgsVectorFileWriter,
35-
QgsProviderRegistry)
35+
QgsProviderRegistry,
36+
QgsProcessingModelChildParameterSource)
3637
from qgis.PyQt import uic
3738
from qgis.PyQt.QtCore import Qt
3839
from qgis.PyQt.QtCore import QByteArray
@@ -105,8 +106,11 @@ def populateList(self):
105106

106107
# add extra options (e.g. manually added layers)
107108
for t in [o for o in self.selectedoptions if not isinstance(o, int)]:
108-
item = QStandardItem(t)
109-
item.setData(t, Qt.UserRole)
109+
if isinstance(t, QgsProcessingModelChildParameterSource):
110+
item = QStandardItem(t.staticValue())
111+
else:
112+
item = QStandardItem(t)
113+
item.setData(item.text(), Qt.UserRole)
110114
item.setCheckState(Qt.Checked)
111115
item.setCheckable(True)
112116
self.model.appendRow(item)

python/plugins/processing/gui/wrappers.py

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
QgsProcessingOutputVectorLayer,
7070
QgsProcessingOutputString,
7171
QgsProcessingOutputNumber,
72+
QgsProcessingModelChildParameterSource,
7273
QgsProcessingModelAlgorithm)
7374

7475
from qgis.PyQt.QtWidgets import (
@@ -562,7 +563,7 @@ def createWidget(self):
562563
return widget
563564
else:
564565
options = [self.dialog.resolveValueDescription(opt) for opt in self._getOptions()]
565-
return MultipleInputPanel(options)
566+
return MultipleInputPanel(options, datatype=self.param.layerType())
566567

567568
def refresh(self):
568569
if self.param.layerType() != QgsProcessing.TypeFile:
@@ -582,15 +583,20 @@ def setValue(self, value):
582583
return self.widget.setText(value)
583584
else:
584585
options = self._getOptions()
585-
selected = []
586-
for i, opt in enumerate(options):
587-
try:
588-
if opt in value:
589-
selected.append(i)
590-
except TypeError:
591-
if opt == value:
592-
selected.append(i)
593-
self.widget.setSelectedItems(selected)
586+
587+
if not isinstance(value, (tuple, list)):
588+
value = [value]
589+
590+
selected_options = []
591+
for sel in value:
592+
if sel in options:
593+
selected_options.append(options.index(sel))
594+
elif isinstance(sel, QgsProcessingModelChildParameterSource):
595+
selected_options.append(sel.staticValue())
596+
else:
597+
selected_options.append(sel)
598+
599+
self.widget.setSelectedItems(selected_options)
594600

595601
def value(self):
596602
if self.dialogType == DIALOG_STANDARD:
@@ -608,7 +614,7 @@ def value(self):
608614
return self.widget.getText()
609615
else:
610616
options = self._getOptions()
611-
values = [options[i] for i in self.widget.selectedoptions]
617+
values = [options[i] if isinstance(i, int) else QgsProcessingModelChildParameterSource.fromStaticValue(i) for i in self.widget.selectedoptions]
612618
if len(values) == 0 and not self.param.flags() & QgsProcessing.FlagOptional:
613619
raise InvalidParameterValue()
614620
return values

0 commit comments

Comments
 (0)