Skip to content

Commit 722e4fe

Browse files
volayanyalldawson
authored andcommittedJan 29, 2019
[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. (cherry picked from commit 6eaa511)
1 parent 421fe45 commit 722e4fe

File tree

1 file changed

+18
-2
lines changed

1 file changed

+18
-2
lines changed
 

‎python/plugins/processing/gui/wrappers.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
QgsSettings,
4646
QgsProject,
4747
QgsMapLayer,
48+
QgsVectorLayer,
4849
QgsProcessing,
4950
QgsProcessingUtils,
5051
QgsProcessingParameterDefinition,
@@ -78,7 +79,8 @@
7879
QgsProcessingModelChildParameterSource,
7980
QgsProcessingModelAlgorithm,
8081
QgsRasterDataProvider,
81-
NULL)
82+
NULL,
83+
Qgis)
8284

8385
from qgis.PyQt.QtWidgets import (
8486
QCheckBox,
@@ -1049,6 +1051,7 @@ class FeatureSourceWidgetWrapper(WidgetWrapper):
10491051
NOT_SELECTED = '[Not selected]'
10501052

10511053
def createWidget(self):
1054+
self.fileBasedLayers = {}
10521055
if self.dialogType == DIALOG_STANDARD:
10531056
widget = QWidget()
10541057
layout = QHBoxLayout()
@@ -1391,6 +1394,7 @@ class VectorLayerWidgetWrapper(WidgetWrapper):
13911394
NOT_SELECTED = '[Not selected]'
13921395

13931396
def createWidget(self):
1397+
self.fileBasedLayers = {}
13941398
if self.dialogType == DIALOG_STANDARD:
13951399
widget = QWidget()
13961400
layout = QHBoxLayout()
@@ -1576,14 +1580,26 @@ def postInitialize(self, wrappers):
15761580
break
15771581

15781582
def parentValueChanged(self, wrapper):
1579-
self.setLayer(wrapper.parameterValue())
1583+
value = wrapper.parameterValue()
1584+
if value in wrapper.fileBasedLayers:
1585+
self.setLayer(wrapper.fileBasedLayers[value])
1586+
else:
1587+
self.setLayer(value)
1588+
wrapper.fileBasedLayers[value] = self._layer
15801589

15811590
def setLayer(self, layer):
15821591
if isinstance(layer, QgsProcessingFeatureSourceDefinition):
15831592
layer, ok = layer.source.valueAsString(self.context.expressionContext())
15841593
if isinstance(layer, str):
15851594
layer = QgsProcessingUtils.mapLayerFromString(layer, self.context)
1595+
if not isinstance(layer, QgsVectorLayer) or not layer.isValid():
1596+
self.dialog.messageBar().clearWidgets()
1597+
self.dialog.messageBar().pushMessage("", self.tr("Could not load selected layer/table. Dependent field could not be populated"),
1598+
level=Qgis.Warning, duration=5)
1599+
return
1600+
15861601
self._layer = layer
1602+
15871603
self.refreshItems()
15881604

15891605
def refreshItems(self):

0 commit comments

Comments
 (0)
Please sign in to comment.