Skip to content

Commit

Permalink
[processing] Fix hidden column names show in batch processing dialog,
Browse files Browse the repository at this point in the history
throwing the table contents out of sync with the headers

Also make code a bit more robust

Fixes qgis#38054
  • Loading branch information
nyalldawson committed Jul 31, 2020
1 parent b9f1f2c commit e19f27d
Showing 1 changed file with 18 additions and 30 deletions.
48 changes: 18 additions & 30 deletions python/plugins/processing/gui/BatchPanel.py
Original file line number Diff line number Diff line change
Expand Up @@ -470,7 +470,7 @@ def initWidgets(self):

# Determine column count
self.tblParameters.setColumnCount(
self.alg.countVisibleParameters())
len(self.alg.parameterDefinitions()))

# Table headers
column = 0
Expand All @@ -479,7 +479,7 @@ def initWidgets(self):
continue
self.tblParameters.setHorizontalHeaderItem(
column, QTableWidgetItem(param.description()))
if param.flags() & QgsProcessingParameterDefinition.FlagAdvanced:
if param.flags() & QgsProcessingParameterDefinition.FlagAdvanced or param.flags() & QgsProcessingParameterDefinition.FlagHidden:
self.tblParameters.setColumnHidden(column, True)

self.column_to_parameter_definition[column] = param.name()
Expand Down Expand Up @@ -512,8 +512,6 @@ def batchRowCount(self):
def clear(self):
self.tblParameters.setRowCount(1)
self.wrappers = []
self.column_to_parameter_definition = {}
self.parameter_to_column = {}

def load(self):
context = dataobjects.createContext()
Expand All @@ -537,26 +535,24 @@ def load(self):
self.addRow()
params = alg[self.PARAMETERS]
outputs = alg[self.OUTPUTS]
column = 0

for param in self.alg.parameterDefinitions():
if param.flags() & QgsProcessingParameterDefinition.FlagHidden:
continue
if param.isDestination():
continue
if param.name() in params:
column = self.parameter_to_column[param.name()]
value = eval(params[param.name()])
wrapper = self.wrappers[row][column]
wrapper.setParameterValue(value, context)
column += 1

for out in self.alg.destinationParameterDefinitions():
if out.flags() & QgsProcessingParameterDefinition.FlagHidden:
continue
if out.name() in outputs:
column = self.parameter_to_column[out.name()]
value = outputs[out.name()].strip("'")
widget = self.tblParameters.cellWidget(row + 1, column)
widget.setValue(value)
column += 1
except TypeError:
QMessageBox.critical(
self,
Expand All @@ -569,13 +565,12 @@ def save(self):
for row in range(self.batchRowCount()):
algParams = {}
algOutputs = {}
col = 0
alg = self.alg
for param in alg.parameterDefinitions():
if param.flags() & QgsProcessingParameterDefinition.FlagHidden:
continue
if param.isDestination():
continue

col = self.parameter_to_column[param.name()]
wrapper = self.wrappers[row][col]

# For compatibility with 3.x API, we need to check whether the wrapper is
Expand All @@ -595,15 +590,15 @@ def save(self):
self.parent.messageBar().pushMessage("", msg, level=Qgis.Warning, duration=5)
return
algParams[param.name()] = param.valueAsPythonString(value, context)
col += 1

for out in alg.destinationParameterDefinitions():
if out.flags() & QgsProcessingParameterDefinition.FlagHidden:
continue
col = self.parameter_to_column[out.name()]
widget = self.tblParameters.cellWidget(row + 1, col)
text = widget.getValue()
if text.strip() != '':
algOutputs[out.name()] = text.strip()
col += 1
else:
self.parent.messageBar().pushMessage("",
self.tr('Wrong or missing output value: {0} (row {1})').format(
Expand Down Expand Up @@ -668,31 +663,23 @@ def addRow(self):

wrappers = {}
row = self.tblParameters.rowCount() - 1
column = 0
for param in self.alg.parameterDefinitions():
if param.flags() & QgsProcessingParameterDefinition.FlagHidden or param.isDestination():
if param.isDestination():
continue

column = self.parameter_to_column[param.name()]
wrapper = WidgetWrapperFactory.create_wrapper(param, self.parent, row, column)
wrappers[param.name()] = wrapper
self.setCellWrapper(row, column, wrapper, context)
column += 1

for out in self.alg.destinationParameterDefinitions():
if out.flags() & QgsProcessingParameterDefinition.FlagHidden:
continue

column = self.parameter_to_column[out.name()]
self.tblParameters.setCellWidget(
row, column, BatchOutputSelectionPanel(
out, self.alg, row, column, self))
column += 1

if len(self.alg.destinationParameterDefinitions()) > 0:
item = QComboBox()
item.addItem(self.tr('Yes'))
item.addItem(self.tr('No'))
item.setCurrentIndex(0)
self.tblParameters.setCellWidget(row, column, item)

for wrapper in list(wrappers.values()):
wrapper.postInitialize(list(wrappers.values()))
Expand All @@ -713,7 +700,7 @@ def removeRows(self):

def toggleAdvancedMode(self, checked):
for param in self.alg.parameterDefinitions():
if param.flags() & QgsProcessingParameterDefinition.FlagAdvanced:
if param.flags() & QgsProcessingParameterDefinition.FlagAdvanced and not (param.flags() & QgsProcessingParameterDefinition.FlagHidden):
self.tblParameters.setColumnHidden(self.parameter_to_column[param.name()], not checked)

def valueForParameter(self, row, parameter_name):
Expand All @@ -727,11 +714,11 @@ def parametersForRow(self, row, destinationProject=None, warnOnInvalid=True):
"""
Returns the parameters dictionary corresponding to a row in the batch table
"""
col = 0
parameters = {}
for param in self.alg.parameterDefinitions():
if param.flags() & QgsProcessingParameterDefinition.FlagHidden or param.isDestination():
if param.isDestination():
continue
col = self.parameter_to_column[param.name()]
wrapper = self.wrappers[row][col]
parameters[param.name()] = wrapper.parameterValue()
if warnOnInvalid and not param.checkValueIsAcceptable(wrapper.parameterValue()):
Expand All @@ -740,12 +727,14 @@ def parametersForRow(self, row, destinationProject=None, warnOnInvalid=True):
param.description(), row + 1),
level=Qgis.Warning, duration=5)
return {}, False
col += 1

count_visible_outputs = 0
for out in self.alg.destinationParameterDefinitions():
if out.flags() & QgsProcessingParameterDefinition.FlagHidden:
continue

col = self.parameter_to_column[out.name()]

count_visible_outputs += 1
widget = self.tblParameters.cellWidget(row + 1, col)
text = widget.getValue()
Expand All @@ -757,7 +746,6 @@ def parametersForRow(self, row, destinationProject=None, warnOnInvalid=True):
parameters[out.name()] = QgsProcessingOutputLayerDefinition(text, destinationProject)
else:
parameters[out.name()] = text
col += 1
else:
msg = self.tr('Wrong or missing output value: {0} (row {1})').format(out.description(), row + 1)
self.parent.messageBar().pushMessage("", msg, level=Qgis.Warning, duration=5)
Expand Down

0 comments on commit e19f27d

Please sign in to comment.