[processing] Ensure parameters linked to layer parameters

(e.g. field choices) are correctly updated when a layer
is selected which doesn't belong to the project
This commit is contained in:
Nyall Dawson 2018-05-21 16:05:36 +10:00
parent 4ec9e00a73
commit c5ff6b9c99

View File

@ -901,6 +901,7 @@ class MapLayerWidgetWrapper(WidgetWrapper):
self.combo.setCurrentIndex(self.combo.findText(filename))
else:
self.combo.setEditText(filename)
self.widgetValueHasChanged.emit(self)
def setValue(self, value):
if value is None or value == NULL:
@ -918,6 +919,7 @@ class MapLayerWidgetWrapper(WidgetWrapper):
self.widget.setText(value)
else:
self.setComboValue(value, combobox=self.combo)
self.widgetValueHasChanged.emit(self)
def value(self):
if self.dialogType == DIALOG_STANDARD:
@ -962,6 +964,7 @@ class RasterWidgetWrapper(MapLayerWidgetWrapper):
self.combo.setCurrentIndex(self.combo.findText(filename))
else:
self.combo.setEditText(filename)
self.widgetValueHasChanged.emit(self)
class EnumWidgetWrapper(WidgetWrapper):
@ -1136,6 +1139,7 @@ class FeatureSourceWidgetWrapper(WidgetWrapper):
self.combo.setCurrentIndex(self.combo.findText(filename))
else:
self.combo.setEditText(filename)
self.widgetValueHasChanged.emit(self)
def setValue(self, value):
if value is None or value == NULL:
@ -1153,6 +1157,7 @@ class FeatureSourceWidgetWrapper(WidgetWrapper):
self.widget.setValue(value)
else:
self.setComboValue(value, combobox=self.combo)
self.widgetValueHasChanged.emit(self)
def value(self):
if self.dialogType == DIALOG_STANDARD:
@ -1280,6 +1285,10 @@ class StringWidgetWrapper(WidgetWrapper):
class ExpressionWidgetWrapper(WidgetWrapper):
def __init__(self, param, dialog, row=0, col=0, **kwargs):
super().__init__(param, dialog, row, col, **kwargs)
self.context = dataobjects.createContext()
def createWidget(self):
if self.dialogType in (DIALOG_STANDARD, DIALOG_BATCH):
if self.param.parentLayerParameterName():
@ -1312,11 +1321,10 @@ class ExpressionWidgetWrapper(WidgetWrapper):
self.setLayer(wrapper.value())
def setLayer(self, layer):
context = dataobjects.createContext()
if isinstance(layer, QgsProcessingFeatureSourceDefinition):
layer, ok = layer.source.valueAsString(context.expressionContext())
layer, ok = layer.source.valueAsString(self.context.expressionContext())
if isinstance(layer, str):
layer = QgsProcessingUtils.mapLayerFromString(layer, context)
layer = QgsProcessingUtils.mapLayerFromString(layer, self.context)
self.widget.setLayer(layer)
def setValue(self, value):
@ -1433,6 +1441,7 @@ class VectorLayerWidgetWrapper(WidgetWrapper):
self.combo.setCurrentIndex(self.combo.findText(filename))
else:
self.combo.setEditText(filename)
self.widgetValueHasChanged.emit(self)
def setValue(self, value):
if value is None or value == NULL:
@ -1450,6 +1459,7 @@ class VectorLayerWidgetWrapper(WidgetWrapper):
return self.widget.setText(value)
else:
self.setComboValue(value, combobox=self.combo)
self.widgetValueHasChanged.emit(self)
def value(self):
if self.dialogType == DIALOG_STANDARD:
@ -1473,6 +1483,10 @@ class VectorLayerWidgetWrapper(WidgetWrapper):
class TableFieldWidgetWrapper(WidgetWrapper):
NOT_SET = '[Not set]'
def __init__(self, param, dialog, row=0, col=0, **kwargs):
super().__init__(param, dialog, row, col, **kwargs)
self.context = dataobjects.createContext()
def createWidget(self):
self._layer = None
@ -1516,11 +1530,10 @@ class TableFieldWidgetWrapper(WidgetWrapper):
self.setLayer(wrapper.value())
def setLayer(self, layer):
context = dataobjects.createContext()
if isinstance(layer, QgsProcessingFeatureSourceDefinition):
layer, ok = layer.source.valueAsString(context.expressionContext())
layer, ok = layer.source.valueAsString(self.context.expressionContext())
if isinstance(layer, str):
layer = QgsProcessingUtils.mapLayerFromString(layer, context)
layer = QgsProcessingUtils.mapLayerFromString(layer, self.context)
self._layer = layer
self.refreshItems()
@ -1595,6 +1608,10 @@ class TableFieldWidgetWrapper(WidgetWrapper):
class BandWidgetWrapper(WidgetWrapper):
NOT_SET = '[Not set]'
def __init__(self, param, dialog, row=0, col=0, **kwargs):
super().__init__(param, dialog, row, col, **kwargs)
self.context = dataobjects.createContext()
def createWidget(self):
self._layer = None
@ -1626,11 +1643,10 @@ class BandWidgetWrapper(WidgetWrapper):
self.setLayer(wrapper.value())
def setLayer(self, layer):
context = dataobjects.createContext()
if isinstance(layer, QgsProcessingParameterRasterLayer):
layer, ok = layer.source.valueAsString(context.expressionContext())
layer, ok = layer.source.valueAsString(self.context.expressionContext())
if isinstance(layer, str):
layer = QgsProcessingUtils.mapLayerFromString(layer, context)
layer = QgsProcessingUtils.mapLayerFromString(layer, self.context)
self._layer = layer
self.refreshItems()