Skip to content

Commit 7f68734

Browse files
committed
[FEATURE][processing] Add checkbox for each vector input layer
to control whether selected features only are to be used Replaces the old global setting and makes it immediately obvious to users when the selection will be respected
1 parent 46596c5 commit 7f68734

File tree

2 files changed

+32
-9
lines changed

2 files changed

+32
-9
lines changed

python/plugins/processing/algs/qgis/Boundary.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,8 @@ def processAlgorithm(self, parameters, context, feedback):
8282
if QgsWkbTypes.hasM(input_wkb):
8383
output_wkb = QgsWkbTypes.addM(output_wkb)
8484

85-
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT_LAYER, context, '',
86-
source.fields(), output_wkb, source.crs())
85+
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT_LAYER, context,
86+
source.fields(), output_wkb, source.sourceCrs())
8787

8888
features = source.getFeatures()
8989
total = 100.0 / source.featureCount()

python/plugins/processing/gui/wrappers.py

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,16 @@
5959
QgsProcessingParameterExpression,
6060
QgsProcessingParameterTable,
6161
QgsProcessingParameterTableField,
62-
QgsProcessingParameterFeatureSource)
62+
QgsProcessingParameterFeatureSource,
63+
QgsProcessingFeatureSourceDefinition)
6364

6465
from 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

Comments
 (0)