Skip to content

Commit

Permalink
Ensure that createProcessingParameters implementation in AlgorithmDia…
Browse files Browse the repository at this point in the history
…log won't leak exceptions to c++ callers
  • Loading branch information
nyalldawson committed Dec 16, 2021
1 parent 86794da commit 5333f17
Showing 1 changed file with 46 additions and 25 deletions.
71 changes: 46 additions & 25 deletions python/plugins/processing/gui/AlgorithmDialog.py
Expand Up @@ -110,11 +110,50 @@ def blockAdditionalControlsWhileRunning(self):
def setParameters(self, parameters):
self.mainWidget().setParameters(parameters)

def flag_invalid_parameter_value(self, message: str, widget):
"""
Highlights a parameter with an invalid value
"""
try:
self.buttonBox().accepted.connect(lambda w=widget:
w.setPalette(QPalette()))
palette = widget.palette()
palette.setColor(QPalette.Base, QColor(255, 255, 0))
widget.setPalette(palette)
except:
pass
self.messageBar().clearWidgets()
self.messageBar().pushMessage("", self.tr("Wrong or missing parameter value: {0}").format(
message),
level=Qgis.Warning, duration=5)

def flag_invalid_output_extension(self, message: str, widget):
"""
Highlights a parameter with an invalid output extension
"""
try:
self.buttonBox().accepted.connect(lambda w=widget:
w.setPalette(QPalette()))
palette = widget.palette()
palette.setColor(QPalette.Base, QColor(255, 255, 0))
widget.setPalette(palette)
except:
pass
self.messageBar().clearWidgets()
self.messageBar().pushMessage("", message,
level=Qgis.Warning, duration=5)

def createProcessingParameters(self, flags=QgsProcessingParametersGenerator.Flags()):
if self.mainWidget() is None:
return {}

return self.mainWidget().createProcessingParameters(flags)
try:
return self.mainWidget().createProcessingParameters(flags)
except AlgorithmDialogBase.InvalidParameterValue as e:
self.flag_invalid_parameter_value(e.parameter.description(), e.widget)
except AlgorithmDialogBase.InvalidOutputExtension as e:
self.flag_invalid_output_extension(e.message, e.widget)
return {}

def runAlgorithm(self):
self.feedback = self.createFeedback()
Expand All @@ -123,7 +162,10 @@ def runAlgorithm(self):

checkCRS = ProcessingConfig.getSetting(ProcessingConfig.WARN_UNMATCHING_CRS)
try:
parameters = self.createProcessingParameters()
# messy as all heck, but we don't want to call the dialog's implementation of
# createProcessingParameters as we want to catch the exceptions raised by the
# parameter panel instead...
parameters = {} if self.mainWidget() is None else self.mainWidget().createProcessingParameters()

if checkCRS and not self.algorithm().validateInputCrs(parameters, self.context):
reply = QMessageBox.question(self, self.tr("Unmatching CRS's"),
Expand Down Expand Up @@ -273,30 +315,9 @@ def on_complete(ok, results):
on_complete(ok, results)

except AlgorithmDialogBase.InvalidParameterValue as e:
try:
self.buttonBox().accepted.connect(lambda e=e:
e.widget.setPalette(QPalette()))
palette = e.widget.palette()
palette.setColor(QPalette.Base, QColor(255, 255, 0))
e.widget.setPalette(palette)
except:
pass
self.messageBar().clearWidgets()
self.messageBar().pushMessage("", self.tr("Wrong or missing parameter value: {0}").format(
e.parameter.description()),
level=Qgis.Warning, duration=5)
self.flag_invalid_parameter_value(e.parameter.description(), e.widget)
except AlgorithmDialogBase.InvalidOutputExtension as e:
try:
self.buttonBox().accepted.connect(lambda e=e:
e.widget.setPalette(QPalette()))
palette = e.widget.palette()
palette.setColor(QPalette.Base, QColor(255, 255, 0))
e.widget.setPalette(palette)
except:
pass
self.messageBar().clearWidgets()
self.messageBar().pushMessage("", e.message,
level=Qgis.Warning, duration=5)
self.flag_invalid_output_extension(e.message, e.widget)

def finish(self, successful, result, context, feedback, in_place=False):
keepOpen = not successful or ProcessingConfig.getSetting(ProcessingConfig.KEEP_DIALOG_OPEN)
Expand Down

0 comments on commit 5333f17

Please sign in to comment.