Use boolean wrapper in modeler algorithm dialog

This commit is contained in:
arnaud.morvan@camptocamp.com 2016-08-23 14:48:11 +02:00 committed by volaya
parent fbab369c0d
commit bb0938a5fe

View File

@ -40,6 +40,12 @@ from qgis.core import QgsNetworkAccessManager
from qgis.gui import QgsMessageBar from qgis.gui import QgsMessageBar
from processing.gui.wrappers import (
DIALOG_MODELER,
wrapper_from_param,
NotYetImplementedWidgetWrapper,
)
from processing.gui.CrsSelectionPanel import CrsSelectionPanel from processing.gui.CrsSelectionPanel import CrsSelectionPanel
from processing.gui.MultipleInputPanel import MultipleInputPanel from processing.gui.MultipleInputPanel import MultipleInputPanel
from processing.gui.FixedTablePanel import FixedTablePanel from processing.gui.FixedTablePanel import FixedTablePanel
@ -49,7 +55,6 @@ from processing.gui.GeometryPredicateSelectionPanel import \
from processing.core.parameters import (ParameterExtent, from processing.core.parameters import (ParameterExtent,
ParameterRaster, ParameterRaster,
ParameterVector, ParameterVector,
ParameterBoolean,
ParameterTable, ParameterTable,
ParameterFixedTable, ParameterFixedTable,
ParameterMultipleInput, ParameterMultipleInput,
@ -107,6 +112,7 @@ class ModelerParametersDialog(QDialog):
self.widgets = {} self.widgets = {}
self.checkBoxes = {} self.checkBoxes = {}
self.showAdvanced = False self.showAdvanced = False
self.widget_wrappers = {}
self.valueItems = {} self.valueItems = {}
self.dependentItems = {} self.dependentItems = {}
self.resize(650, 450) self.resize(650, 450)
@ -160,7 +166,9 @@ class ModelerParametersDialog(QDialog):
desc += self.tr('(x, y)') desc += self.tr('(x, y)')
label = QLabel(desc) label = QLabel(desc)
self.labels[param.name] = label self.labels[param.name] = label
widget = self.getWidgetFromParameter(param) wrapper = self.getWidgetWrapperFromParameter(param)
self.widget_wrappers[param.name] = wrapper
widget = wrapper.widget
self.valueItems[param.name] = widget self.valueItems[param.name] = widget
if param.name in list(tooltips.keys()): if param.name in list(tooltips.keys()):
tooltip = tooltips[param.name] tooltip = tooltips[param.name]
@ -308,6 +316,20 @@ class ModelerParametersDialog(QDialog):
alg = self.model.algs[value.alg] alg = self.model.algs[value.alg]
return self.tr("'%s' from algorithm '%s'") % (alg.algorithm.getOutputFromName(value.output).description, alg.description) return self.tr("'%s' from algorithm '%s'") % (alg.algorithm.getOutputFromName(value.output).description, alg.description)
def getWidgetWrapperFromParameter(self, param):
extra_values = []
values = self.getAvailableValuesOfType(param.__class__, None)
for value in values:
extra_values.append((self.resolveValueDescription(value), value))
wrapper = wrapper_from_param(param, DIALOG_MODELER, extra_values)
if wrapper is not None:
return wrapper
widget = self.getWidgetFromParameter(param)
wrapper = NotYetImplementedWidgetWrapper(param, widget)
return wrapper
def getWidgetFromParameter(self, param): def getWidgetFromParameter(self, param):
if isinstance(param, ParameterRaster): if isinstance(param, ParameterRaster):
item = QComboBox() item = QComboBox()
@ -333,17 +355,6 @@ class ModelerParametersDialog(QDialog):
item.addItem(self.resolveValueDescription(table), table) item.addItem(self.resolveValueDescription(table), table)
for layer in layers: for layer in layers:
item.addItem(self.resolveValueDescription(layer), layer) item.addItem(self.resolveValueDescription(layer), layer)
elif isinstance(param, ParameterBoolean):
item = QComboBox()
item.addItem('Yes')
item.addItem('No')
bools = self.getAvailableValuesOfType(ParameterBoolean, None)
for b in bools:
item.addItem(self.resolveValueDescription(b), b)
if param.default:
item.setCurrentIndex(0)
else:
item.setCurrentIndex(1)
elif isinstance(param, ParameterSelection): elif isinstance(param, ParameterSelection):
item = QComboBox() item = QComboBox()
item.addItems(param.options) item.addItems(param.options)
@ -487,11 +498,6 @@ class ModelerParametersDialog(QDialog):
combo.setEditText(str(value)) combo.setEditText(str(value))
elif isinstance(param, ParameterSelection): elif isinstance(param, ParameterSelection):
combo.setCurrentIndex(int(value)) combo.setCurrentIndex(int(value))
elif isinstance(param, ParameterBoolean):
if value:
combo.setCurrentIndex(0)
else:
combo.setCurrentIndex(1)
def setPreviousValues(self): def setPreviousValues(self):
if self._algName is not None: if self._algName is not None:
@ -500,11 +506,16 @@ class ModelerParametersDialog(QDialog):
for param in alg.algorithm.parameters: for param in alg.algorithm.parameters:
if param.hidden: if param.hidden:
continue continue
widget = self.valueItems[param.name]
if param.name in alg.params: if param.name in alg.params:
value = alg.params[param.name] value = alg.params[param.name]
else: else:
value = param.default value = param.default
wrapper = self.widget_wrappers[param.name]
if wrapper.implemented:
wrapper.setValue(value)
widget = wrapper.widget
if isinstance(param, ( if isinstance(param, (
ParameterRaster, ParameterRaster,
ParameterVector, ParameterVector,
@ -512,7 +523,6 @@ class ModelerParametersDialog(QDialog):
ParameterTableField, ParameterTableField,
ParameterSelection, ParameterSelection,
ParameterNumber, ParameterNumber,
ParameterBoolean,
ParameterExtent, ParameterExtent,
ParameterFile, ParameterFile,
ParameterPoint, ParameterPoint,
@ -567,7 +577,7 @@ class ModelerParametersDialog(QDialog):
for param in params: for param in params:
if param.hidden: if param.hidden:
continue continue
if not self.setParamValue(alg, param, self.valueItems[param.name]): if not self.setParamValue(alg, param, self.widget_wrappers[param.name]):
self.bar.pushMessage("Error", "Wrong or missing value for parameter '%s'" % param.description, self.bar.pushMessage("Error", "Wrong or missing value for parameter '%s'" % param.description,
level=QgsMessageBar.WARNING) level=QgsMessageBar.WARNING)
return None return None
@ -723,17 +733,15 @@ class ModelerParametersDialog(QDialog):
alg.params[param.name] = value alg.params[param.name] = value
return True return True
def setParamValue(self, alg, param, widget): def setParamValue(self, alg, param, wrapper):
if wrapper.implemented:
alg.params[param.name] = wrapper.value()
return True
widget = wrapper.widget
if isinstance(param, (ParameterRaster, ParameterVector, if isinstance(param, (ParameterRaster, ParameterVector,
ParameterTable)): ParameterTable)):
return self.setParamValueLayerOrTable(alg, param, widget) return self.setParamValueLayerOrTable(alg, param, widget)
elif isinstance(param, ParameterBoolean):
if widget.currentIndex() < 2:
value = widget.currentIndex() == 0
else:
value = widget.itemData(widget.currentIndex())
alg.params[param.name] = value
return True
elif isinstance(param, ParameterString): elif isinstance(param, ParameterString):
return self.setParamStringValue(alg, param, widget) return self.setParamStringValue(alg, param, widget)
elif isinstance(param, ParameterNumber): elif isinstance(param, ParameterNumber):