3131import locale
3232import os
3333
34- from qgis .core import QgsCoordinateReferenceSystem
34+ from qgis .core import QgsCoordinateReferenceSystem , QgsVectorLayer
3535from qgis .PyQt .QtWidgets import QCheckBox , QComboBox , QLineEdit , QPlainTextEdit
3636from qgis .PyQt .QtCore import pyqtSignal , QObject , QVariant
3737
4242from processing .gui .PointSelectionPanel import PointSelectionPanel
4343from processing .core .parameters import (ParameterBoolean , ParameterPoint , ParameterFile ,
4444 ParameterRaster , ParameterVector , ParameterNumber , ParameterString , ParameterTable ,
45- ParameterTableField , ParameterExtent , ParameterFixedTable , ParameterCrs )
45+ ParameterTableField , ParameterExtent , ParameterFixedTable , ParameterCrs , _resolveLayers )
4646from processing .core .ProcessingConfig import ProcessingConfig
4747from processing .gui .FileSelectionPanel import FileSelectionPanel
4848from 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
849841def GeometryPredicateWidgetWrapper (WidgetWrapper ):
850842
0 commit comments