Skip to content

Commit fc65334

Browse files
committed
[processing] Add file picker to vector/raster/table parameters
in modeller Makes it obvious that users can set an algorithm vector/raster/ table input to a fixed table
1 parent f78f2a0 commit fc65334

File tree

1 file changed

+84
-35
lines changed

1 file changed

+84
-35
lines changed

python/plugins/processing/gui/wrappers.py

+84-35
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ def __init__(self, param, dialog, row=0, col=0):
115115
self.setValue(param.default)
116116

117117
def comboValue(self, validator=None, combobox=None):
118-
if not combobox:
118+
if combobox is None:
119119
combobox = self.widget
120120
idx = combobox.findText(combobox.currentText())
121121
if idx < 0:
@@ -132,7 +132,7 @@ def setValue(self, value):
132132
pass
133133

134134
def setComboValue(self, value, combobox=None):
135-
if not combobox:
135+
if combobox is None:
136136
combobox = self.widget
137137
if isinstance(value, list):
138138
value = value[0]
@@ -265,7 +265,6 @@ def createWidget(self):
265265
self.combo.setEditText(self.param.default)
266266
return widget
267267
else:
268-
269268
widget = QgsProjectionSelectionWidget()
270269
if self.param.optional:
271270
widget.setOptionVisible(QgsProjectionSelectionWidget.CrsNotSet, True)
@@ -584,31 +583,47 @@ def createWidget(self):
584583
elif self.dialogType == DIALOG_BATCH:
585584
return BatchInputSelectionPanel(self.param, self.row, self.col, self.dialog)
586585
else:
587-
widget = QComboBox()
588-
widget.setEditable(True)
589-
files = self.dialog.getAvailableValuesOfType(ParameterRaster, OutputRaster)
590-
for f in files:
591-
widget.addItem(self.dialog.resolveValueDescription(f), f)
586+
self.combo = QComboBox()
587+
layers = self.dialog.getAvailableValuesOfType(ParameterRaster, OutputRaster)
588+
self.combo.setEditable(True)
589+
for layer in layers:
590+
self.combo.addItem(self.dialog.resolveValueDescription(layer), layer)
592591
if self.param.optional:
593-
widget.setEditText("")
592+
self.combo.setEditText("")
593+
594+
widget = QWidget()
595+
layout = QHBoxLayout()
596+
layout.setMargin(0)
597+
layout.setContentsMargins(0, 0, 0, 0)
598+
layout.setSpacing(2)
599+
layout.addWidget(self.combo)
600+
btn = QToolButton()
601+
btn.setText('...')
602+
btn.setToolTip(self.tr("Select file"))
603+
btn.clicked.connect(self.selectFile)
604+
layout.addWidget(btn)
605+
widget.setLayout(layout)
594606
return widget
595607

596608
def selectFile(self):
597609
filename, selected_filter = self.getFileName(self.combo.currentText())
598610
if filename:
599611
filename = dataobjects.getRasterSublayer(filename, self.param)
600-
items = self.combo.additionalItems()
601-
items.append(filename)
602-
self.combo.setAdditionalItems(items)
603-
self.combo.setCurrentIndex(self.combo.findText(filename))
612+
if isinstance(self.combo, QgsMapLayerComboBox):
613+
items = self.combo.additionalItems()
614+
items.append(filename)
615+
self.combo.setAdditionalItems(items)
616+
self.combo.setCurrentIndex(self.combo.findText(filename))
617+
else:
618+
self.combo.setEditText(filename)
604619

605620
def setValue(self, value):
606621
if self.dialogType == DIALOG_STANDARD:
607622
pass # TODO
608623
elif self.dialogType == DIALOG_BATCH:
609624
self.widget.setText(value)
610625
else:
611-
self.setComboValue(value)
626+
self.setComboValue(value, combobox=self.combo)
612627

613628
def value(self):
614629
if self.dialogType == DIALOG_STANDARD:
@@ -628,7 +643,7 @@ def validator(v):
628643
return self.param.optional
629644
else:
630645
return os.path.exists(v)
631-
return self.comboValue(validator)
646+
return self.comboValue(validator, combobox=self.combo)
632647

633648

634649
class SelectionWidgetWrapper(WidgetWrapper):
@@ -704,31 +719,47 @@ def createWidget(self):
704719
widget.valueChanged.connect(lambda: self.widgetValueHasChanged.emit(self))
705720
return widget
706721
else:
707-
widget = QComboBox()
722+
self.combo = QComboBox()
708723
layers = self.dialog.getAvailableValuesOfType(ParameterVector, OutputVector)
709-
widget.setEditable(True)
724+
self.combo.setEditable(True)
710725
for layer in layers:
711-
widget.addItem(self.dialog.resolveValueDescription(layer), layer)
726+
self.combo.addItem(self.dialog.resolveValueDescription(layer), layer)
712727
if self.param.optional:
713-
widget.setEditText("")
728+
self.combo.setEditText("")
729+
730+
widget = QWidget()
731+
layout = QHBoxLayout()
732+
layout.setMargin(0)
733+
layout.setContentsMargins(0, 0, 0, 0)
734+
layout.setSpacing(2)
735+
layout.addWidget(self.combo)
736+
btn = QToolButton()
737+
btn.setText('...')
738+
btn.setToolTip(self.tr("Select file"))
739+
btn.clicked.connect(self.selectFile)
740+
layout.addWidget(btn)
741+
widget.setLayout(layout)
714742
return widget
715743

716744
def selectFile(self):
717745
filename, selected_filter = self.getFileName(self.combo.currentText())
718746
if filename:
719747
filename = dataobjects.getRasterSublayer(filename, self.param)
720-
items = self.combo.additionalItems()
721-
items.append(filename)
722-
self.combo.setAdditionalItems(items)
723-
self.combo.setCurrentIndex(self.combo.findText(filename))
748+
if isinstance(self.combo, QgsMapLayerComboBox):
749+
items = self.combo.additionalItems()
750+
items.append(filename)
751+
self.combo.setAdditionalItems(items)
752+
self.combo.setCurrentIndex(self.combo.findText(filename))
753+
else:
754+
self.combo.setEditText(filename)
724755

725756
def setValue(self, value):
726757
if self.dialogType == DIALOG_STANDARD:
727758
pass # TODO
728759
elif self.dialogType == DIALOG_BATCH:
729760
self.widget.setValue(value)
730761
else:
731-
self.setComboValue(value)
762+
self.setComboValue(value, combobox=self.combo)
732763

733764
def value(self):
734765
if self.dialogType == DIALOG_STANDARD:
@@ -748,7 +779,7 @@ def validator(v):
748779
return self.param.optional
749780
else:
750781
return os.path.exists(v)
751-
return self.comboValue(validator)
782+
return self.comboValue(validator, combobox=self.combo)
752783

753784

754785
class StringWidgetWrapper(WidgetWrapper):
@@ -911,33 +942,51 @@ def createWidget(self):
911942
elif self.dialogType == DIALOG_BATCH:
912943
return BatchInputSelectionPanel(self.param, self.row, self.col, self.dialog)
913944
else:
914-
widget = QComboBox()
945+
self.combo = QComboBox()
946+
layers = self.dialog.getAvailableValuesOfType(ParameterRaster, OutputRaster)
947+
self.combo.setEditable(True)
915948
tables = self.dialog.getAvailableValuesOfType(ParameterTable, OutputTable)
916949
layers = self.dialog.getAvailableValuesOfType(ParameterVector, OutputVector)
917950
if self.param.optional:
918-
widget.addItem(self.NOT_SELECTED, None)
951+
self.combo.addItem(self.NOT_SELECTED, None)
919952
for table in tables:
920-
widget.addItem(self.dialog.resolveValueDescription(table), table)
953+
self.combo.addItem(self.dialog.resolveValueDescription(table), table)
921954
for layer in layers:
922-
widget.addItem(self.dialog.resolveValueDescription(layer), layer)
955+
self.combo.addItem(self.dialog.resolveValueDescription(layer), layer)
956+
957+
widget = QWidget()
958+
layout = QHBoxLayout()
959+
layout.setMargin(0)
960+
layout.setContentsMargins(0, 0, 0, 0)
961+
layout.setSpacing(2)
962+
layout.addWidget(self.combo)
963+
btn = QToolButton()
964+
btn.setText('...')
965+
btn.setToolTip(self.tr("Select file"))
966+
btn.clicked.connect(self.selectFile)
967+
layout.addWidget(btn)
968+
widget.setLayout(layout)
923969
return widget
924970

925971
def selectFile(self):
926972
filename, selected_filter = self.getFileName(self.combo.currentText())
927973
if filename:
928974
filename = dataobjects.getRasterSublayer(filename, self.param)
929-
items = self.combo.additionalItems()
930-
items.append(filename)
931-
self.combo.setAdditionalItems(items)
932-
self.combo.setCurrentIndex(self.combo.findText(filename))
975+
if isinstance(self.combo, QgsMapLayerComboBox):
976+
items = self.combo.additionalItems()
977+
items.append(filename)
978+
self.combo.setAdditionalItems(items)
979+
self.combo.setCurrentIndex(self.combo.findText(filename))
980+
else:
981+
self.combo.setEditText(filename)
933982

934983
def setValue(self, value):
935984
if self.dialogType == DIALOG_STANDARD:
936985
pass # TODO
937986
elif self.dialogType == DIALOG_BATCH:
938987
return self.widget.setText(value)
939988
else:
940-
self.setComboValue(value)
989+
self.setComboValue(value, combobox=self.combo)
941990

942991
def value(self):
943992
if self.dialogType == DIALOG_STANDARD:
@@ -954,7 +1003,7 @@ def value(self):
9541003
else:
9551004
def validator(v):
9561005
return bool(v) or self.param.optional
957-
return self.comboValue(validator)
1006+
return self.comboValue(validator, combobox=self.combo)
9581007

9591008

9601009
class TableFieldWidgetWrapper(WidgetWrapper):

0 commit comments

Comments
 (0)