5959 QgsProcessingParameterExpression ,
6060 QgsProcessingParameterTable ,
6161 QgsProcessingParameterTableField ,
62- QgsProcessingParameterFeatureSource )
62+ QgsProcessingParameterFeatureSource ,
63+ QgsProcessingFeatureSourceDefinition )
6364
6465from qgis .PyQt .QtWidgets import (
6566 QCheckBox ,
6667 QComboBox ,
6768 QDialog ,
6869 QFileDialog ,
6970 QHBoxLayout ,
71+ QVBoxLayout ,
7072 QLineEdit ,
7173 QPlainTextEdit ,
7274 QToolButton ,
@@ -760,7 +762,18 @@ def createWidget(self):
760762 btn .clicked .connect (self .selectFile )
761763 layout .addWidget (btn )
762764
763- widget .setLayout (layout )
765+ vl = QVBoxLayout ()
766+ vl .setMargin (0 )
767+ vl .setContentsMargins (0 , 0 , 0 , 0 )
768+ vl .setSpacing (2 )
769+ vl .addLayout (layout )
770+
771+ self .use_selection_checkbox = QCheckBox (self .tr ('Selected features only' ))
772+ self .use_selection_checkbox .setChecked (False )
773+ self .use_selection_checkbox .setEnabled (False )
774+ vl .addWidget (self .use_selection_checkbox )
775+
776+ widget .setLayout (vl )
764777
765778 filters = QgsMapLayerProxyModel .Filters ()
766779 if QgsProcessingParameterDefinition .TypeVectorAny in self .param .dataTypes ():
@@ -775,6 +788,8 @@ def createWidget(self):
775788 try :
776789 if iface .activeLayer ().type () == QgsMapLayer .VectorLayer :
777790 self .combo .setLayer (iface .activeLayer ())
791+ self .use_selection_checkbox .setEnabled (iface .activeLayer ().selectedFeatureCount () > 0 )
792+
778793 except :
779794 pass
780795
@@ -787,8 +802,7 @@ def createWidget(self):
787802 self .combo .setFilters (filters )
788803 self .combo .setExcludedProviders (['grass' ])
789804
790- self .combo .currentIndexChanged .connect (lambda : self .widgetValueHasChanged .emit (self ))
791- self .combo .currentTextChanged .connect (lambda : self .widgetValueHasChanged .emit (self ))
805+ self .combo .layerChanged .connect (self .layerChanged )
792806 return widget
793807
794808 elif self .dialogType == DIALOG_BATCH :
@@ -818,6 +832,14 @@ def createWidget(self):
818832 widget .setLayout (layout )
819833 return widget
820834
835+ def layerChanged (self , layer ):
836+ if not layer or layer .type () != QgsMapLayer .VectorLayer or layer .selectedFeatureCount () == 0 :
837+ self .use_selection_checkbox .setChecked (False )
838+ self .use_selection_checkbox .setEnabled (False )
839+ else :
840+ self .use_selection_checkbox .setEnabled (True )
841+ self .widgetValueHasChanged .emit (self )
842+
821843 def selectFile (self ):
822844 filename , selected_filter = self .getFileName (self .combo .currentText ())
823845 if filename :
@@ -840,14 +862,15 @@ def setValue(self, value):
840862
841863 def value (self ):
842864 if self .dialogType == DIALOG_STANDARD :
865+ use_selected_features = self .use_selection_checkbox .isChecked ()
843866 try :
844867 layer = self .combo .currentLayer ()
845868 if layer :
846- return layer .id ()
869+ return QgsProcessingFeatureSourceDefinition ( layer .id (), use_selected_features )
847870 else :
848- return self .combo .currentText ()
871+ return QgsProcessingFeatureSourceDefinition ( self .combo .currentText (), use_selected_features )
849872 except :
850- return self .combo .currentText ()
873+ return QgsProcessingFeatureSourceDefinition ( self .combo .currentText (), use_selected_features )
851874 elif self .dialogType == DIALOG_BATCH :
852875 return self .widget .value ()
853876 else :
0 commit comments