Skip to content

Commit 9e36582

Browse files
arnaud-morvanvolaya
authored andcommitted
Simplify TableFieldWidgetWrapper
Conflicts: python/plugins/processing/gui/ParametersPanel.py python/plugins/processing/gui/wrappers.py
1 parent c1bc364 commit 9e36582

File tree

2 files changed

+48
-62
lines changed

2 files changed

+48
-62
lines changed

python/plugins/processing/gui/ParametersPanel.py

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -165,10 +165,4 @@ def buttonToggled(self, value):
165165
button.setChecked(False)
166166

167167
def getWidgetWrapperFromParameter(self, param):
168-
wrapper = param.wrapper(self.parent)
169-
wrapper.widgetValueHasChanged.connect(self.widgetValueHasChanged)
170-
return wrapper
171-
172-
def widgetValueHasChanged(self, wrapper):
173-
for wrapper in self.wrappers.values():
174-
wrapper.anotherParameterWidgetHasChanged(wrapper)
168+
return param.wrapper(self.parent)

python/plugins/processing/gui/wrappers.py

Lines changed: 47 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
import locale
3232
import os
3333

34-
from qgis.core import QgsCoordinateReferenceSystem
34+
from qgis.core import QgsCoordinateReferenceSystem, QgsVectorLayer
3535
from qgis.PyQt.QtWidgets import QCheckBox, QComboBox, QLineEdit, QPlainTextEdit
3636
from qgis.PyQt.QtCore import pyqtSignal, QObject, QVariant
3737

@@ -42,7 +42,7 @@
4242
from processing.gui.PointSelectionPanel import PointSelectionPanel
4343
from processing.core.parameters import (ParameterBoolean, ParameterPoint, ParameterFile,
4444
ParameterRaster, ParameterVector, ParameterNumber, ParameterString, ParameterTable,
45-
ParameterTableField, ParameterExtent, ParameterFixedTable, ParameterCrs)
45+
ParameterTableField, ParameterExtent, ParameterFixedTable, ParameterCrs, _resolveLayers)
4646
from processing.core.ProcessingConfig import ProcessingConfig
4747
from processing.gui.FileSelectionPanel import FileSelectionPanel
4848
from processing.core.outputs import (OutputFile, OutputRaster, OutputVector, OutputNumber,
@@ -97,8 +97,7 @@ def comboValue(self, validator=None):
9797
if validator is not None and not validator(v):
9898
raise InvalidParameterValue()
9999
return v
100-
else:
101-
return self.widget.itemData(self.widget.currentIndex())
100+
return self.widget.itemData(self.widget.currentIndex())
102101

103102
def createWidget(self):
104103
pass
@@ -125,9 +124,6 @@ def setComboValue(self, value):
125124
def value(self):
126125
pass
127126

128-
def anotherParameterWidgetHasChanged(self, wrapper):
129-
pass
130-
131127
def postInitialize(self, wrappers):
132128
pass
133129

@@ -403,7 +399,9 @@ def createWidget(self):
403399
opts = [getExtendedLayerName(opt) for opt in options]
404400
return MultipleInputPanel(opts)
405401
elif self.dialogType == DIALOG_BATCH:
406-
return BatchInputSelectionPanel(self.param, self.row, self.col, self.dialog)
402+
widget = BatchInputSelectionPanel(self.param, self.row, self.col, self.dialog)
403+
widget.textChanged
404+
return widget
407405
else:
408406
options = [self.dialog.resolveValueDescription(opt) for opt in self._getOptions()]
409407
return MultipleInputPanel(options)
@@ -557,9 +555,12 @@ def createWidget(self):
557555
if self.dialogType == DIALOG_STANDARD:
558556
widget = QComboBox()
559557
self._populate(widget)
558+
widget.currentIndexChanged.connect(lambda: self.widgetValueHasChanged.emit(self))
560559
return widget
561560
elif self.dialogType == DIALOG_BATCH:
562-
return BatchInputSelectionPanel(self.param, self.row, self.col, self.dialog)
561+
widget = BatchInputSelectionPanel(self.param, self.row, self.col, self.dialog)
562+
widget.valueChanged.connect(lambda: self.widgetValueHasChanged.emit(self))
563+
return widget
563564
else:
564565
widget = QComboBox()
565566
layers = self.dialog.getAvailableValuesOfType(ParameterVector, OutputVector)
@@ -578,7 +579,6 @@ def _populate(self, widget):
578579
widget.addItem(self.NOT_SELECTED, None)
579580
for layer in layers:
580581
widget.addItem(getExtendedLayerName(layer), layer)
581-
widget.currentIndexChanged.connect(lambda: self.widgetValueHasChanged.emit(self))
582582
widget.name = self.param.name
583583

584584
def refresh(self):
@@ -588,19 +588,18 @@ def setValue(self, value):
588588
if self.dialogType == DIALOG_STANDARD:
589589
pass # TODO
590590
elif self.dialogType == DIALOG_BATCH:
591-
self.widget.setText(value)
591+
self.widget.setValue(value)
592592
else:
593593
self.setComboValue(value)
594594

595-
596595
def value(self):
597596
if self.dialogType == DIALOG_STANDARD:
598597
try:
599598
return self.widget.itemData(self.widget.currentIndex())
600599
except:
601600
return self.widget.getValue()
602601
elif self.dialogType == DIALOG_BATCH:
603-
return self.widget.getText()
602+
return self.widget.value()
604603
else:
605604
def validator(v):
606605
if not bool(v):
@@ -736,19 +735,18 @@ class TableFieldWidgetWrapper(WidgetWrapper):
736735
NOT_SET = '[Not set]'
737736

738737
def createWidget(self):
738+
self._layer = None
739+
739740
if self.param.multiple:
740741
if self.dialogType == DIALOG_STANDARD:
741-
return MultipleInputPanel(options=[])
742+
return MultipleInputPanel(options=[])
742743
else:
743744
return QLineEdit()
744745
else:
745-
if self.dialogType == DIALOG_STANDARD:
746+
if self.dialogType in (DIALOG_STANDARD, DIALOG_BATCH):
746747
widget = QComboBox()
747-
return widget
748-
elif self.dialogType == DIALOG_BATCH:
749-
widget = QLineEdit()
750-
if self.param.default:
751-
widget.setText(self.param.default)
748+
if self.dialogType == DIALOG_BATCH:
749+
widget.setEditable(True) # Should be removed at the end
752750
return widget
753751
else:
754752
widget = QComboBox()
@@ -763,28 +761,42 @@ def createWidget(self):
763761
def postInitialize(self, wrappers):
764762
for wrapper in wrappers:
765763
if wrapper.param.name == self.param.parent:
766-
layer = wrapper.widget.itemData(wrapper.widget.currentIndex())
767-
if layer is not None:
768-
fields = self.getFields(layer, wrapper.param.datatype)
769-
if self.param.multiple:
770-
self.widget.updateForOptions(fields)
771-
else:
772-
self.widget.clear()
773-
if self.param.optional:
774-
self.widget.addItem(self.tr(self.NOT_SET))
775-
self.widget.addItems(fields)
764+
# self.refreshItems()
765+
if self.dialogType in (DIALOG_STANDARD, DIALOG_BATCH):
766+
self.setLayer(wrapper.value())
767+
wrapper.widgetValueHasChanged.connect(self.parentValueChanged)
776768
break
777769

778-
def getFields(self, layer, datatype):
770+
def parentValueChanged(self, wrapper):
771+
self.setLayer(wrapper.value())
772+
773+
def setLayer(self, layer):
774+
if isinstance(layer, basestring):
775+
layer = dataobjects.getObjectFromUri(_resolveLayers(layer))
776+
self._layer = layer
777+
self.refreshItems()
778+
779+
def refreshItems(self):
780+
if self.param.multiple:
781+
self.widget.updateForOptions(self.getFields())
782+
else:
783+
self.widget.clear()
784+
if self.param.optional:
785+
self.widget.addItem(self.tr(self.NOT_SET))
786+
self.widget.addItems(self.getFields())
787+
788+
def getFields(self):
789+
if self._layer is None:
790+
return []
779791
fieldTypes = []
780-
if datatype == ParameterTableField.DATA_TYPE_STRING:
792+
if self.param.datatype == ParameterTableField.DATA_TYPE_STRING:
781793
fieldTypes = [QVariant.String]
782-
elif datatype == ParameterTableField.DATA_TYPE_NUMBER:
794+
elif self.param.datatype == ParameterTableField.DATA_TYPE_NUMBER:
783795
fieldTypes = [QVariant.Int, QVariant.Double, QVariant.LongLong,
784796
QVariant.UInt, QVariant.ULongLong]
785797

786798
fieldNames = set()
787-
for field in layer.fields():
799+
for field in self._layer.fields():
788800
if not fieldTypes or field.type() in fieldTypes:
789801
fieldNames.add(unicode(field.name()))
790802
return sorted(list(fieldNames), cmp=locale.strcoll)
@@ -802,13 +814,8 @@ def setValue(self, value):
802814
self.widget.setText(value)
803815
else:
804816
if self.dialogType == DIALOG_STANDARD:
805-
pass # TODO
806-
elif self.dialogType == DIALOG_BATCH:
807-
return self.widget.setText(value)
808-
else:
809817
self.setComboValue(value)
810818

811-
812819
def value(self):
813820
if self.param.multiple:
814821
if self.dialogType == DIALOG_STANDARD:
@@ -821,30 +828,15 @@ def value(self):
821828
raise InvalidParameterValue()
822829
return text
823830
else:
824-
if self.dialogType == DIALOG_STANDARD:
831+
if self.dialogType in (DIALOG_STANDARD, DIALOG_BATCH):
825832
if self.param.optional and self.widget.currentIndex() == 0:
826833
return None
827834
return self.widget.currentText()
828-
elif self.dialogType == DIALOG_BATCH:
829-
return self.widget.text()
830835
else:
831836
def validator(v):
832837
return bool(v) or self.param.optional
833838
return self.comboValue(validator)
834839

835-
def anotherParameterWidgetHasChanged(self, wrapper):
836-
if wrapper.param.name == self.param.parent:
837-
layer = wrapper.value()
838-
if layer is not None:
839-
fields = self.getFields(layer, wrapper.param.datatype)
840-
if self.param.multiple:
841-
self.widget.updateForOptions(fields)
842-
else:
843-
self.widget.clear()
844-
if self.param.optional:
845-
self.widget.addItem(self.tr(self.NOT_SET))
846-
self.widget.addItems(fields)
847-
848840

849841
def GeometryPredicateWidgetWrapper(WidgetWrapper):
850842

0 commit comments

Comments
 (0)