mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-17 00:04:02 -04:00
[processing] show warning when file-based layer could not be loaded and dependent params updated
For algorithms with multiple parameters depending on a vector layer parameter, the code that loads the layer in the background is called repeatedly, impacting performance. A small layer cache is implemented with these changes, so the dialog only tries to load the layer once.
This commit is contained in:
parent
8446d3bdf0
commit
6eaa511eed
@ -45,6 +45,7 @@ from qgis.core import (
|
|||||||
QgsSettings,
|
QgsSettings,
|
||||||
QgsProject,
|
QgsProject,
|
||||||
QgsMapLayer,
|
QgsMapLayer,
|
||||||
|
QgsVectorLayer,
|
||||||
QgsProcessing,
|
QgsProcessing,
|
||||||
QgsProcessingUtils,
|
QgsProcessingUtils,
|
||||||
QgsProcessingParameterDefinition,
|
QgsProcessingParameterDefinition,
|
||||||
@ -79,7 +80,8 @@ from qgis.core import (
|
|||||||
QgsProcessingModelChildParameterSource,
|
QgsProcessingModelChildParameterSource,
|
||||||
QgsProcessingModelAlgorithm,
|
QgsProcessingModelAlgorithm,
|
||||||
QgsRasterDataProvider,
|
QgsRasterDataProvider,
|
||||||
NULL)
|
NULL,
|
||||||
|
Qgis)
|
||||||
|
|
||||||
from qgis.PyQt.QtWidgets import (
|
from qgis.PyQt.QtWidgets import (
|
||||||
QCheckBox,
|
QCheckBox,
|
||||||
@ -1088,6 +1090,7 @@ class FeatureSourceWidgetWrapper(WidgetWrapper):
|
|||||||
NOT_SELECTED = '[Not selected]'
|
NOT_SELECTED = '[Not selected]'
|
||||||
|
|
||||||
def createWidget(self):
|
def createWidget(self):
|
||||||
|
self.fileBasedLayers = {}
|
||||||
if self.dialogType == DIALOG_STANDARD:
|
if self.dialogType == DIALOG_STANDARD:
|
||||||
widget = QWidget()
|
widget = QWidget()
|
||||||
layout = QHBoxLayout()
|
layout = QHBoxLayout()
|
||||||
@ -1430,6 +1433,7 @@ class VectorLayerWidgetWrapper(WidgetWrapper):
|
|||||||
NOT_SELECTED = '[Not selected]'
|
NOT_SELECTED = '[Not selected]'
|
||||||
|
|
||||||
def createWidget(self):
|
def createWidget(self):
|
||||||
|
self.fileBasedLayers = {}
|
||||||
if self.dialogType == DIALOG_STANDARD:
|
if self.dialogType == DIALOG_STANDARD:
|
||||||
widget = QWidget()
|
widget = QWidget()
|
||||||
layout = QHBoxLayout()
|
layout = QHBoxLayout()
|
||||||
@ -1615,14 +1619,26 @@ class TableFieldWidgetWrapper(WidgetWrapper):
|
|||||||
break
|
break
|
||||||
|
|
||||||
def parentValueChanged(self, wrapper):
|
def parentValueChanged(self, wrapper):
|
||||||
self.setLayer(wrapper.parameterValue())
|
value = wrapper.parameterValue()
|
||||||
|
if value in wrapper.fileBasedLayers:
|
||||||
|
self.setLayer(wrapper.fileBasedLayers[value])
|
||||||
|
else:
|
||||||
|
self.setLayer(value)
|
||||||
|
wrapper.fileBasedLayers[value] = self._layer
|
||||||
|
|
||||||
def setLayer(self, layer):
|
def setLayer(self, layer):
|
||||||
if isinstance(layer, QgsProcessingFeatureSourceDefinition):
|
if isinstance(layer, QgsProcessingFeatureSourceDefinition):
|
||||||
layer, ok = layer.source.valueAsString(self.context.expressionContext())
|
layer, ok = layer.source.valueAsString(self.context.expressionContext())
|
||||||
if isinstance(layer, str):
|
if isinstance(layer, str):
|
||||||
layer = QgsProcessingUtils.mapLayerFromString(layer, self.context)
|
layer = QgsProcessingUtils.mapLayerFromString(layer, self.context)
|
||||||
|
if not isinstance(layer, QgsVectorLayer) or not layer.isValid():
|
||||||
|
self.dialog.messageBar().clearWidgets()
|
||||||
|
self.dialog.messageBar().pushMessage("", self.tr("Could not load selected layer/table. Dependent field could not be populated"),
|
||||||
|
level=Qgis.Warning, duration=5)
|
||||||
|
return
|
||||||
|
|
||||||
self._layer = layer
|
self._layer = layer
|
||||||
|
|
||||||
self.refreshItems()
|
self.refreshItems()
|
||||||
|
|
||||||
def refreshItems(self):
|
def refreshItems(self):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user