78#include <QPlainTextEdit>
79#include <QRadioButton>
80#include <QButtonGroup>
94 QVBoxLayout *vlayout =
new QVBoxLayout();
95 vlayout->setContentsMargins( 0, 0, 0, 0 );
97 mDefaultCheckBox =
new QCheckBox( tr(
"Checked" ) );
101 mDefaultCheckBox->setChecked(
false );
102 vlayout->addWidget( mDefaultCheckBox );
103 setLayout( vlayout );
108 auto param = std::make_unique< QgsProcessingParameterBoolean >( name, description, mDefaultCheckBox->isChecked() );
109 param->setFlags( flags );
110 return param.release();
120QWidget *QgsProcessingBooleanWidgetWrapper::createWidget()
126 QString description = parameterDefinition()->description();
128 description = QObject::tr(
"%1 [optional]" ).arg( description );
130 mCheckBox =
new QCheckBox( description );
131 mCheckBox->setToolTip( parameterDefinition()->toolTip() );
133 connect( mCheckBox, &QCheckBox::toggled,
this, [ = ]
135 emit widgetValueHasChanged(
this );
143 mComboBox =
new QComboBox();
144 mComboBox->addItem( tr(
"Yes" ),
true );
145 mComboBox->addItem( tr(
"No" ),
false );
146 mComboBox->setToolTip( parameterDefinition()->toolTip() );
148 connect( mComboBox, qOverload< int>( &QComboBox::currentIndexChanged ),
this, [ = ]
150 emit widgetValueHasChanged(
this );
159QLabel *QgsProcessingBooleanWidgetWrapper::createLabel()
168void QgsProcessingBooleanWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext &context )
175 mCheckBox->setChecked( v );
183 mComboBox->setCurrentIndex( mComboBox->findData( v ) );
189QVariant QgsProcessingBooleanWidgetWrapper::widgetValue()
const
194 return mCheckBox->isChecked();
198 return mComboBox->currentData();
203QStringList QgsProcessingBooleanWidgetWrapper::compatibleParameterTypes()
const
227QStringList QgsProcessingBooleanWidgetWrapper::compatibleOutputTypes()
const
239QString QgsProcessingBooleanWidgetWrapper::parameterType()
const
246 return new QgsProcessingBooleanWidgetWrapper( parameter, type );
251 return new QgsProcessingBooleanParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
262 QVBoxLayout *vlayout =
new QVBoxLayout();
263 vlayout->setContentsMargins( 0, 0, 0, 0 );
265 vlayout->addWidget(
new QLabel( tr(
"Default value" ) ) );
270 mCrsSelector->setShowAccuracyWarnings(
true );
277 vlayout->addWidget( mCrsSelector );
278 setLayout( vlayout );
283 auto param = std::make_unique< QgsProcessingParameterCrs >( name, description, mCrsSelector->crs().authid() );
284 param->setFlags( flags );
285 return param.release();
294QWidget *QgsProcessingCrsWidgetWrapper::createWidget()
296 Q_ASSERT( mProjectionSelectionWidget ==
nullptr );
298 mProjectionSelectionWidget->setToolTip( parameterDefinition()->toolTip() );
307 emit widgetValueHasChanged(
this );
315 return mProjectionSelectionWidget;
320 QWidget *w =
new QWidget();
321 w->setToolTip( parameterDefinition()->toolTip() );
323 QVBoxLayout *vl =
new QVBoxLayout();
324 vl->setContentsMargins( 0, 0, 0, 0 );
327 mUseProjectCrsCheckBox =
new QCheckBox( tr(
"Use project CRS" ) );
328 mUseProjectCrsCheckBox->setToolTip( tr(
"Always use the current project CRS when running the model" ) );
329 vl->addWidget( mUseProjectCrsCheckBox );
330 connect( mUseProjectCrsCheckBox, &QCheckBox::toggled, mProjectionSelectionWidget, &QgsProjectionSelectionWidget::setDisabled );
331 connect( mUseProjectCrsCheckBox, &QCheckBox::toggled,
this, [ = ]
333 emit widgetValueHasChanged(
this );
336 vl->addWidget( mProjectionSelectionWidget );
344void QgsProcessingCrsWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext &context )
346 if ( mUseProjectCrsCheckBox )
348 if ( value.toString().compare( QLatin1String(
"ProjectCrs" ), Qt::CaseInsensitive ) == 0 )
350 mUseProjectCrsCheckBox->setChecked(
true );
355 mUseProjectCrsCheckBox->setChecked(
false );
360 if ( mProjectionSelectionWidget )
361 mProjectionSelectionWidget->setCrs( v );
364QVariant QgsProcessingCrsWidgetWrapper::widgetValue()
const
366 if ( mUseProjectCrsCheckBox && mUseProjectCrsCheckBox->isChecked() )
367 return QStringLiteral(
"ProjectCrs" );
368 else if ( mProjectionSelectionWidget )
369 return mProjectionSelectionWidget->crs().isValid() ? mProjectionSelectionWidget->crs() : QVariant();
374QStringList QgsProcessingCrsWidgetWrapper::compatibleParameterTypes()
const
388QStringList QgsProcessingCrsWidgetWrapper::compatibleOutputTypes()
const
397QString QgsProcessingCrsWidgetWrapper::modelerExpressionFormatString()
const
399 return tr(
"string as EPSG code, WKT or PROJ format, or a string identifying a map layer" );
402QString QgsProcessingCrsWidgetWrapper::parameterType()
const
409 return new QgsProcessingCrsWidgetWrapper( parameter, type );
414 return new QgsProcessingCrsParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
427 QVBoxLayout *vlayout =
new QVBoxLayout();
428 vlayout->setContentsMargins( 0, 0, 0, 0 );
430 vlayout->addWidget(
new QLabel( tr(
"Default value" ) ) );
432 mDefaultLineEdit =
new QLineEdit();
435 vlayout->addWidget( mDefaultLineEdit );
437 mMultiLineCheckBox =
new QCheckBox( tr(
"Multiline input" ) );
439 mMultiLineCheckBox->setChecked( stringParam->multiLine() );
440 vlayout->addWidget( mMultiLineCheckBox );
442 setLayout( vlayout );
447 auto param = std::make_unique< QgsProcessingParameterString >( name, description, mDefaultLineEdit->text(), mMultiLineCheckBox->isChecked() );
448 param->setFlags( flags );
449 return param.release();
460QWidget *QgsProcessingStringWidgetWrapper::createWidget()
462 const QVariantMap metadata = parameterDefinition()->metadata();
463 const QVariant valueHintsVariant = metadata.value( QStringLiteral(
"widget_wrapper" ) ).toMap().value( QStringLiteral(
"value_hints" ) );
465 if ( valueHintsVariant.isValid() )
467 const QVariantList valueList = valueHintsVariant.toList();
468 mComboBox =
new QComboBox();
469 mComboBox->setToolTip( parameterDefinition()->toolTip() );
473 mComboBox->addItem( QString() );
475 for (
const QVariant &entry : valueList )
477 mComboBox->addItem( entry.toString(), entry.toString() );
479 mComboBox->setCurrentIndex( 0 );
481 connect( mComboBox, qOverload<int>( &QComboBox::currentIndexChanged ),
this, [ = ](
int )
483 emit widgetValueHasChanged(
this );
496 mPlainTextEdit =
new QPlainTextEdit();
497 mPlainTextEdit->setToolTip( parameterDefinition()->toolTip() );
499 connect( mPlainTextEdit, &QPlainTextEdit::textChanged,
this, [ = ]
501 emit widgetValueHasChanged(
this );
503 return mPlainTextEdit;
507 mLineEdit =
new QLineEdit();
508 mLineEdit->setToolTip( parameterDefinition()->toolTip() );
510 connect( mLineEdit, &QLineEdit::textChanged,
this, [ = ]
512 emit widgetValueHasChanged(
this );
520 mLineEdit =
new QLineEdit();
521 mLineEdit->setToolTip( parameterDefinition()->toolTip() );
523 connect( mLineEdit, &QLineEdit::textChanged,
this, [ = ]
525 emit widgetValueHasChanged(
this );
535void QgsProcessingStringWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext &context )
539 mLineEdit->setText( v );
540 if ( mPlainTextEdit )
541 mPlainTextEdit->setPlainText( v );
545 if ( !value.isValid() )
546 index = mComboBox->findData( QVariant() );
548 index = mComboBox->findData( v );
551 mComboBox->setCurrentIndex( index );
553 mComboBox->setCurrentIndex( 0 );
557QVariant QgsProcessingStringWidgetWrapper::widgetValue()
const
560 return mLineEdit->text();
561 else if ( mPlainTextEdit )
562 return mPlainTextEdit->toPlainText();
563 else if ( mComboBox )
564 return mComboBox->currentData();
569QStringList QgsProcessingStringWidgetWrapper::compatibleParameterTypes()
const
587QStringList QgsProcessingStringWidgetWrapper::compatibleOutputTypes()
const
596QString QgsProcessingStringWidgetWrapper::parameterType()
const
603 return new QgsProcessingStringWidgetWrapper( parameter, type );
608 return new QgsProcessingStringParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
623QWidget *QgsProcessingAuthConfigWidgetWrapper::createWidget()
632 mAuthConfigSelect->setToolTip( parameterDefinition()->toolTip() );
636 emit widgetValueHasChanged(
this );
638 return mAuthConfigSelect;
644void QgsProcessingAuthConfigWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext &context )
647 if ( mAuthConfigSelect )
648 mAuthConfigSelect->setConfigId( v );
651QVariant QgsProcessingAuthConfigWidgetWrapper::widgetValue()
const
653 if ( mAuthConfigSelect )
654 return mAuthConfigSelect->configId();
659QStringList QgsProcessingAuthConfigWidgetWrapper::compatibleParameterTypes()
const
667QStringList QgsProcessingAuthConfigWidgetWrapper::compatibleOutputTypes()
const
673QString QgsProcessingAuthConfigWidgetWrapper::parameterType()
const
680 return new QgsProcessingAuthConfigWidgetWrapper( parameter, type );
690 QVBoxLayout *vlayout =
new QVBoxLayout();
691 vlayout->setContentsMargins( 0, 0, 0, 0 );
693 vlayout->addWidget(
new QLabel( tr(
"Number type" ) ) );
695 mTypeComboBox =
new QComboBox();
698 vlayout->addWidget( mTypeComboBox );
700 vlayout->addWidget(
new QLabel( tr(
"Minimum value" ) ) );
701 mMinLineEdit =
new QLineEdit();
702 vlayout->addWidget( mMinLineEdit );
704 vlayout->addWidget(
new QLabel( tr(
"Maximum value" ) ) );
705 mMaxLineEdit =
new QLineEdit();
706 vlayout->addWidget( mMaxLineEdit );
708 vlayout->addWidget(
new QLabel( tr(
"Default value" ) ) );
709 mDefaultLineEdit =
new QLineEdit();
710 vlayout->addWidget( mDefaultLineEdit );
714 mTypeComboBox->setCurrentIndex( mTypeComboBox->findData(
static_cast< int >( numberParam->dataType() ) ) );
716 if ( !
qgsDoubleNear( numberParam->maximum(), std::numeric_limits<double>::max() ) )
718 mMaxLineEdit->setText( QLocale().toString( numberParam->maximum() ) );
722 mMaxLineEdit->clear();
725 if ( !
qgsDoubleNear( numberParam->minimum(), std::numeric_limits<double>::lowest() ) )
727 mMinLineEdit->setText( QLocale().toString( numberParam->minimum() ) );
731 mMinLineEdit->clear();
734 mDefaultLineEdit->setText( numberParam->defaultValueForGui().toString() );
737 setLayout( vlayout );
746 auto param = std::make_unique< QgsProcessingParameterNumber >( name, description, dataType, ok ? val : QVariant() );
748 if ( !mMinLineEdit->text().trimmed().isEmpty() )
753 param->setMinimum( val );
757 if ( !mMaxLineEdit->text().trimmed().isEmpty() )
762 param->setMaximum( val );
766 param->setFlags( flags );
767 return param.release();
776QWidget *QgsProcessingNumericWidgetWrapper::createWidget()
779 const QVariantMap metadata = numberDef->
metadata();
780 const int decimals = metadata.value( QStringLiteral(
"widget_wrapper" ) ).toMap().value( QStringLiteral(
"decimals" ), 6 ).toInt();
788 QAbstractSpinBox *spinBox =
nullptr;
793 mDoubleSpinBox->setExpressionsEnabled(
true );
794 mDoubleSpinBox->setDecimals( decimals );
800 double singleStep = calculateStep( numberDef->
minimum(), numberDef->
maximum() );
801 singleStep = std::max( singleStep, std::pow( 10, -decimals ) );
802 mDoubleSpinBox->setSingleStep( singleStep );
805 spinBox = mDoubleSpinBox;
810 mSpinBox->setExpressionsEnabled(
true );
814 spinBox->setToolTip( parameterDefinition()->toolTip() );
816 double max = 999999999;
821 double min = -999999999;
826 if ( mDoubleSpinBox )
828 mDoubleSpinBox->setMinimum( min );
829 mDoubleSpinBox->setMaximum( max );
833 mSpinBox->setMinimum(
static_cast< int >( min ) );
834 mSpinBox->setMaximum(
static_cast< int >( max ) );
839 mAllowingNull =
true;
840 if ( mDoubleSpinBox )
842 mDoubleSpinBox->setShowClearButton(
true );
843 const double min = mDoubleSpinBox->minimum() - mDoubleSpinBox->singleStep();
844 mDoubleSpinBox->setMinimum( min );
845 mDoubleSpinBox->setValue( min );
849 mSpinBox->setShowClearButton(
true );
850 const int min = mSpinBox->minimum() - 1;
851 mSpinBox->setMinimum( min );
852 mSpinBox->setValue( min );
854 spinBox->setSpecialValueText( tr(
"Not set" ) );
862 if ( mDoubleSpinBox )
866 mDoubleSpinBox->setClearValue( defaultVal );
872 mSpinBox->setClearValue( intVal );
878 if ( mDoubleSpinBox )
879 mDoubleSpinBox->setClearValue( numberDef->
minimum() );
881 mSpinBox->setClearValue(
static_cast< int >( numberDef->
minimum() ) );
886 if ( mDoubleSpinBox )
888 mDoubleSpinBox->setValue( 0 );
889 mDoubleSpinBox->setClearValue( 0 );
893 mSpinBox->setValue( 0 );
894 mSpinBox->setClearValue( 0 );
899 if ( mDoubleSpinBox )
900 connect( mDoubleSpinBox, qOverload<double>( &QgsDoubleSpinBox::valueChanged ),
this, [ = ] { emit widgetValueHasChanged(
this ); } );
902 connect( mSpinBox, qOverload<int>( &QgsSpinBox::valueChanged ),
this, [ = ] { emit widgetValueHasChanged(
this ); } );
910void QgsProcessingNumericWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext &context )
912 if ( mDoubleSpinBox )
914 if ( mAllowingNull && !value.isValid() )
915 mDoubleSpinBox->clear();
919 mDoubleSpinBox->setValue( v );
924 if ( mAllowingNull && !value.isValid() )
929 mSpinBox->setValue( v );
934QVariant QgsProcessingNumericWidgetWrapper::widgetValue()
const
936 if ( mDoubleSpinBox )
938 if ( mAllowingNull &&
qgsDoubleNear( mDoubleSpinBox->value(), mDoubleSpinBox->minimum() ) )
941 return mDoubleSpinBox->value();
945 if ( mAllowingNull && mSpinBox->value() == mSpinBox->minimum() )
948 return mSpinBox->value();
954QStringList QgsProcessingNumericWidgetWrapper::compatibleParameterTypes()
const
965QStringList QgsProcessingNumericWidgetWrapper::compatibleOutputTypes()
const
972double QgsProcessingNumericWidgetWrapper::calculateStep(
const double minimum,
const double maximum )
974 const double valueRange = maximum - minimum;
975 if ( valueRange <= 1.0 )
977 const double step = valueRange / 10.0;
979 return qgsRound( step, -std::floor( std::log( step ) ) );
987QString QgsProcessingNumericWidgetWrapper::parameterType()
const
994 return new QgsProcessingNumericWidgetWrapper( parameter, type );
999 return new QgsProcessingNumberParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
1009 QVBoxLayout *vlayout =
new QVBoxLayout();
1010 vlayout->setContentsMargins( 0, 0, 0, 0 );
1012 vlayout->addWidget(
new QLabel( tr(
"Linked input" ) ) );
1014 mParentLayerComboBox =
new QComboBox();
1016 QString initialParent;
1018 initialParent = distParam->parentParameterName();
1020 if (
auto *lModel = widgetContext.
model() )
1023 const QMap<QString, QgsProcessingModelParameter> components = lModel->parameterComponents();
1024 for (
auto it = components.constBegin(); it != components.constEnd(); ++it )
1028 mParentLayerComboBox-> addItem( definition->
description(), definition->
name() );
1029 if ( !initialParent.isEmpty() && initialParent == definition->
name() )
1031 mParentLayerComboBox->setCurrentIndex( mParentLayerComboBox->count() - 1 );
1036 mParentLayerComboBox-> addItem( definition->
description(), definition->
name() );
1037 if ( !initialParent.isEmpty() && initialParent == definition->
name() )
1039 mParentLayerComboBox->setCurrentIndex( mParentLayerComboBox->count() - 1 );
1044 mParentLayerComboBox-> addItem( definition->
description(), definition->
name() );
1045 if ( !initialParent.isEmpty() && initialParent == definition->
name() )
1047 mParentLayerComboBox->setCurrentIndex( mParentLayerComboBox->count() - 1 );
1052 mParentLayerComboBox-> addItem( definition->
description(), definition->
name() );
1053 if ( !initialParent.isEmpty() && initialParent == definition->
name() )
1055 mParentLayerComboBox->setCurrentIndex( mParentLayerComboBox->count() - 1 );
1061 if ( mParentLayerComboBox->count() == 0 && !initialParent.isEmpty() )
1064 mParentLayerComboBox->addItem( initialParent, initialParent );
1065 mParentLayerComboBox->setCurrentIndex( mParentLayerComboBox->count() - 1 );
1068 vlayout->addWidget( mParentLayerComboBox );
1070 vlayout->addWidget(
new QLabel( tr(
"Minimum value" ) ) );
1071 mMinLineEdit =
new QLineEdit();
1072 vlayout->addWidget( mMinLineEdit );
1074 vlayout->addWidget(
new QLabel( tr(
"Maximum value" ) ) );
1075 mMaxLineEdit =
new QLineEdit();
1076 vlayout->addWidget( mMaxLineEdit );
1078 vlayout->addWidget(
new QLabel( tr(
"Default value" ) ) );
1079 mDefaultLineEdit =
new QLineEdit();
1080 vlayout->addWidget( mDefaultLineEdit );
1084 mMinLineEdit->setText( QLocale().toString( distParam->minimum() ) );
1085 mMaxLineEdit->setText( QLocale().toString( distParam->maximum() ) );
1086 mDefaultLineEdit->setText( distParam->defaultValueForGui().toString() );
1089 setLayout( vlayout );
1097 auto param = std::make_unique< QgsProcessingParameterDistance >( name, description, ok ? val : QVariant(), mParentLayerComboBox->currentData().toString() );
1102 param->setMinimum( val );
1108 param->setMaximum( val );
1111 param->setFlags( flags );
1112 return param.release();
1116 : QgsProcessingNumericWidgetWrapper( parameter, type, parent )
1121QString QgsProcessingDistanceWidgetWrapper::parameterType()
const
1128 return new QgsProcessingDistanceWidgetWrapper( parameter, type );
1131QWidget *QgsProcessingDistanceWidgetWrapper::createWidget()
1135 QWidget *spin = QgsProcessingNumericWidgetWrapper::createWidget();
1140 mLabel =
new QLabel();
1141 mUnitsCombo =
new QComboBox();
1153 const int labelMargin =
static_cast< int >( std::round( mUnitsCombo->fontMetrics().horizontalAdvance(
'X' ) ) );
1154 QHBoxLayout *layout =
new QHBoxLayout();
1155 layout->addWidget( spin, 1 );
1156 layout->insertSpacing( 1, labelMargin / 2 );
1157 layout->insertWidget( 2, mLabel );
1158 layout->insertWidget( 3, mUnitsCombo );
1163 mWarningLabel =
new QWidget();
1164 QHBoxLayout *warningLayout =
new QHBoxLayout();
1165 warningLayout->setContentsMargins( 0, 0, 0, 0 );
1166 QLabel *warning =
new QLabel();
1168 const int size =
static_cast< int >( std::max( 24.0, spin->minimumSize().height() * 0.5 ) );
1169 warning->setPixmap( icon.pixmap( icon.actualSize( QSize( size, size ) ) ) );
1170 warning->setToolTip( tr(
"Distance is in geographic degrees. Consider reprojecting to a projected local coordinate system for accurate results." ) );
1171 warningLayout->insertSpacing( 0, labelMargin / 2 );
1172 warningLayout->insertWidget( 1, warning );
1173 mWarningLabel->setLayout( warningLayout );
1174 layout->insertWidget( 4, mWarningLabel );
1176 QWidget *w =
new QWidget();
1177 layout->setContentsMargins( 0, 0, 0, 0 );
1178 w->setLayout( layout );
1193void QgsProcessingDistanceWidgetWrapper::postInitialize(
const QList<QgsAbstractProcessingParameterWidgetWrapper *> &wrappers )
1195 QgsProcessingNumericWidgetWrapper::postInitialize( wrappers );
1202 if ( wrapper->parameterDefinition()->name() ==
static_cast< const QgsProcessingParameterDistance *
>( parameterDefinition() )->parentParameterName() )
1204 setUnitParameterValue( wrapper->parameterValue(), wrapper );
1207 setUnitParameterValue( wrapper->parameterValue(), wrapper );
1227 std::unique_ptr< QgsProcessingContext > tmpContext;
1228 if ( mProcessingContextGenerator )
1229 context = mProcessingContextGenerator->processingContext();
1233 tmpContext = std::make_unique< QgsProcessingContext >();
1234 context = tmpContext.get();
1253 mUnitsCombo->hide();
1258 mUnitsCombo->setCurrentIndex( mUnitsCombo->findData(
static_cast< int >( units ) ) );
1259 mUnitsCombo->show();
1266QVariant QgsProcessingDistanceWidgetWrapper::widgetValue()
const
1268 const QVariant val = QgsProcessingNumericWidgetWrapper::widgetValue();
1269 if ( val.userType() == QMetaType::Type::Double && mUnitsCombo && mUnitsCombo->isVisible() )
1282 return new QgsProcessingDistanceParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
1293 QVBoxLayout *vlayout =
new QVBoxLayout();
1294 vlayout->setContentsMargins( 0, 0, 0, 0 );
1296 vlayout->addWidget(
new QLabel( tr(
"Linked input" ) ) );
1298 mParentLayerComboBox =
new QComboBox();
1300 QString initialParent;
1302 initialParent = areaParam->parentParameterName();
1304 if (
auto *lModel = widgetContext.
model() )
1307 const QMap<QString, QgsProcessingModelParameter> components = lModel->parameterComponents();
1308 for (
auto it = components.constBegin(); it != components.constEnd(); ++it )
1312 mParentLayerComboBox-> addItem( definition->
description(), definition->
name() );
1313 if ( !initialParent.isEmpty() && initialParent == definition->
name() )
1315 mParentLayerComboBox->setCurrentIndex( mParentLayerComboBox->count() - 1 );
1320 mParentLayerComboBox-> addItem( definition->
description(), definition->
name() );
1321 if ( !initialParent.isEmpty() && initialParent == definition->
name() )
1323 mParentLayerComboBox->setCurrentIndex( mParentLayerComboBox->count() - 1 );
1328 mParentLayerComboBox-> addItem( definition->
description(), definition->
name() );
1329 if ( !initialParent.isEmpty() && initialParent == definition->
name() )
1331 mParentLayerComboBox->setCurrentIndex( mParentLayerComboBox->count() - 1 );
1336 mParentLayerComboBox-> addItem( definition->
description(), definition->
name() );
1337 if ( !initialParent.isEmpty() && initialParent == definition->
name() )
1339 mParentLayerComboBox->setCurrentIndex( mParentLayerComboBox->count() - 1 );
1345 if ( mParentLayerComboBox->count() == 0 && !initialParent.isEmpty() )
1348 mParentLayerComboBox->addItem( initialParent, initialParent );
1349 mParentLayerComboBox->setCurrentIndex( mParentLayerComboBox->count() - 1 );
1352 vlayout->addWidget( mParentLayerComboBox );
1354 vlayout->addWidget(
new QLabel( tr(
"Minimum value" ) ) );
1355 mMinLineEdit =
new QLineEdit();
1356 vlayout->addWidget( mMinLineEdit );
1358 vlayout->addWidget(
new QLabel( tr(
"Maximum value" ) ) );
1359 mMaxLineEdit =
new QLineEdit();
1360 vlayout->addWidget( mMaxLineEdit );
1362 vlayout->addWidget(
new QLabel( tr(
"Default value" ) ) );
1363 mDefaultLineEdit =
new QLineEdit();
1364 vlayout->addWidget( mDefaultLineEdit );
1368 mMinLineEdit->setText( QLocale().toString( areaParam->minimum() ) );
1369 mMaxLineEdit->setText( QLocale().toString( areaParam->maximum() ) );
1370 mDefaultLineEdit->setText( areaParam->defaultValueForGui().toString() );
1373 setLayout( vlayout );
1381 auto param = std::make_unique< QgsProcessingParameterArea >( name, description, ok ? val : QVariant(), mParentLayerComboBox->currentData().toString() );
1386 param->setMinimum( val );
1392 param->setMaximum( val );
1395 param->setFlags( flags );
1396 return param.release();
1405 : QgsProcessingNumericWidgetWrapper( parameter, type, parent )
1410QString QgsProcessingAreaWidgetWrapper::parameterType()
const
1417 return new QgsProcessingAreaWidgetWrapper( parameter, type );
1420QWidget *QgsProcessingAreaWidgetWrapper::createWidget()
1424 QWidget *spin = QgsProcessingNumericWidgetWrapper::createWidget();
1429 mLabel =
new QLabel();
1430 mUnitsCombo =
new QComboBox();
1445 const int labelMargin =
static_cast< int >( std::round( mUnitsCombo->fontMetrics().horizontalAdvance(
'X' ) ) );
1446 QHBoxLayout *layout =
new QHBoxLayout();
1447 layout->addWidget( spin, 1 );
1448 layout->insertSpacing( 1, labelMargin / 2 );
1449 layout->insertWidget( 2, mLabel );
1450 layout->insertWidget( 3, mUnitsCombo );
1455 mWarningLabel =
new QWidget();
1456 QHBoxLayout *warningLayout =
new QHBoxLayout();
1457 warningLayout->setContentsMargins( 0, 0, 0, 0 );
1458 QLabel *warning =
new QLabel();
1460 const int size =
static_cast< int >( std::max( 24.0, spin->minimumSize().height() * 0.5 ) );
1461 warning->setPixmap( icon.pixmap( icon.actualSize( QSize( size, size ) ) ) );
1462 warning->setToolTip( tr(
"Area is in geographic degrees. Consider reprojecting to a projected local coordinate system for accurate results." ) );
1463 warningLayout->insertSpacing( 0, labelMargin / 2 );
1464 warningLayout->insertWidget( 1, warning );
1465 mWarningLabel->setLayout( warningLayout );
1466 layout->insertWidget( 4, mWarningLabel );
1468 QWidget *w =
new QWidget();
1469 layout->setContentsMargins( 0, 0, 0, 0 );
1470 w->setLayout( layout );
1485void QgsProcessingAreaWidgetWrapper::postInitialize(
const QList<QgsAbstractProcessingParameterWidgetWrapper *> &wrappers )
1487 QgsProcessingNumericWidgetWrapper::postInitialize( wrappers );
1519 std::unique_ptr< QgsProcessingContext > tmpContext;
1520 if ( mProcessingContextGenerator )
1521 context = mProcessingContextGenerator->processingContext();
1525 tmpContext = std::make_unique< QgsProcessingContext >();
1526 context = tmpContext.get();
1540void QgsProcessingAreaWidgetWrapper::setUnits(
Qgis::AreaUnit units )
1545 mUnitsCombo->hide();
1550 mUnitsCombo->setCurrentIndex( mUnitsCombo->findData( QVariant::fromValue( units ) ) );
1551 mUnitsCombo->show();
1558QVariant QgsProcessingAreaWidgetWrapper::widgetValue()
const
1560 const QVariant val = QgsProcessingNumericWidgetWrapper::widgetValue();
1561 if ( val.userType() == QMetaType::Type::Double && mUnitsCombo && mUnitsCombo->isVisible() )
1574 return new QgsProcessingAreaParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
1585 QVBoxLayout *vlayout =
new QVBoxLayout();
1586 vlayout->setContentsMargins( 0, 0, 0, 0 );
1588 vlayout->addWidget(
new QLabel( tr(
"Linked input" ) ) );
1590 mParentLayerComboBox =
new QComboBox();
1592 QString initialParent;
1594 initialParent = volumeParam->parentParameterName();
1596 if (
auto *lModel = widgetContext.
model() )
1599 const QMap<QString, QgsProcessingModelParameter> components = lModel->parameterComponents();
1600 for (
auto it = components.constBegin(); it != components.constEnd(); ++it )
1604 mParentLayerComboBox-> addItem( definition->
description(), definition->
name() );
1605 if ( !initialParent.isEmpty() && initialParent == definition->
name() )
1607 mParentLayerComboBox->setCurrentIndex( mParentLayerComboBox->count() - 1 );
1612 mParentLayerComboBox-> addItem( definition->
description(), definition->
name() );
1613 if ( !initialParent.isEmpty() && initialParent == definition->
name() )
1615 mParentLayerComboBox->setCurrentIndex( mParentLayerComboBox->count() - 1 );
1620 mParentLayerComboBox-> addItem( definition->
description(), definition->
name() );
1621 if ( !initialParent.isEmpty() && initialParent == definition->
name() )
1623 mParentLayerComboBox->setCurrentIndex( mParentLayerComboBox->count() - 1 );
1628 mParentLayerComboBox-> addItem( definition->
description(), definition->
name() );
1629 if ( !initialParent.isEmpty() && initialParent == definition->
name() )
1631 mParentLayerComboBox->setCurrentIndex( mParentLayerComboBox->count() - 1 );
1637 if ( mParentLayerComboBox->count() == 0 && !initialParent.isEmpty() )
1640 mParentLayerComboBox->addItem( initialParent, initialParent );
1641 mParentLayerComboBox->setCurrentIndex( mParentLayerComboBox->count() - 1 );
1644 vlayout->addWidget( mParentLayerComboBox );
1646 vlayout->addWidget(
new QLabel( tr(
"Minimum value" ) ) );
1647 mMinLineEdit =
new QLineEdit();
1648 vlayout->addWidget( mMinLineEdit );
1650 vlayout->addWidget(
new QLabel( tr(
"Maximum value" ) ) );
1651 mMaxLineEdit =
new QLineEdit();
1652 vlayout->addWidget( mMaxLineEdit );
1654 vlayout->addWidget(
new QLabel( tr(
"Default value" ) ) );
1655 mDefaultLineEdit =
new QLineEdit();
1656 vlayout->addWidget( mDefaultLineEdit );
1660 mMinLineEdit->setText( QLocale().toString( volumeParam->minimum() ) );
1661 mMaxLineEdit->setText( QLocale().toString( volumeParam->maximum() ) );
1662 mDefaultLineEdit->setText( volumeParam->defaultValueForGui().toString() );
1665 setLayout( vlayout );
1673 auto param = std::make_unique< QgsProcessingParameterVolume >( name, description, ok ? val : QVariant(), mParentLayerComboBox->currentData().toString() );
1678 param->setMinimum( val );
1684 param->setMaximum( val );
1687 param->setFlags( flags );
1688 return param.release();
1697 : QgsProcessingNumericWidgetWrapper( parameter, type, parent )
1702QString QgsProcessingVolumeWidgetWrapper::parameterType()
const
1709 return new QgsProcessingVolumeWidgetWrapper( parameter, type );
1712QWidget *QgsProcessingVolumeWidgetWrapper::createWidget()
1716 QWidget *spin = QgsProcessingNumericWidgetWrapper::createWidget();
1721 mLabel =
new QLabel();
1722 mUnitsCombo =
new QComboBox();
1735 const int labelMargin =
static_cast< int >( std::round( mUnitsCombo->fontMetrics().horizontalAdvance(
'X' ) ) );
1736 QHBoxLayout *layout =
new QHBoxLayout();
1737 layout->addWidget( spin, 1 );
1738 layout->insertSpacing( 1, labelMargin / 2 );
1739 layout->insertWidget( 2, mLabel );
1740 layout->insertWidget( 3, mUnitsCombo );
1745 mWarningLabel =
new QWidget();
1746 QHBoxLayout *warningLayout =
new QHBoxLayout();
1747 warningLayout->setContentsMargins( 0, 0, 0, 0 );
1748 QLabel *warning =
new QLabel();
1750 const int size =
static_cast< int >( std::max( 24.0, spin->minimumSize().height() * 0.5 ) );
1751 warning->setPixmap( icon.pixmap( icon.actualSize( QSize( size, size ) ) ) );
1752 warning->setToolTip( tr(
"Volume is in geographic degrees. Consider reprojecting to a projected local coordinate system for accurate results." ) );
1753 warningLayout->insertSpacing( 0, labelMargin / 2 );
1754 warningLayout->insertWidget( 1, warning );
1755 mWarningLabel->setLayout( warningLayout );
1756 layout->insertWidget( 4, mWarningLabel );
1758 QWidget *w =
new QWidget();
1759 layout->setContentsMargins( 0, 0, 0, 0 );
1760 w->setLayout( layout );
1775void QgsProcessingVolumeWidgetWrapper::postInitialize(
const QList<QgsAbstractProcessingParameterWidgetWrapper *> &wrappers )
1777 QgsProcessingNumericWidgetWrapper::postInitialize( wrappers );
1809 std::unique_ptr< QgsProcessingContext > tmpContext;
1810 if ( mProcessingContextGenerator )
1811 context = mProcessingContextGenerator->processingContext();
1815 tmpContext = std::make_unique< QgsProcessingContext >();
1816 context = tmpContext.get();
1835 mUnitsCombo->hide();
1840 mUnitsCombo->setCurrentIndex( mUnitsCombo->findData( QVariant::fromValue( units ) ) );
1841 mUnitsCombo->show();
1848QVariant QgsProcessingVolumeWidgetWrapper::widgetValue()
const
1850 const QVariant val = QgsProcessingNumericWidgetWrapper::widgetValue();
1851 if ( val.userType() == QMetaType::Type::Double && mUnitsCombo && mUnitsCombo->isVisible() )
1864 return new QgsProcessingVolumeParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
1875 QVBoxLayout *vlayout =
new QVBoxLayout();
1876 vlayout->setContentsMargins( 0, 0, 0, 0 );
1878 vlayout->addWidget(
new QLabel( tr(
"Minimum value" ) ) );
1879 mMinLineEdit =
new QLineEdit();
1880 vlayout->addWidget( mMinLineEdit );
1882 vlayout->addWidget(
new QLabel( tr(
"Maximum value" ) ) );
1883 mMaxLineEdit =
new QLineEdit();
1884 vlayout->addWidget( mMaxLineEdit );
1886 vlayout->addWidget(
new QLabel( tr(
"Default value" ) ) );
1887 mDefaultLineEdit =
new QLineEdit();
1888 vlayout->addWidget( mDefaultLineEdit );
1890 vlayout->addWidget(
new QLabel( tr(
"Default unit type" ) ) );
1892 mUnitsCombo =
new QComboBox();
1902 vlayout->addWidget( mUnitsCombo );
1906 mMinLineEdit->setText( QLocale().toString( durationParam->minimum() ) );
1907 mMaxLineEdit->setText( QLocale().toString( durationParam->maximum() ) );
1908 mDefaultLineEdit->setText( durationParam->defaultValueForGui().toString() );
1909 mUnitsCombo->setCurrentIndex( mUnitsCombo->findData(
static_cast <int >( durationParam->defaultUnit() ) ) );
1912 setLayout( vlayout );
1920 auto param = std::make_unique< QgsProcessingParameterDuration >( name, description, ok ? val : QVariant() );
1925 param->setMinimum( val );
1931 param->setMaximum( val );
1934 param->setDefaultUnit(
static_cast<Qgis::TemporalUnit >( mUnitsCombo->currentData().toInt() ) );
1936 param->setFlags( flags );
1937 return param.release();
1941 : QgsProcessingNumericWidgetWrapper( parameter, type, parent )
1946QString QgsProcessingDurationWidgetWrapper::parameterType()
const
1953 return new QgsProcessingDurationWidgetWrapper( parameter, type );
1956QWidget *QgsProcessingDurationWidgetWrapper::createWidget()
1960 QWidget *spin = QgsProcessingNumericWidgetWrapper::createWidget();
1965 mUnitsCombo =
new QComboBox();
1977 QHBoxLayout *layout =
new QHBoxLayout();
1978 layout->addWidget( spin, 1 );
1979 layout->insertWidget( 1, mUnitsCombo );
1981 QWidget *w =
new QWidget();
1982 layout->setContentsMargins( 0, 0, 0, 0 );
1983 w->setLayout( layout );
1985 mUnitsCombo->setCurrentIndex( mUnitsCombo->findData(
static_cast< int >( durationDef->
defaultUnit() ) ) );
1986 mUnitsCombo->show();
1999QLabel *QgsProcessingDurationWidgetWrapper::createLabel()
2011QVariant QgsProcessingDurationWidgetWrapper::widgetValue()
const
2013 const QVariant val = QgsProcessingNumericWidgetWrapper::widgetValue();
2014 if ( val.userType() == QMetaType::Type::Double && mUnitsCombo )
2025void QgsProcessingDurationWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext &context )
2031 QgsProcessingNumericWidgetWrapper::setWidgetValue( val, context );
2035 QgsProcessingNumericWidgetWrapper::setWidgetValue( value, context );
2041 return new QgsProcessingDurationParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
2051 QVBoxLayout *vlayout =
new QVBoxLayout();
2052 vlayout->setContentsMargins( 0, 0, 0, 0 );
2054 vlayout->addWidget(
new QLabel( tr(
"Default value" ) ) );
2056 mDefaultLineEdit =
new QLineEdit();
2060 mDefaultLineEdit->setText( scaleParam->defaultValueForGui().toString() );
2063 vlayout->addWidget( mDefaultLineEdit );
2065 setLayout( vlayout );
2071 double val = mDefaultLineEdit->text().toDouble( &ok );
2072 auto param = std::make_unique< QgsProcessingParameterScale >( name, description, ok ? val : QVariant() );
2074 return param.release();
2078 : QgsProcessingNumericWidgetWrapper( parameter, type, parent )
2083QString QgsProcessingScaleWidgetWrapper::parameterType()
const
2090 return new QgsProcessingScaleWidgetWrapper( parameter, type );
2093QWidget *QgsProcessingScaleWidgetWrapper::createWidget()
2105 mScaleWidget->setAllowNull(
true );
2107 mScaleWidget->setMapCanvas( widgetContext().mapCanvas() );
2108 mScaleWidget->setShowCurrentScaleButton(
true );
2110 mScaleWidget->setToolTip( parameterDefinition()->toolTip() );
2113 emit widgetValueHasChanged(
this );
2115 return mScaleWidget;
2124 mScaleWidget->setMapCanvas( context.
mapCanvas() );
2129QVariant QgsProcessingScaleWidgetWrapper::widgetValue()
const
2131 return mScaleWidget && !mScaleWidget->isNull() ? QVariant( mScaleWidget->scale() ) : QVariant();
2134void QgsProcessingScaleWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext &context )
2138 if ( mScaleWidget->allowNull() && !value.isValid() )
2139 mScaleWidget->setNull();
2143 mScaleWidget->setScale( v );
2150 return new QgsProcessingScaleParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
2161 QVBoxLayout *vlayout =
new QVBoxLayout();
2162 vlayout->setContentsMargins( 0, 0, 0, 0 );
2164 vlayout->addWidget(
new QLabel( tr(
"Number type" ) ) );
2166 mTypeComboBox =
new QComboBox();
2169 vlayout->addWidget( mTypeComboBox );
2171 vlayout->addWidget(
new QLabel( tr(
"Minimum value" ) ) );
2172 mMinLineEdit =
new QLineEdit();
2173 vlayout->addWidget( mMinLineEdit );
2175 vlayout->addWidget(
new QLabel( tr(
"Maximum value" ) ) );
2176 mMaxLineEdit =
new QLineEdit();
2177 vlayout->addWidget( mMaxLineEdit );
2181 mTypeComboBox->setCurrentIndex( mTypeComboBox->findData(
static_cast< int >( rangeParam->dataType() ) ) );
2183 mMinLineEdit->setText( QLocale().toString( range.at( 0 ) ) );
2184 mMaxLineEdit->setText( QLocale().toString( range.at( 1 ) ) );
2187 setLayout( vlayout );
2192 QString defaultValue;
2193 if ( mMinLineEdit->text().isEmpty() )
2195 defaultValue = QStringLiteral(
"None" );
2203 defaultValue = QStringLiteral(
"None" );
2207 if ( mMaxLineEdit->text().isEmpty() )
2209 defaultValue += QLatin1String(
",None" );
2215 defaultValue += QStringLiteral(
",%1" ).arg( ok ? QString::number( val ) : QLatin1String(
"None" ) );
2219 auto param = std::make_unique< QgsProcessingParameterRange >( name, description, dataType, defaultValue );
2220 param->setFlags( flags );
2221 return param.release();
2231QWidget *QgsProcessingRangeWidgetWrapper::createWidget()
2240 QHBoxLayout *layout =
new QHBoxLayout();
2245 mMinSpinBox->setExpressionsEnabled(
true );
2246 mMinSpinBox->setShowClearButton(
false );
2247 mMaxSpinBox->setExpressionsEnabled(
true );
2248 mMaxSpinBox->setShowClearButton(
false );
2250 QLabel *minLabel =
new QLabel( tr(
"Min" ) );
2251 layout->addWidget( minLabel );
2252 layout->addWidget( mMinSpinBox, 1 );
2254 QLabel *maxLabel =
new QLabel( tr(
"Max" ) );
2255 layout->addWidget( maxLabel );
2256 layout->addWidget( mMaxSpinBox, 1 );
2258 QWidget *w =
new QWidget();
2259 layout->setContentsMargins( 0, 0, 0, 0 );
2260 w->setLayout( layout );
2264 mMinSpinBox->setDecimals( 6 );
2265 mMaxSpinBox->setDecimals( 6 );
2269 mMinSpinBox->setDecimals( 0 );
2270 mMaxSpinBox->setDecimals( 0 );
2273 mMinSpinBox->setMinimum( -99999999.999999 );
2274 mMaxSpinBox->setMinimum( -99999999.999999 );
2275 mMinSpinBox->setMaximum( 99999999.999999 );
2276 mMaxSpinBox->setMaximum( 99999999.999999 );
2280 mAllowingNull =
true;
2282 const double min = mMinSpinBox->minimum() - 1;
2283 mMinSpinBox->setMinimum( min );
2284 mMaxSpinBox->setMinimum( min );
2285 mMinSpinBox->setValue( min );
2286 mMaxSpinBox->setValue( min );
2288 mMinSpinBox->setShowClearButton(
true );
2289 mMaxSpinBox->setShowClearButton(
true );
2290 mMinSpinBox->setSpecialValueText( tr(
"Not set" ) );
2291 mMaxSpinBox->setSpecialValueText( tr(
"Not set" ) );
2294 w->setToolTip( parameterDefinition()->toolTip() );
2296 connect( mMinSpinBox, qOverload<double>( &QgsDoubleSpinBox::valueChanged ),
this, [ = ](
const double v )
2298 mBlockChangedSignal++;
2299 if ( !mAllowingNull && v > mMaxSpinBox->value() )
2300 mMaxSpinBox->setValue( v );
2301 mBlockChangedSignal--;
2303 if ( !mBlockChangedSignal )
2304 emit widgetValueHasChanged(
this );
2306 connect( mMaxSpinBox, qOverload<double>( &QgsDoubleSpinBox::valueChanged ),
this, [ = ](
const double v )
2308 mBlockChangedSignal++;
2309 if ( !mAllowingNull && v < mMinSpinBox->value() )
2310 mMinSpinBox->setValue( v );
2311 mBlockChangedSignal--;
2313 if ( !mBlockChangedSignal )
2314 emit widgetValueHasChanged(
this );
2323void QgsProcessingRangeWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext &context )
2326 if ( mAllowingNull && v.empty() )
2328 mMinSpinBox->clear();
2329 mMaxSpinBox->clear();
2336 if ( mAllowingNull )
2338 mBlockChangedSignal++;
2339 if ( std::isnan( v.at( 0 ) ) )
2340 mMinSpinBox->clear();
2342 mMinSpinBox->setValue( v.at( 0 ) );
2344 if ( v.count() >= 2 )
2346 if ( std::isnan( v.at( 1 ) ) )
2347 mMaxSpinBox->clear();
2349 mMaxSpinBox->setValue( v.at( 1 ) );
2351 mBlockChangedSignal--;
2355 mBlockChangedSignal++;
2356 mMinSpinBox->setValue( v.at( 0 ) );
2357 if ( v.count() >= 2 )
2358 mMaxSpinBox->setValue( v.at( 1 ) );
2359 mBlockChangedSignal--;
2363 if ( !mBlockChangedSignal )
2364 emit widgetValueHasChanged(
this );
2367QVariant QgsProcessingRangeWidgetWrapper::widgetValue()
const
2369 if ( mAllowingNull )
2372 if (
qgsDoubleNear( mMinSpinBox->value(), mMinSpinBox->minimum() ) )
2373 value = QStringLiteral(
"None" );
2375 value = QString::number( mMinSpinBox->value() );
2377 if (
qgsDoubleNear( mMaxSpinBox->value(), mMaxSpinBox->minimum() ) )
2378 value += QLatin1String(
",None" );
2380 value += QStringLiteral(
",%1" ).arg( mMaxSpinBox->value() );
2385 return QStringLiteral(
"%1,%2" ).arg( mMinSpinBox->value() ).arg( mMaxSpinBox->value() );
2388QStringList QgsProcessingRangeWidgetWrapper::compatibleParameterTypes()
const
2390 return QStringList()
2395QStringList QgsProcessingRangeWidgetWrapper::compatibleOutputTypes()
const
2401QString QgsProcessingRangeWidgetWrapper::modelerExpressionFormatString()
const
2403 return tr(
"string as two comma delimited floats, e.g. '1,10'" );
2406QString QgsProcessingRangeWidgetWrapper::parameterType()
const
2413 return new QgsProcessingRangeWidgetWrapper( parameter, type );
2418 return new QgsProcessingRangeParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
2429 QVBoxLayout *vlayout =
new QVBoxLayout();
2430 vlayout->setContentsMargins( 0, 0, 0, 0 );
2432 mMatrixWidget =
new QgsProcessingMatrixModelerWidget();
2435 mMatrixWidget->setValue( matrixParam->headers(), matrixParam->defaultValueForGui() );
2436 mMatrixWidget->setFixedRows( matrixParam->hasFixedNumberRows() );
2438 vlayout->addWidget( mMatrixWidget );
2439 setLayout( vlayout );
2444 auto param = std::make_unique< QgsProcessingParameterMatrix >( name, description, 1, mMatrixWidget->fixedRows(), mMatrixWidget->headers(), mMatrixWidget->value() );
2445 param->setFlags( flags );
2446 return param.release();
2456QWidget *QgsProcessingMatrixWidgetWrapper::createWidget()
2458 mMatrixWidget =
new QgsProcessingMatrixParameterPanel(
nullptr,
dynamic_cast< const QgsProcessingParameterMatrix *
>( parameterDefinition() ) );
2459 mMatrixWidget->setToolTip( parameterDefinition()->toolTip() );
2461 connect( mMatrixWidget, &QgsProcessingMatrixParameterPanel::changed,
this, [ = ]
2463 emit widgetValueHasChanged(
this );
2472 return mMatrixWidget;
2478void QgsProcessingMatrixWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext &context )
2481 if ( mMatrixWidget )
2482 mMatrixWidget->setValue( v );
2485QVariant QgsProcessingMatrixWidgetWrapper::widgetValue()
const
2487 if ( mMatrixWidget )
2488 return mMatrixWidget->value().isEmpty() ? QVariant() : mMatrixWidget->value();
2493QStringList QgsProcessingMatrixWidgetWrapper::compatibleParameterTypes()
const
2495 return QStringList()
2499QStringList QgsProcessingMatrixWidgetWrapper::compatibleOutputTypes()
const
2501 return QStringList();
2504QString QgsProcessingMatrixWidgetWrapper::modelerExpressionFormatString()
const
2506 return tr(
"comma delimited string of values, or an array of values" );
2509QString QgsProcessingMatrixWidgetWrapper::parameterType()
const
2516 return new QgsProcessingMatrixWidgetWrapper( parameter, type );
2521 return new QgsProcessingMatrixParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
2533 QVBoxLayout *vlayout =
new QVBoxLayout();
2534 vlayout->setContentsMargins( 0, 0, 0, 0 );
2536 vlayout->addWidget(
new QLabel( tr(
"Type" ) ) );
2538 mTypeComboBox =
new QComboBox();
2542 mTypeComboBox->setCurrentIndex( mTypeComboBox->findData(
static_cast< int >( fileParam->behavior() ) ) );
2544 mTypeComboBox->setCurrentIndex( 0 );
2545 vlayout->addWidget( mTypeComboBox );
2547 vlayout->addWidget(
new QLabel( tr(
"File filter" ) ) );
2549 mFilterComboBox =
new QComboBox();
2550 mFilterComboBox->setEditable(
true );
2552 mFilterComboBox->addItem( tr(
"All Files (*.*)" ) );
2553 mFilterComboBox->addItem( tr(
"CSV Files (*.csv)" ) );
2554 mFilterComboBox->addItem( tr(
"HTML Files (*.html *.htm)" ) );
2555 mFilterComboBox->addItem( tr(
"Text Files (*.txt)" ) );
2557 mFilterComboBox->setCurrentText( fileParam->fileFilter() );
2559 mFilterComboBox->setCurrentIndex( 0 );
2560 vlayout->addWidget( mFilterComboBox );
2562 vlayout->addWidget(
new QLabel( tr(
"Default value" ) ) );
2565 mDefaultFileWidget->lineEdit()->setShowClearButton(
true );
2569 mDefaultFileWidget->setFilePath( fileParam->defaultValueForGui().toString() );
2573 vlayout->addWidget( mDefaultFileWidget );
2575 connect( mTypeComboBox, qOverload<int>( &QComboBox::currentIndexChanged ),
this, [ = ]
2584 setLayout( vlayout );
2589 auto param = std::make_unique< QgsProcessingParameterFile >( name, description );
2592 param->setFileFilter( mFilterComboBox->currentText() );
2593 if ( !mDefaultFileWidget->filePath().isEmpty() )
2594 param->setDefaultValue( mDefaultFileWidget->filePath() );
2595 param->setFlags( flags );
2596 return param.release();
2606QWidget *QgsProcessingFileWidgetWrapper::createWidget()
2616 mFileWidget->setToolTip( parameterDefinition()->toolTip() );
2617 mFileWidget->setDialogTitle( parameterDefinition()->description() );
2619 mFileWidget->setDefaultRoot(
QgsSettings().value( QStringLiteral(
"/Processing/LastInputPath" ), QDir::homePath() ).toString() );
2626 mFileWidget->setFilter( fileParam->
fileFilter() );
2627 else if ( !fileParam->
extension().isEmpty() )
2628 mFileWidget->setFilter( tr(
"%1 files" ).arg( fileParam->
extension().toUpper() ) + QStringLiteral(
" (*." ) + fileParam->
extension().toLower() +
')' );
2638 QgsSettings().
setValue( QStringLiteral(
"/Processing/LastInputPath" ), QFileInfo( path ).canonicalPath() );
2639 emit widgetValueHasChanged(
this );
2647void QgsProcessingFileWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext &context )
2651 mFileWidget->setFilePath( v );
2654QVariant QgsProcessingFileWidgetWrapper::widgetValue()
const
2657 return mFileWidget->filePath();
2662QStringList QgsProcessingFileWidgetWrapper::compatibleParameterTypes()
const
2664 return QStringList()
2669QStringList QgsProcessingFileWidgetWrapper::compatibleOutputTypes()
const
2680QString QgsProcessingFileWidgetWrapper::modelerExpressionFormatString()
const
2682 return tr(
"string representing a path to a file or folder" );
2685QString QgsProcessingFileWidgetWrapper::parameterType()
const
2692 return new QgsProcessingFileWidgetWrapper( parameter, type );
2697 return new QgsProcessingFileParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
2709 QVBoxLayout *vlayout =
new QVBoxLayout();
2710 vlayout->setContentsMargins( 0, 0, 0, 0 );
2711 vlayout->addWidget(
new QLabel( tr(
"Default value" ) ) );
2714 mDefaultQgisLineEdit->registerExpressionContextGenerator(
this );
2716 mDefaultPointCloudLineEdit =
new QgsProcessingPointCloudExpressionLineEdit();
2717 mDefaultRasterCalculatorLineEdit =
new QgsProcessingRasterCalculatorExpressionLineEdit();
2719 QStackedWidget *stackedWidget =
new QStackedWidget();
2720 stackedWidget->addWidget( mDefaultQgisLineEdit );
2721 stackedWidget->addWidget( mDefaultPointCloudLineEdit );
2722 stackedWidget->addWidget( mDefaultRasterCalculatorLineEdit );
2723 vlayout->addWidget( stackedWidget );
2728 mDefaultQgisLineEdit->setExpression( expr );
2729 mDefaultPointCloudLineEdit->setExpression( expr );
2732 vlayout->addWidget(
new QLabel( tr(
"Parent layer" ) ) );
2734 mParentLayerComboBox =
new QComboBox();
2735 vlayout->addWidget( mParentLayerComboBox );
2737 vlayout->addWidget(
new QLabel( tr(
"Expression type" ) ) );
2738 mExpressionTypeComboBox =
new QComboBox();
2743 connect( mExpressionTypeComboBox,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, [ = ](
int )
2745 mParentLayerComboBox->clear();
2746 mParentLayerComboBox->addItem( tr(
"None" ), QVariant() );
2748 stackedWidget->setCurrentIndex( mExpressionTypeComboBox->currentIndex() > 0 ? mExpressionTypeComboBox->currentIndex() : 0 );
2750 QString initialParent;
2752 initialParent = expParam->parentLayerParameterName();
2756 if ( QgsProcessingModelAlgorithm *model = widgetContext.
model() )
2759 const QMap<QString, QgsProcessingModelParameter> components = model->parameterComponents();
2760 for (
auto it = components.constBegin(); it != components.constEnd(); ++it )
2767 mParentLayerComboBox-> addItem( definition->
description(), definition->
name() );
2768 if ( !initialParent.isEmpty() && initialParent == definition->
name() )
2770 mParentLayerComboBox->setCurrentIndex( mParentLayerComboBox->count() - 1 );
2775 mParentLayerComboBox-> addItem( definition->
description(), definition->
name() );
2776 if ( !initialParent.isEmpty() && initialParent == definition->
name() )
2778 mParentLayerComboBox->setCurrentIndex( mParentLayerComboBox->count() - 1 );
2785 mParentLayerComboBox-> addItem( definition->
description(), definition->
name() );
2786 if ( !initialParent.isEmpty() && initialParent == definition->
name() )
2788 mParentLayerComboBox->setCurrentIndex( mParentLayerComboBox->count() - 1 );
2799 mParentLayerComboBox-> addItem( definition->
description(), definition->
name() );
2800 if ( !initialParent.isEmpty() && initialParent == definition->
name() )
2802 mParentLayerComboBox->setCurrentIndex( mParentLayerComboBox->count() - 1 );
2810 if ( mParentLayerComboBox->count() == 1 && !initialParent.isEmpty() )
2813 mParentLayerComboBox->addItem( initialParent, initialParent );
2814 mParentLayerComboBox->setCurrentIndex( mParentLayerComboBox->count() - 1 );
2819 mExpressionTypeComboBox->setCurrentIndex( -1 );
2821 mExpressionTypeComboBox->setCurrentIndex( mExpressionTypeComboBox->findData(
static_cast< int >( expParam->expressionType() ) ) );
2823 mExpressionTypeComboBox->setCurrentIndex( 0 );
2825 vlayout->addWidget( mExpressionTypeComboBox );
2827 setLayout( vlayout );
2834 switch ( expressionType )
2837 expression = mDefaultQgisLineEdit->expression();
2840 expression = mDefaultPointCloudLineEdit->expression();
2843 expression = mDefaultRasterCalculatorLineEdit->expression();
2846 auto param = std::make_unique< QgsProcessingParameterExpression >( name, description, expression, mParentLayerComboBox->currentData().toString(),
false, expressionType );
2847 param->setFlags( flags );
2848 return param.release();
2857QWidget *QgsProcessingExpressionWidgetWrapper::createWidget()
2869 mExpLineEdit->setToolTip( parameterDefinition()->toolTip() );
2870 mExpLineEdit->setExpressionDialogTitle( parameterDefinition()->description() );
2871 mExpLineEdit->registerExpressionContextGenerator(
this );
2874 emit widgetValueHasChanged(
this );
2876 return mExpLineEdit;
2882 mPointCloudExpLineEdit =
new QgsProcessingPointCloudExpressionLineEdit();
2883 mPointCloudExpLineEdit->setToolTip( parameterDefinition()->toolTip() );
2884 connect( mPointCloudExpLineEdit, &QgsProcessingPointCloudExpressionLineEdit::expressionChanged,
this, [ = ](
const QString & )
2886 emit widgetValueHasChanged(
this );
2888 return mPointCloudExpLineEdit;
2893 mRasterCalculatorExpLineEdit =
new QgsProcessingRasterCalculatorExpressionLineEdit();
2894 mRasterCalculatorExpLineEdit->setToolTip( parameterDefinition()->toolTip() );
2897 mRasterCalculatorExpLineEdit->setLayers( QVariantList() <<
"A" <<
"B" <<
"C" <<
"D" <<
"E" <<
"F" <<
"G" );
2899 connect( mRasterCalculatorExpLineEdit, &QgsProcessingRasterCalculatorExpressionLineEdit::expressionChanged,
this, [ = ](
const QString & )
2901 emit widgetValueHasChanged(
this );
2903 return mRasterCalculatorExpLineEdit;
2907 if ( expParam->
metadata().value( QStringLiteral(
"inlineEditor" ) ).toBool() )
2910 mExpBuilderWidget->setToolTip( parameterDefinition()->toolTip() );
2911 mExpBuilderWidget->init( createExpressionContext() );
2914 Q_UNUSED( changed );
2915 emit widgetValueHasChanged(
this );
2917 return mExpBuilderWidget;
2922 mFieldExpWidget->setToolTip( parameterDefinition()->toolTip() );
2923 mFieldExpWidget->setExpressionDialogTitle( parameterDefinition()->description() );
2924 mFieldExpWidget->registerExpressionContextGenerator(
this );
2926 mFieldExpWidget->setAllowEmptyFieldName(
true );
2930 emit widgetValueHasChanged(
this );
2932 return mFieldExpWidget;
2940void QgsProcessingExpressionWidgetWrapper::postInitialize(
const QList<QgsAbstractProcessingParameterWidgetWrapper *> &wrappers )
2952 setParentLayerWrapperValue( wrapper );
2955 setParentLayerWrapperValue( wrapper );
2971 if ( mExpBuilderWidget )
2974 mExpBuilderWidget->setExpressionContext( createExpressionContext() );
2982 std::unique_ptr< QgsProcessingContext > tmpContext;
2983 if ( mProcessingContextGenerator )
2984 context = mProcessingContextGenerator->processingContext();
2988 tmpContext = std::make_unique< QgsProcessingContext >();
2989 context = tmpContext.get();
2999 if ( val.userType() == qMetaTypeId<QgsProcessingFeatureSourceDefinition>() )
3009 if ( mFieldExpWidget )
3010 mFieldExpWidget->setLayer(
nullptr );
3011 else if ( mExpBuilderWidget )
3012 mExpBuilderWidget->setLayer(
nullptr );
3013 else if ( mExpLineEdit )
3014 mExpLineEdit->setLayer(
nullptr );
3020 std::unique_ptr< QgsMapLayer > ownedLayer( context->
takeResultLayer( layer->
id() ) );
3023 mParentLayer.reset( ownedLayer.release() );
3031 if ( mFieldExpWidget )
3032 mFieldExpWidget->setLayer( layer );
3033 if ( mExpBuilderWidget )
3034 mExpBuilderWidget->setLayer( layer );
3035 else if ( mExpLineEdit )
3036 mExpLineEdit->setLayer( layer );
3045 if ( mPointCloudExpLineEdit )
3046 mPointCloudExpLineEdit->setLayer(
nullptr );
3052 std::unique_ptr< QgsMapLayer > ownedLayer( context->
takeResultLayer( layer->
id() ) );
3055 mParentLayer.reset( ownedLayer.release() );
3063 if ( mPointCloudExpLineEdit )
3064 mPointCloudExpLineEdit->setLayer( layer );
3071 if ( layers.isEmpty() )
3073 if ( mRasterCalculatorExpLineEdit )
3075 mRasterCalculatorExpLineEdit->setLayers( val.userType() == QMetaType::Type::QVariantList ? val.toList() : QVariantList() << val );
3080 if ( mRasterCalculatorExpLineEdit )
3082 QVariantList layersList;
3085 layersList << layer->
name();
3087 mRasterCalculatorExpLineEdit->setLayers( layersList );
3095void QgsProcessingExpressionWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext &context )
3098 if ( mFieldExpWidget )
3099 mFieldExpWidget->setExpression( v );
3100 else if ( mExpBuilderWidget )
3101 mExpBuilderWidget->setExpressionText( v );
3102 else if ( mExpLineEdit )
3103 mExpLineEdit->setExpression( v );
3104 else if ( mPointCloudExpLineEdit )
3105 mPointCloudExpLineEdit->setExpression( v );
3106 else if ( mRasterCalculatorExpLineEdit )
3107 mRasterCalculatorExpLineEdit->setExpression( v );
3110QVariant QgsProcessingExpressionWidgetWrapper::widgetValue()
const
3112 if ( mFieldExpWidget )
3113 return mFieldExpWidget->expression();
3114 if ( mExpBuilderWidget )
3115 return mExpBuilderWidget->expressionText();
3116 else if ( mExpLineEdit )
3117 return mExpLineEdit->expression();
3118 else if ( mPointCloudExpLineEdit )
3119 return mPointCloudExpLineEdit->expression();
3120 else if ( mRasterCalculatorExpLineEdit )
3121 return mRasterCalculatorExpLineEdit->expression();
3126QStringList QgsProcessingExpressionWidgetWrapper::compatibleParameterTypes()
const
3128 return QStringList()
3139QStringList QgsProcessingExpressionWidgetWrapper::compatibleOutputTypes()
const
3141 return QStringList()
3147QString QgsProcessingExpressionWidgetWrapper::modelerExpressionFormatString()
const
3149 return tr(
"string representation of an expression" );
3152const QgsVectorLayer *QgsProcessingExpressionWidgetWrapper::linkedVectorLayer()
const
3154 if ( mFieldExpWidget && mFieldExpWidget->layer() )
3155 return mFieldExpWidget->layer();
3157 if ( mExpBuilderWidget && mExpBuilderWidget->layer() )
3158 return mExpBuilderWidget->layer();
3163QString QgsProcessingExpressionWidgetWrapper::parameterType()
const
3170 return new QgsProcessingExpressionWidgetWrapper( parameter, type );
3175 return new QgsProcessingExpressionParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
3188 QHBoxLayout *hl =
new QHBoxLayout();
3189 hl->setContentsMargins( 0, 0, 0, 0 );
3191 mLineEdit =
new QLineEdit();
3192 mLineEdit->setEnabled(
false );
3193 hl->addWidget( mLineEdit, 1 );
3195 mToolButton =
new QToolButton();
3196 mToolButton->setText( QString( QChar( 0x2026 ) ) );
3197 hl->addWidget( mToolButton );
3203 mLineEdit->setText( tr(
"%1 options selected" ).arg( 0 ) );
3206 connect( mToolButton, &QToolButton::clicked,
this, &QgsProcessingEnumPanelWidget::showDialog );
3209void QgsProcessingEnumPanelWidget::setValue(
const QVariant &value )
3211 if ( value.isValid() )
3213 mValue = value.userType() == QMetaType::Type::QVariantList ? value.toList() : QVariantList() << value;
3215 if ( mParam->usesStaticStrings() && mValue.count() == 1 && mValue.at( 0 ).toString().isEmpty() )
3221 updateSummaryText();
3225void QgsProcessingEnumPanelWidget::showDialog()
3227 QVariantList availableOptions;
3230 availableOptions.reserve( mParam->options().size() );
3232 if ( mParam->usesStaticStrings() )
3234 for ( QString o : mParam->options() )
3236 availableOptions << o;
3241 for (
int i = 0; i < mParam->options().count(); ++i )
3242 availableOptions << i;
3246 const QStringList options = mParam ? mParam->options() : QStringList();
3250 QgsProcessingMultipleSelectionPanelWidget *widget =
new QgsProcessingMultipleSelectionPanelWidget( availableOptions, mValue );
3251 widget->setPanelTitle( mParam->description() );
3253 if ( mParam->usesStaticStrings() )
3255 widget->setValueFormatter( [options](
const QVariant & v ) -> QString
3257 const QString i = v.toString();
3258 return options.contains( i ) ? i : QString();
3263 widget->setValueFormatter( [options](
const QVariant & v ) -> QString
3265 const int i = v.toInt();
3266 return options.size() > i ? options.at( i ) : QString();
3270 connect( widget, &QgsProcessingMultipleSelectionPanelWidget::selectionChanged,
this, [ = ]()
3272 setValue( widget->selectedOptions() );
3279 QgsProcessingMultipleSelectionDialog dlg( availableOptions, mValue,
this, Qt::WindowFlags() );
3281 dlg.setValueFormatter( [options](
const QVariant & v ) -> QString
3283 const int i = v.toInt();
3284 return options.size() > i ? options.at( i ) : QString();
3288 setValue( dlg.selectedOptions() );
3293void QgsProcessingEnumPanelWidget::updateSummaryText()
3298 if ( mValue.empty() )
3300 mLineEdit->setText( tr(
"%1 options selected" ).arg( 0 ) );
3305 values.reserve( mValue.size() );
3306 if ( mParam->usesStaticStrings() )
3308 for (
const QVariant &val : std::as_const( mValue ) )
3310 values << val.toString();
3315 const QStringList options = mParam->options();
3316 for (
const QVariant &val : std::as_const( mValue ) )
3318 const int i = val.toInt();
3319 values << ( options.size() > i ? options.at( i ) : QString() );
3323 const QString concatenated = values.join( tr(
"," ) );
3324 if ( concatenated.length() < 100 )
3325 mLineEdit->setText( concatenated );
3327 mLineEdit->setText( tr(
"%n option(s) selected",
nullptr, mValue.count() ) );
3335QgsProcessingEnumCheckboxPanelWidget::QgsProcessingEnumCheckboxPanelWidget( QWidget *parent,
const QgsProcessingParameterEnum *param,
int columns )
3338 , mButtonGroup( new QButtonGroup( this ) )
3339 , mColumns( columns )
3341 mButtonGroup->setExclusive( !mParam->allowMultiple() );
3343 QGridLayout *l =
new QGridLayout();
3344 l->setContentsMargins( 0, 0, 0, 0 );
3346 int rows =
static_cast< int >( std::ceil( mParam->options().count() /
static_cast< double >( mColumns ) ) );
3347 for (
int i = 0; i < mParam->options().count(); ++i )
3349 QAbstractButton *button =
nullptr;
3350 if ( mParam->allowMultiple() )
3351 button =
new QCheckBox( mParam->options().at( i ) );
3353 button =
new QRadioButton( mParam->options().at( i ) );
3355 connect( button, &QAbstractButton::toggled,
this, [ = ]
3357 if ( !mBlockChangedSignal )
3361 mButtons.insert( i, button );
3363 mButtonGroup->addButton( button, i );
3364 l->addWidget( button, i % rows, i / rows );
3366 l->addItem(
new QSpacerItem( 0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum ), 0, mColumns );
3369 if ( mParam->allowMultiple() )
3371 setContextMenuPolicy( Qt::CustomContextMenu );
3372 connect(
this, &QWidget::customContextMenuRequested,
this, &QgsProcessingEnumCheckboxPanelWidget::showPopupMenu );
3376QVariant QgsProcessingEnumCheckboxPanelWidget::value()
const
3378 if ( mParam->allowMultiple() )
3381 for (
auto it = mButtons.constBegin(); it != mButtons.constEnd(); ++it )
3383 if ( it.value()->isChecked() )
3384 value.append( mParam->usesStaticStrings() ? mParam->options().at( it.key().toInt() ) : it.key() );
3390 if ( mParam->usesStaticStrings() )
3391 return mButtonGroup->checkedId() >= 0 ? mParam->options().at( mButtonGroup->checkedId() ) : QVariant();
3393 return mButtonGroup->checkedId() >= 0 ? mButtonGroup->checkedId() : QVariant();
3397void QgsProcessingEnumCheckboxPanelWidget::setValue(
const QVariant &value )
3399 mBlockChangedSignal =
true;
3400 if ( mParam->allowMultiple() )
3402 QVariantList selected;
3403 if ( value.isValid() )
3404 selected = value.userType() == QMetaType::Type::QVariantList ? value.toList() : QVariantList() << value;
3405 for (
auto it = mButtons.constBegin(); it != mButtons.constEnd(); ++it )
3407 QVariant v = mParam->usesStaticStrings() ? mParam->options().at( it.key().toInt() ) : it.key();
3408 it.value()->setChecked( selected.contains( v ) );
3414 if ( v.userType() == QMetaType::Type::QVariantList )
3415 v = v.toList().value( 0 );
3417 v = mParam->usesStaticStrings() ? mParam->options().indexOf( v.toString() ) : v;
3418 if ( mButtons.contains( v ) )
3419 mButtons.value( v )->setChecked(
true );
3421 mBlockChangedSignal =
false;
3425void QgsProcessingEnumCheckboxPanelWidget::showPopupMenu()
3428 QAction *selectAllAction =
new QAction( tr(
"Select All" ), &popupMenu );
3429 connect( selectAllAction, &QAction::triggered,
this, &QgsProcessingEnumCheckboxPanelWidget::selectAll );
3430 QAction *clearAllAction =
new QAction( tr(
"Clear Selection" ), &popupMenu );
3431 connect( clearAllAction, &QAction::triggered,
this, &QgsProcessingEnumCheckboxPanelWidget::deselectAll );
3432 popupMenu.addAction( selectAllAction );
3433 popupMenu.addAction( clearAllAction );
3434 popupMenu.exec( QCursor::pos() );
3437void QgsProcessingEnumCheckboxPanelWidget::selectAll()
3439 mBlockChangedSignal =
true;
3440 for (
auto it = mButtons.constBegin(); it != mButtons.constEnd(); ++it )
3441 it.value()->setChecked(
true );
3442 mBlockChangedSignal =
false;
3446void QgsProcessingEnumCheckboxPanelWidget::deselectAll()
3448 mBlockChangedSignal =
true;
3449 for (
auto it = mButtons.constBegin(); it != mButtons.constEnd(); ++it )
3450 it.value()->setChecked(
false );
3451 mBlockChangedSignal =
false;
3463 QVBoxLayout *vlayout =
new QVBoxLayout();
3464 vlayout->setContentsMargins( 0, 0, 0, 0 );
3466 mEnumWidget =
new QgsProcessingEnumModelerWidget();
3469 mEnumWidget->setAllowMultiple( enumParam->allowMultiple() );
3470 mEnumWidget->setOptions( enumParam->options() );
3471 mEnumWidget->setDefaultOptions( enumParam->defaultValueForGui() );
3473 vlayout->addWidget( mEnumWidget );
3474 setLayout( vlayout );
3479 auto param = std::make_unique< QgsProcessingParameterEnum >( name, description, mEnumWidget->options(), mEnumWidget->allowMultiple(), mEnumWidget->defaultOptions() );
3481 return param.release();
3491QWidget *QgsProcessingEnumWidgetWrapper::createWidget()
3499 if ( expParam->
metadata().value( QStringLiteral(
"widget_wrapper" ) ).toMap().value( QStringLiteral(
"useCheckBoxes" ),
false ).toBool() )
3501 const int columns = expParam->
metadata().value( QStringLiteral(
"widget_wrapper" ) ).toMap().value( QStringLiteral(
"columns" ), 2 ).toInt();
3502 mCheckboxPanel =
new QgsProcessingEnumCheckboxPanelWidget(
nullptr, expParam, columns );
3503 mCheckboxPanel->setToolTip( parameterDefinition()->toolTip() );
3504 connect( mCheckboxPanel, &QgsProcessingEnumCheckboxPanelWidget::changed,
this, [ = ]
3506 emit widgetValueHasChanged(
this );
3508 return mCheckboxPanel;
3517 mPanel =
new QgsProcessingEnumPanelWidget(
nullptr, expParam );
3518 mPanel->setToolTip( parameterDefinition()->toolTip() );
3519 connect( mPanel, &QgsProcessingEnumPanelWidget::changed,
this, [ = ]
3521 emit widgetValueHasChanged(
this );
3527 mComboBox =
new QComboBox();
3530 mComboBox->addItem( tr(
"[Not selected]" ), QVariant() );
3531 const QStringList options = expParam->
options();
3532 const QVariantList iconList = expParam->
metadata().value( QStringLiteral(
"widget_wrapper" ) ).toMap().value( QStringLiteral(
"icons" ) ).toList();
3533 for (
int i = 0; i < options.count(); ++i )
3535 const QIcon icon = iconList.value( i ).value< QIcon >();
3538 mComboBox->addItem( icon, options.at( i ), options.at( i ) );
3540 mComboBox->addItem( icon, options.at( i ), i );
3543 mComboBox->setToolTip( parameterDefinition()->toolTip() );
3544 mComboBox->setSizeAdjustPolicy( QComboBox::AdjustToMinimumContentsLengthWithIcon );
3545 connect( mComboBox, qOverload<int>( &QComboBox::currentIndexChanged ),
this, [ = ](
int )
3547 emit widgetValueHasChanged(
this );
3556void QgsProcessingEnumWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext &context )
3560 if ( !value.isValid() )
3561 mComboBox->setCurrentIndex( mComboBox->findData( QVariant() ) );
3568 mComboBox->setCurrentIndex( mComboBox->findData( v ) );
3573 mComboBox->setCurrentIndex( mComboBox->findData( v ) );
3577 else if ( mPanel || mCheckboxPanel )
3580 if ( value.isValid() )
3586 opts.reserve( v.size() );
3587 for ( QString i : v )
3593 opts.reserve( v.size() );
3599 mPanel->setValue( opts );
3600 else if ( mCheckboxPanel )
3601 mCheckboxPanel->setValue( opts );
3605QVariant QgsProcessingEnumWidgetWrapper::widgetValue()
const
3608 return mComboBox->currentData();
3610 return mPanel->value();
3611 else if ( mCheckboxPanel )
3612 return mCheckboxPanel->value();
3617QStringList QgsProcessingEnumWidgetWrapper::compatibleParameterTypes()
const
3619 return QStringList()
3625QStringList QgsProcessingEnumWidgetWrapper::compatibleOutputTypes()
const
3627 return QStringList()
3633QString QgsProcessingEnumWidgetWrapper::modelerExpressionFormatString()
const
3635 return tr(
"selected option index (starting from 0), array of indices, or comma separated string of options (e.g. '1,3')" );
3638QString QgsProcessingEnumWidgetWrapper::parameterType()
const
3645 return new QgsProcessingEnumWidgetWrapper( parameter, type );
3650 return new QgsProcessingEnumParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
3663QWidget *QgsProcessingLayoutWidgetWrapper::createWidget()
3672 mComboBox =
new QgsLayoutComboBox(
nullptr, widgetContext().project() ? widgetContext().project()->layoutManager() : nullptr );
3677 mComboBox->setToolTip( parameterDefinition()->toolTip() );
3680 emit widgetValueHasChanged(
this );
3687 mPlainComboBox =
new QComboBox();
3688 mPlainComboBox->setEditable(
true );
3689 mPlainComboBox->setToolTip( tr(
"Name of an existing print layout" ) );
3690 if ( widgetContext().project() )
3694 mPlainComboBox->addItem( layout->name() );
3697 connect( mPlainComboBox, &QComboBox::currentTextChanged,
this, [ = ](
const QString & )
3699 emit widgetValueHasChanged(
this );
3701 return mPlainComboBox;
3707void QgsProcessingLayoutWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext &context )
3711 if ( !value.isValid() )
3712 mComboBox->setCurrentLayout(
nullptr );
3716 mComboBox->setCurrentLayout( l );
3718 mComboBox->setCurrentLayout(
nullptr );
3721 else if ( mPlainComboBox )
3724 mPlainComboBox->setCurrentText( v );
3728QVariant QgsProcessingLayoutWidgetWrapper::widgetValue()
const
3733 return l ? l->
name() : QVariant();
3735 else if ( mPlainComboBox )
3736 return mPlainComboBox->currentText().isEmpty() ? QVariant() : mPlainComboBox->currentText();
3744 if ( mPlainComboBox && context.
project() )
3748 mPlainComboBox->addItem( layout->name() );
3752QStringList QgsProcessingLayoutWidgetWrapper::compatibleParameterTypes()
const
3754 return QStringList()
3759QStringList QgsProcessingLayoutWidgetWrapper::compatibleOutputTypes()
const
3761 return QStringList()
3766QString QgsProcessingLayoutWidgetWrapper::modelerExpressionFormatString()
const
3768 return tr(
"string representing the name of an existing print layout" );
3771QString QgsProcessingLayoutWidgetWrapper::parameterType()
const
3778 return new QgsProcessingLayoutWidgetWrapper( parameter, type );
3792 QVBoxLayout *vlayout =
new QVBoxLayout();
3793 vlayout->setContentsMargins( 0, 0, 0, 0 );
3795 vlayout->addWidget(
new QLabel( tr(
"Parent layout" ) ) );
3797 mParentLayoutComboBox =
new QComboBox();
3798 QString initialParent;
3800 initialParent = itemParam->parentLayoutParameterName();
3802 if (
auto *lModel = widgetContext.
model() )
3805 const QMap<QString, QgsProcessingModelParameter> components = lModel->parameterComponents();
3806 for (
auto it = components.constBegin(); it != components.constEnd(); ++it )
3810 mParentLayoutComboBox-> addItem( definition->
description(), definition->
name() );
3811 if ( !initialParent.isEmpty() && initialParent == definition->
name() )
3813 mParentLayoutComboBox->setCurrentIndex( mParentLayoutComboBox->count() - 1 );
3819 if ( mParentLayoutComboBox->count() == 0 && !initialParent.isEmpty() )
3822 mParentLayoutComboBox->addItem( initialParent, initialParent );
3823 mParentLayoutComboBox->setCurrentIndex( mParentLayoutComboBox->count() - 1 );
3826 vlayout->addWidget( mParentLayoutComboBox );
3827 setLayout( vlayout );
3831 auto param = std::make_unique< QgsProcessingParameterLayoutItem >( name, description, QVariant(), mParentLayoutComboBox->currentData().toString() );
3833 return param.release();
3843QWidget *QgsProcessingLayoutItemWidgetWrapper::createWidget()
3854 mComboBox->setAllowEmptyItem(
true );
3855 if ( layoutParam->
itemType() >= 0 )
3858 mComboBox->setToolTip( parameterDefinition()->toolTip() );
3861 emit widgetValueHasChanged(
this );
3868 mLineEdit =
new QLineEdit();
3869 mLineEdit->setToolTip( tr(
"UUID or ID of an existing print layout item" ) );
3870 connect( mLineEdit, &QLineEdit::textChanged,
this, [ = ](
const QString & )
3872 emit widgetValueHasChanged(
this );
3880void QgsProcessingLayoutItemWidgetWrapper::postInitialize(
const QList<QgsAbstractProcessingParameterWidgetWrapper *> &wrappers )
3908void QgsProcessingLayoutItemWidgetWrapper::setLayoutParameterValue(
const QVariant &value )
3914 std::unique_ptr< QgsProcessingContext > tmpContext;
3915 if ( mProcessingContextGenerator )
3916 context = mProcessingContextGenerator->processingContext();
3920 tmpContext = std::make_unique< QgsProcessingContext >();
3921 context = tmpContext.get();
3925 setLayout( layout );
3928void QgsProcessingLayoutItemWidgetWrapper::setLayout(
QgsPrintLayout *layout )
3931 mComboBox->setCurrentLayout( layout );
3934void QgsProcessingLayoutItemWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext &context )
3938 if ( !value.isValid() )
3939 mComboBox->setItem(
nullptr );
3943 mComboBox->setItem( item );
3946 else if ( mLineEdit )
3949 mLineEdit->setText( v );
3953QVariant QgsProcessingLayoutItemWidgetWrapper::widgetValue()
const
3958 return i ? i->
uuid() : QVariant();
3960 else if ( mLineEdit )
3961 return mLineEdit->text().isEmpty() ? QVariant() : mLineEdit->text();
3966QStringList QgsProcessingLayoutItemWidgetWrapper::compatibleParameterTypes()
const
3968 return QStringList()
3973QStringList QgsProcessingLayoutItemWidgetWrapper::compatibleOutputTypes()
const
3975 return QStringList()
3980QString QgsProcessingLayoutItemWidgetWrapper::modelerExpressionFormatString()
const
3982 return tr(
"string representing the UUID or ID of an existing print layout item" );
3985QString QgsProcessingLayoutItemWidgetWrapper::parameterType()
const
3992 return new QgsProcessingLayoutItemWidgetWrapper( parameter, type );
3997 return new QgsProcessingLayoutItemParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
4004QgsProcessingPointMapTool::QgsProcessingPointMapTool(
QgsMapCanvas *canvas )
4011QgsProcessingPointMapTool::~QgsProcessingPointMapTool() =
default;
4013void QgsProcessingPointMapTool::deactivate()
4027 if ( e->button() == Qt::LeftButton )
4030 emit clicked( point );
4035void QgsProcessingPointMapTool::keyPressEvent( QKeyEvent *e )
4037 if ( e->key() == Qt::Key_Escape )
4052QgsProcessingPointPanel::QgsProcessingPointPanel( QWidget *parent )
4055 QHBoxLayout *l =
new QHBoxLayout();
4056 l->setContentsMargins( 0, 0, 0, 0 );
4058 mLineEdit->setShowClearButton(
false );
4059 l->addWidget( mLineEdit, 1 );
4060 mButton =
new QToolButton();
4061 mButton->setText( QString( QChar( 0x2026 ) ) );
4062 l->addWidget( mButton );
4065 connect( mLineEdit, &QLineEdit::textChanged,
this, &QgsProcessingPointPanel::changed );
4066 connect( mLineEdit, &QLineEdit::textChanged,
this, &QgsProcessingPointPanel::textChanged );
4067 connect( mButton, &QToolButton::clicked,
this, &QgsProcessingPointPanel::selectOnCanvas );
4068 mButton->setVisible(
false );
4071void QgsProcessingPointPanel::setMapCanvas(
QgsMapCanvas *canvas )
4074 mButton->setVisible(
true );
4077 mTool = std::make_unique< QgsProcessingPointMapTool >( mCanvas );
4078 connect( mTool.get(), &QgsProcessingPointMapTool::clicked,
this, &QgsProcessingPointPanel::updatePoint );
4079 connect( mTool.get(), &QgsProcessingPointMapTool::complete,
this, &QgsProcessingPointPanel::pointPicked );
4082void QgsProcessingPointPanel::setAllowNull(
bool allowNull )
4084 mLineEdit->setShowClearButton( allowNull );
4087void QgsProcessingPointPanel::setShowPointOnCanvas(
bool show )
4089 if ( mShowPointOnCanvas == show )
4092 mShowPointOnCanvas = show;
4093 if ( mShowPointOnCanvas )
4099 mMapPointRubberBand.reset();
4103QVariant QgsProcessingPointPanel::value()
const
4105 return mLineEdit->showClearButton() && mLineEdit->text().trimmed().isEmpty() ? QVariant() : QVariant( mLineEdit->text() );
4108void QgsProcessingPointPanel::clear()
4116 QString newText = QStringLiteral(
"%1,%2" )
4117 .arg( QString::number( point.
x(),
'f' ),
4118 QString::number( point.
y(),
'f' ) );
4121 if ( mCrs.isValid() )
4123 newText += QStringLiteral(
" [%1]" ).arg( mCrs.authid() );
4125 mLineEdit->setText( newText );
4129void QgsProcessingPointPanel::selectOnCanvas()
4134 mPrevTool = mCanvas->mapTool();
4135 mCanvas->setMapTool( mTool.get() );
4137 emit toggleDialogVisibility(
false );
4140void QgsProcessingPointPanel::updatePoint(
const QgsPointXY &point )
4142 setValue( point, mCanvas->mapSettings().destinationCrs() );
4145void QgsProcessingPointPanel::pointPicked()
4150 mCanvas->setMapTool( mPrevTool );
4152 emit toggleDialogVisibility(
true );
4155void QgsProcessingPointPanel::textChanged(
const QString &text )
4157 const thread_local QRegularExpression rx( QStringLiteral(
"^\\s*\\(?\\s*(.*?)\\s*,\\s*(.*?)\\s*(?:\\[(.*)\\])?\\s*\\)?\\s*$" ) );
4159 const QRegularExpressionMatch match = rx.match( text );
4160 if ( match.hasMatch() )
4163 const double x = match.captured( 1 ).toDouble( &xOk );
4165 const double y = match.captured( 2 ).toDouble( &yOk );
4172 if ( pointCrs.isValid() )
4190void QgsProcessingPointPanel::updateRubberBand()
4192 if ( !mShowPointOnCanvas || !mCanvas )
4195 if ( mPoint.isEmpty() )
4197 mMapPointRubberBand.reset();
4201 if ( !mMapPointRubberBand )
4204 mMapPointRubberBand->setZValue( 1000 );
4207 const double scaleFactor = mCanvas->fontMetrics().xHeight() * .4;
4208 mMapPointRubberBand->setWidth( scaleFactor );
4209 mMapPointRubberBand->setIconSize( scaleFactor * 5 );
4211 mMapPointRubberBand->setSecondaryStrokeColor( QColor( 255, 255, 255, 100 ) );
4212 mMapPointRubberBand->setColor( QColor( 200, 0, 200 ) );
4226 QVBoxLayout *vlayout =
new QVBoxLayout();
4227 vlayout->setContentsMargins( 0, 0, 0, 0 );
4229 vlayout->addWidget(
new QLabel( tr(
"Default value" ) ) );
4231 mDefaultLineEdit =
new QLineEdit();
4232 mDefaultLineEdit->setToolTip( tr(
"Point as 'x,y'" ) );
4233 mDefaultLineEdit->setPlaceholderText( tr(
"Point as 'x,y'" ) );
4237 mDefaultLineEdit->setText( QStringLiteral(
"%1,%2" ).arg( QString::number( point.
x(),
'f' ), QString::number( point.
y(),
'f' ) ) );
4240 vlayout->addWidget( mDefaultLineEdit );
4241 setLayout( vlayout );
4246 auto param = std::make_unique< QgsProcessingParameterPoint >( name, description, mDefaultLineEdit->text() );
4248 return param.release();
4257QWidget *QgsProcessingPointWidgetWrapper::createWidget()
4265 mPanel =
new QgsProcessingPointPanel(
nullptr );
4266 if ( widgetContext().mapCanvas() )
4267 mPanel->setMapCanvas( widgetContext().mapCanvas() );
4270 mPanel->setAllowNull(
true );
4273 mPanel->setShowPointOnCanvas(
true );
4275 mPanel->setToolTip( parameterDefinition()->toolTip() );
4277 connect( mPanel, &QgsProcessingPointPanel::changed,
this, [ = ]
4279 emit widgetValueHasChanged(
this );
4283 setDialog( mDialog );
4289 mLineEdit =
new QLineEdit();
4290 mLineEdit->setToolTip( tr(
"Point as 'x,y'" ) );
4291 connect( mLineEdit, &QLineEdit::textChanged,
this, [ = ](
const QString & )
4293 emit widgetValueHasChanged(
this );
4305 mPanel->setMapCanvas( context.
mapCanvas() );
4308void QgsProcessingPointWidgetWrapper::setDialog( QDialog *dialog )
4313 connect( mPanel, &QgsProcessingPointPanel::toggleDialogVisibility, mDialog, [ = ](
bool visible )
4316 mDialog->showMinimized();
4319 mDialog->showNormal();
4321 mDialog->activateWindow();
4328void QgsProcessingPointWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext &context )
4332 if ( !value.isValid() || ( value.userType() == QMetaType::Type::QString && value.toString().isEmpty() ) )
4338 mPanel->setValue( p,
crs );
4341 else if ( mLineEdit )
4344 mLineEdit->setText( v );
4348QVariant QgsProcessingPointWidgetWrapper::widgetValue()
const
4352 return mPanel->value();
4354 else if ( mLineEdit )
4355 return mLineEdit->text().isEmpty() ? QVariant() : mLineEdit->text();
4360QStringList QgsProcessingPointWidgetWrapper::compatibleParameterTypes()
const
4362 return QStringList()
4367QStringList QgsProcessingPointWidgetWrapper::compatibleOutputTypes()
const
4369 return QStringList()
4374QString QgsProcessingPointWidgetWrapper::modelerExpressionFormatString()
const
4376 return tr(
"string of the format 'x,y' or a geometry value (centroid is used)" );
4379QString QgsProcessingPointWidgetWrapper::parameterType()
const
4386 return new QgsProcessingPointWidgetWrapper( parameter, type );
4391 return new QgsProcessingPointParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
4403 QVBoxLayout *vlayout =
new QVBoxLayout();
4404 vlayout->setContentsMargins( 0, 0, 0, 0 );
4406 vlayout->addWidget(
new QLabel( tr(
"Default value" ) ) );
4408 mDefaultLineEdit =
new QLineEdit();
4409 mDefaultLineEdit->setToolTip( tr(
"Geometry as WKT" ) );
4410 mDefaultLineEdit->setPlaceholderText( tr(
"Geometry as WKT" ) );
4415 mDefaultLineEdit->setText( g.
asWkt() );
4418 vlayout->addWidget( mDefaultLineEdit );
4419 setLayout( vlayout );
4424 auto param = std::make_unique< QgsProcessingParameterGeometry >( name, description, mDefaultLineEdit->text() );
4426 return param.release();
4435QWidget *QgsProcessingGeometryWidgetWrapper::createWidget()
4443 mLineEdit =
new QLineEdit();
4444 mLineEdit->setToolTip( parameterDefinition()->toolTip() );
4445 connect( mLineEdit, &QLineEdit::textChanged,
this, [ = ]
4447 emit widgetValueHasChanged(
this );
4455void QgsProcessingGeometryWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext &context )
4461 mLineEdit->setText( g.
asWkt() );
4467QVariant QgsProcessingGeometryWidgetWrapper::widgetValue()
const
4470 return mLineEdit->text().isEmpty() ? QVariant() : mLineEdit->text();
4475QStringList QgsProcessingGeometryWidgetWrapper::compatibleParameterTypes()
const
4477 return QStringList()
4484QStringList QgsProcessingGeometryWidgetWrapper::compatibleOutputTypes()
const
4486 return QStringList()
4491QString QgsProcessingGeometryWidgetWrapper::modelerExpressionFormatString()
const
4493 return tr(
"string in the Well-Known-Text format or a geometry value" );
4496QString QgsProcessingGeometryWidgetWrapper::parameterType()
const
4503 return new QgsProcessingGeometryWidgetWrapper( parameter, type );
4508 return new QgsProcessingGeometryParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
4520 QVBoxLayout *vlayout =
new QVBoxLayout();
4521 vlayout->setContentsMargins( 0, 0, 0, 0 );
4523 vlayout->addWidget(
new QLabel( tr(
"Default value" ) ) );
4526 mDefaultColorButton->setShowNull(
true );
4527 mAllowOpacity =
new QCheckBox( tr(
"Allow opacity control" ) );
4533 mDefaultColorButton->setToNull();
4535 mDefaultColorButton->setColor(
c );
4536 mAllowOpacity->setChecked( colorParam->opacityEnabled() );
4540 mDefaultColorButton->setToNull();
4541 mAllowOpacity->setChecked(
true );
4544 vlayout->addWidget( mDefaultColorButton );
4545 vlayout->addWidget( mAllowOpacity );
4546 setLayout( vlayout );
4551 auto param = std::make_unique< QgsProcessingParameterColor >( name, description, mDefaultColorButton->color(), mAllowOpacity->isChecked() );
4553 return param.release();
4562QWidget *QgsProcessingColorWidgetWrapper::createWidget()
4572 mColorButton->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed );
4575 mColorButton->setShowNull(
true );
4578 mColorButton->setToolTip( parameterDefinition()->toolTip() );
4579 mColorButton->setColorDialogTitle( parameterDefinition()->description() );
4587 emit widgetValueHasChanged(
this );
4590 return mColorButton;
4596void QgsProcessingColorWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext &context )
4600 if ( !value.isValid() ||
4601 ( value.userType() == QMetaType::Type::QString && value.toString().isEmpty() )
4602 || ( value.userType() == QMetaType::Type::QColor && !value.value< QColor >().isValid() ) )
4603 mColorButton->setToNull();
4607 if ( !
c.isValid() && mColorButton->showNull() )
4608 mColorButton->setToNull();
4610 mColorButton->setColor(
c );
4615QVariant QgsProcessingColorWidgetWrapper::widgetValue()
const
4618 return mColorButton->isNull() ? QVariant() : mColorButton->color();
4623QStringList QgsProcessingColorWidgetWrapper::compatibleParameterTypes()
const
4625 return QStringList()
4630QStringList QgsProcessingColorWidgetWrapper::compatibleOutputTypes()
const
4632 return QStringList()
4637QString QgsProcessingColorWidgetWrapper::modelerExpressionFormatString()
const
4639 return tr(
"color style string, e.g. #ff0000 or 255,0,0" );
4642QString QgsProcessingColorWidgetWrapper::parameterType()
const
4649 return new QgsProcessingColorWidgetWrapper( parameter, type );
4654 return new QgsProcessingColorParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
4665 QVBoxLayout *vlayout =
new QVBoxLayout();
4666 vlayout->setContentsMargins( 0, 0, 0, 0 );
4668 vlayout->addWidget(
new QLabel( tr(
"Default value" ) ) );
4670 mDefaultLineEdit =
new QLineEdit();
4673 vlayout->addWidget( mDefaultLineEdit );
4675 mSourceParamComboBox =
new QComboBox();
4676 mDestParamComboBox =
new QComboBox();
4677 QString initialSource;
4678 QString initialDest;
4683 initialSource = itemParam->sourceCrsParameterName();
4684 initialDest = itemParam->destinationCrsParameterName();
4689 mSourceParamComboBox->addItem( QString(), QString() );
4690 mDestParamComboBox->addItem( QString(), QString() );
4691 if (
auto *lModel = widgetContext.
model() )
4694 const QMap<QString, QgsProcessingModelParameter> components = lModel->parameterComponents();
4695 for (
auto it = components.constBegin(); it != components.constEnd(); ++it )
4697 if ( definition && it->parameterName() == definition->
name() )
4701 mSourceParamComboBox->addItem( it->parameterName(), it->parameterName() );
4702 mDestParamComboBox->addItem( it->parameterName(), it->parameterName() );
4703 if ( !initialSource.isEmpty() && initialSource == it->parameterName() )
4705 mSourceParamComboBox->setCurrentIndex( mSourceParamComboBox->count() - 1 );
4707 if ( !initialDest.isEmpty() && initialDest == it->parameterName() )
4709 mDestParamComboBox->setCurrentIndex( mDestParamComboBox->count() - 1 );
4714 if ( mSourceParamComboBox->count() == 1 && !initialSource.isEmpty() )
4717 mSourceParamComboBox->addItem( initialSource, initialSource );
4718 mSourceParamComboBox->setCurrentIndex( mSourceParamComboBox->count() - 1 );
4720 if ( mDestParamComboBox->count() == 1 && !initialDest.isEmpty() )
4723 mDestParamComboBox->addItem( initialDest, initialDest );
4724 mDestParamComboBox->setCurrentIndex( mDestParamComboBox->count() - 1 );
4727 vlayout->addWidget(
new QLabel( tr(
"Source CRS parameter" ) ) );
4728 vlayout->addWidget( mSourceParamComboBox );
4729 vlayout->addWidget(
new QLabel( tr(
"Destination CRS parameter" ) ) );
4730 vlayout->addWidget( mDestParamComboBox );
4734 mStaticSourceWidget->setCrs( sourceCrs );
4737 mStaticDestWidget->setCrs( destCrs );
4739 vlayout->addWidget(
new QLabel( tr(
"Static source CRS" ) ) );
4740 vlayout->addWidget( mStaticSourceWidget );
4741 vlayout->addWidget(
new QLabel( tr(
"Static destination CRS" ) ) );
4742 vlayout->addWidget( mStaticDestWidget );
4744 setLayout( vlayout );
4749 auto param = std::make_unique< QgsProcessingParameterCoordinateOperation >( name, description, mDefaultLineEdit->text(),
4750 mSourceParamComboBox->currentText(),
4751 mDestParamComboBox->currentText(),
4752 mStaticSourceWidget->crs().isValid() ? QVariant::fromValue( mStaticSourceWidget->crs() ) : QVariant(),
4753 mStaticDestWidget->
crs().isValid() ? QVariant::fromValue( mStaticDestWidget->
crs() ) : QVariant() );
4755 return param.release();
4764QWidget *QgsProcessingCoordinateOperationWidgetWrapper::createWidget()
4775 mOperationWidget->setShowMakeDefault(
false );
4776 mOperationWidget->setShowFallbackOption(
false );
4777 mOperationWidget->setToolTip( parameterDefinition()->toolTip() );
4778 mOperationWidget->setSourceCrs( mSourceCrs );
4779 mOperationWidget->setDestinationCrs( mDestCrs );
4780 mOperationWidget->setMapCanvas( mCanvas );
4785 mOperationWidget->setSelectedOperation( deets );
4790 emit widgetValueHasChanged(
this );
4793 return mOperationWidget;
4799 mLineEdit =
new QLineEdit();
4800 QHBoxLayout *layout =
new QHBoxLayout();
4801 layout->addWidget( mLineEdit, 1 );
4802 connect( mLineEdit, &QLineEdit::textChanged,
this, [ = ]
4804 emit widgetValueHasChanged(
this );
4807 QToolButton *button =
new QToolButton();
4808 button->setText( QString( QChar( 0x2026 ) ) );
4809 connect( button, &QToolButton::clicked,
this, [ = ]
4811 QgsDatumTransformDialog dlg( mSourceCrs, mDestCrs,
false,
false,
false, qMakePair( -1, -1 ), button, Qt::WindowFlags(), mLineEdit->text(), mCanvas );
4814 mLineEdit->setText( dlg.selectedDatumTransform().proj );
4815 emit widgetValueHasChanged(
this );
4818 layout->addWidget( button );
4820 QWidget *w =
new QWidget();
4821 layout->setContentsMargins( 0, 0, 0, 0 );
4822 w->setLayout( layout );
4830void QgsProcessingCoordinateOperationWidgetWrapper::postInitialize(
const QList<QgsAbstractProcessingParameterWidgetWrapper *> &wrappers )
4868 if ( mOperationWidget )
4869 mOperationWidget->setMapCanvas( context.
mapCanvas() );
4872void QgsProcessingCoordinateOperationWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext & )
4874 if ( mOperationWidget )
4876 if ( !value.isValid() ||
4877 ( value.userType() == QMetaType::Type::QString ) )
4880 deets.
proj = value.toString();
4881 mOperationWidget->setSelectedOperation( deets );
4886 if ( !value.isValid() ||
4887 ( value.userType() == QMetaType::Type::QString ) )
4889 mLineEdit->setText( value.toString() );
4894QVariant QgsProcessingCoordinateOperationWidgetWrapper::widgetValue()
const
4896 if ( mOperationWidget )
4897 return mOperationWidget->selectedOperation().proj;
4898 else if ( mLineEdit )
4899 return mLineEdit->text();
4904QStringList QgsProcessingCoordinateOperationWidgetWrapper::compatibleParameterTypes()
const
4906 return QStringList()
4911QStringList QgsProcessingCoordinateOperationWidgetWrapper::compatibleOutputTypes()
const
4913 return QStringList()
4918QString QgsProcessingCoordinateOperationWidgetWrapper::modelerExpressionFormatString()
const
4920 return tr(
"Proj coordinate operation string, e.g. '+proj=pipeline +step +inv...'" );
4923void QgsProcessingCoordinateOperationWidgetWrapper::setSourceCrsParameterValue(
const QVariant &value )
4926 std::unique_ptr< QgsProcessingContext > tmpContext;
4927 if ( mProcessingContextGenerator )
4928 context = mProcessingContextGenerator->processingContext();
4932 tmpContext = std::make_unique< QgsProcessingContext >();
4933 context = tmpContext.get();
4937 if ( mOperationWidget )
4939 mOperationWidget->setSourceCrs( mSourceCrs );
4940 mOperationWidget->setSelectedOperationUsingContext( context->
transformContext() );
4944void QgsProcessingCoordinateOperationWidgetWrapper::setDestinationCrsParameterValue(
const QVariant &value )
4947 std::unique_ptr< QgsProcessingContext > tmpContext;
4948 if ( mProcessingContextGenerator )
4949 context = mProcessingContextGenerator->processingContext();
4953 tmpContext = std::make_unique< QgsProcessingContext >();
4954 context = tmpContext.get();
4958 if ( mOperationWidget )
4960 mOperationWidget->setDestinationCrs( mDestCrs );
4961 mOperationWidget->setSelectedOperationUsingContext( context->
transformContext() );
4965QString QgsProcessingCoordinateOperationWidgetWrapper::parameterType()
const
4972 return new QgsProcessingCoordinateOperationWidgetWrapper( parameter, type );
4977 return new QgsProcessingCoordinateOperationParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
4990 QHBoxLayout *hl =
new QHBoxLayout();
4991 hl->setContentsMargins( 0, 0, 0, 0 );
4993 mLineEdit =
new QLineEdit();
4994 mLineEdit->setEnabled(
false );
4995 hl->addWidget( mLineEdit, 1 );
4997 mToolButton =
new QToolButton();
4998 mToolButton->setText( QString( QChar( 0x2026 ) ) );
4999 hl->addWidget( mToolButton );
5005 mLineEdit->setText( tr(
"%n field(s) selected",
nullptr, 0 ) );
5008 connect( mToolButton, &QToolButton::clicked,
this, &QgsProcessingFieldPanelWidget::showDialog );
5011void QgsProcessingFieldPanelWidget::setFields(
const QgsFields &fields )
5016void QgsProcessingFieldPanelWidget::setValue(
const QVariant &value )
5018 if ( value.isValid() )
5019 mValue = value.userType() == QMetaType::Type::QVariantList ? value.
toList() : QVariantList() << value;
5023 updateSummaryText();
5027void QgsProcessingFieldPanelWidget::showDialog()
5029 QVariantList availableOptions;
5030 availableOptions.reserve( mFields.size() );
5031 for (
const QgsField &field : std::as_const( mFields ) )
5033 availableOptions << field.name();
5039 QgsProcessingMultipleSelectionPanelWidget *widget =
new QgsProcessingMultipleSelectionPanelWidget( availableOptions, mValue );
5040 widget->setPanelTitle( mParam->description() );
5042 widget->setValueFormatter( [](
const QVariant & v ) -> QString
5044 return v.toString();
5047 connect( widget, &QgsProcessingMultipleSelectionPanelWidget::selectionChanged,
this, [ = ]()
5049 setValue( widget->selectedOptions() );
5056 QgsProcessingMultipleSelectionDialog dlg( availableOptions, mValue,
this, Qt::WindowFlags() );
5058 dlg.setValueFormatter( [](
const QVariant & v ) -> QString
5060 return v.toString();
5064 setValue( dlg.selectedOptions() );
5069void QgsProcessingFieldPanelWidget::updateSummaryText()
5074 if ( mValue.empty() )
5076 mLineEdit->setText( tr(
"%n field(s) selected",
nullptr, 0 ) );
5081 values.reserve( mValue.size() );
5082 for (
const QVariant &val : std::as_const( mValue ) )
5084 values << val.toString();
5087 const QString concatenated = values.join( tr(
"," ) );
5088 if ( concatenated.length() < 100 )
5089 mLineEdit->setText( concatenated );
5091 mLineEdit->setText( tr(
"%n field(s) selected",
nullptr, mValue.count() ) );
5103 QVBoxLayout *vlayout =
new QVBoxLayout();
5104 vlayout->setContentsMargins( 0, 0, 0, 0 );
5106 vlayout->addWidget(
new QLabel( tr(
"Parent layer" ) ) );
5107 mParentLayerComboBox =
new QComboBox();
5109 QString initialParent;
5111 initialParent = fieldParam->parentLayerParameterName();
5113 if (
auto *lModel = widgetContext.
model() )
5116 const QMap<QString, QgsProcessingModelParameter> components = lModel->parameterComponents();
5117 for (
auto it = components.constBegin(); it != components.constEnd(); ++it )
5121 mParentLayerComboBox-> addItem( definition->
description(), definition->
name() );
5122 if ( !initialParent.isEmpty() && initialParent == definition->
name() )
5124 mParentLayerComboBox->setCurrentIndex( mParentLayerComboBox->count() - 1 );
5129 mParentLayerComboBox-> addItem( definition->
description(), definition->
name() );
5130 if ( !initialParent.isEmpty() && initialParent == definition->
name() )
5132 mParentLayerComboBox->setCurrentIndex( mParentLayerComboBox->count() - 1 );
5139 mParentLayerComboBox-> addItem( definition->
description(), definition->
name() );
5140 if ( !initialParent.isEmpty() && initialParent == definition->
name() )
5142 mParentLayerComboBox->setCurrentIndex( mParentLayerComboBox->count() - 1 );
5149 if ( mParentLayerComboBox->count() == 0 && !initialParent.isEmpty() )
5152 mParentLayerComboBox->addItem( initialParent, initialParent );
5153 mParentLayerComboBox->setCurrentIndex( mParentLayerComboBox->count() - 1 );
5156 vlayout->addWidget( mParentLayerComboBox );
5158 vlayout->addWidget(
new QLabel( tr(
"Allowed data type" ) ) );
5159 mDataTypeComboBox =
new QComboBox();
5167 mDataTypeComboBox->setCurrentIndex( mDataTypeComboBox->findData(
static_cast< int >( fieldParam->dataType() ) ) );
5169 vlayout->addWidget( mDataTypeComboBox );
5171 mAllowMultipleCheckBox =
new QCheckBox( tr(
"Accept multiple fields" ) );
5173 mAllowMultipleCheckBox->setChecked( fieldParam->allowMultiple() );
5175 vlayout->addWidget( mAllowMultipleCheckBox );
5177 mDefaultToAllCheckBox =
new QCheckBox( tr(
"Select all fields by default" ) );
5178 mDefaultToAllCheckBox->setEnabled( mAllowMultipleCheckBox->isChecked() );
5180 mDefaultToAllCheckBox->setChecked( fieldParam->defaultToAllFields() );
5182 vlayout->addWidget( mDefaultToAllCheckBox );
5184 connect( mAllowMultipleCheckBox, &QCheckBox::stateChanged,
this, [ = ]
5186 mDefaultToAllCheckBox->setEnabled( mAllowMultipleCheckBox->isChecked() );
5189 vlayout->addWidget(
new QLabel( tr(
"Default value" ) ) );
5191 mDefaultLineEdit =
new QLineEdit();
5192 mDefaultLineEdit->setToolTip( tr(
"Default field name, or ; separated list of field names for multiple field parameters" ) );
5196 mDefaultLineEdit->setText( fields.join(
';' ) );
5198 vlayout->addWidget( mDefaultLineEdit );
5200 setLayout( vlayout );
5207 QVariant defaultValue;
5208 if ( !mDefaultLineEdit->text().trimmed().isEmpty() )
5210 defaultValue = mDefaultLineEdit->text();
5212 auto param = std::make_unique< QgsProcessingParameterField >( name, description, defaultValue, mParentLayerComboBox->currentData().toString(), dataType, mAllowMultipleCheckBox->isChecked(),
false, mDefaultToAllCheckBox->isChecked() );
5214 return param.release();
5223QWidget *QgsProcessingFieldWidgetWrapper::createWidget()
5233 mPanel =
new QgsProcessingFieldPanelWidget(
nullptr, fieldParam );
5234 mPanel->setToolTip( parameterDefinition()->toolTip() );
5235 connect( mPanel, &QgsProcessingFieldPanelWidget::changed,
this, [ = ]
5237 emit widgetValueHasChanged(
this );
5257 mComboBox->setToolTip( parameterDefinition()->toolTip() );
5260 emit widgetValueHasChanged(
this );
5268 mLineEdit =
new QLineEdit();
5269 mLineEdit->setToolTip( QObject::tr(
"Name of field (separate field names with ; for multiple field parameters)" ) );
5270 connect( mLineEdit, &QLineEdit::textChanged,
this, [ = ]
5272 emit widgetValueHasChanged(
this );
5281void QgsProcessingFieldWidgetWrapper::postInitialize(
const QList<QgsAbstractProcessingParameterWidgetWrapper *> &wrappers )
5293 setParentLayerWrapperValue( wrapper );
5296 setParentLayerWrapperValue( wrapper );
5313 std::unique_ptr< QgsProcessingContext > tmpContext;
5314 if ( mProcessingContextGenerator )
5315 context = mProcessingContextGenerator->processingContext();
5319 tmpContext = std::make_unique< QgsProcessingContext >();
5320 context = tmpContext.get();
5325 if ( value.userType() == qMetaTypeId<QgsProcessingFeatureSourceDefinition>() )
5335 bool valueSet =
false;
5339 if ( layers.count() > 1 )
5341 QgsVectorLayer *vlayer = qobject_cast< QgsVectorLayer * >( layers.at( 0 ) );
5343 const QList< QgsMapLayer * > remainingLayers = layers.mid( 1 );
5349 QgsVectorLayer *vlayer = qobject_cast< QgsVectorLayer * >( layer );
5350 if ( !vlayer || !vlayer->
isValid() )
5356 for (
int fieldIdx = fields.
count() - 1; fieldIdx >= 0; fieldIdx-- )
5359 fields.
remove( fieldIdx );
5364 mComboBox->setFields( fields );
5366 mPanel->setFields( filterFields( fields ) );
5372 if ( !valueSet && !layers.isEmpty() && layers.at( 0 )->isValid() )
5374 QgsVectorLayer *layer = qobject_cast< QgsVectorLayer * >( layers.at( 0 ) );
5378 std::unique_ptr< QgsMapLayer > ownedLayer( context->
takeResultLayer( layer->
id() ) );
5381 mParentLayer.reset( qobject_cast< QgsVectorLayer * >( ownedLayer.release() ) );
5382 layer = mParentLayer.get();
5390 mComboBox->setLayer( layer );
5392 mPanel->setFields( filterFields( layer->
fields() ) );
5402 const QgsFields fields = source->fields();
5404 mComboBox->setFields( fields );
5406 mPanel->setFields( filterFields( fields ) );
5415 mComboBox->setLayer(
nullptr );
5419 if ( value.isValid() && widgetContext().messageBar() )
5422 widgetContext().
messageBar()->
pushMessage( QString(), QObject::tr(
"Could not load selected layer/table. Dependent field could not be populated" ),
5432 val.reserve( mPanel->fields().size() );
5433 for (
const QgsField &field : mPanel->fields() )
5434 val << field.name();
5435 setWidgetValue( val, *context );
5438 setWidgetValue( parameterDefinition()->defaultValueForGui(), *context );
5441void QgsProcessingFieldWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext &context )
5445 if ( !value.isValid() )
5446 mComboBox->setField( QString() );
5450 mComboBox->setField( v );
5456 if ( value.isValid() )
5459 opts.reserve( v.size() );
5460 for (
const QString &i : v )
5464 mPanel->setValue( opts );
5466 else if ( mLineEdit )
5472 mLineEdit->setText( v.join(
';' ) );
5481QVariant QgsProcessingFieldWidgetWrapper::widgetValue()
const
5484 return mComboBox->currentField();
5486 return mPanel->value();
5487 else if ( mLineEdit )
5492 return mLineEdit->text().split(
';' );
5495 return mLineEdit->text();
5501QStringList QgsProcessingFieldWidgetWrapper::compatibleParameterTypes()
const
5503 return QStringList()
5508QStringList QgsProcessingFieldWidgetWrapper::compatibleOutputTypes()
const
5510 return QStringList()
5515QString QgsProcessingFieldWidgetWrapper::modelerExpressionFormatString()
const
5517 return tr(
"selected field names as an array of names, or semicolon separated string of options (e.g. 'fid;place_name')" );
5520const QgsVectorLayer *QgsProcessingFieldWidgetWrapper::linkedVectorLayer()
const
5522 if ( mComboBox && mComboBox->layer() )
5523 return mComboBox->layer();
5528QgsFields QgsProcessingFieldWidgetWrapper::filterFields(
const QgsFields &fields )
const
5541 if ( f.isNumeric() )
5546 if ( f.type() == QMetaType::Type::QString )
5551 if ( f.type() == QMetaType::Type::QDate || f.type() == QMetaType::Type::QTime || f.type() == QMetaType::Type::QDateTime )
5556 if ( f.type() == QMetaType::Type::QByteArray )
5561 if ( f.type() == QMetaType::Type::Bool )
5570QString QgsProcessingFieldWidgetWrapper::parameterType()
const
5577 return new QgsProcessingFieldWidgetWrapper( parameter, type );
5582 return new QgsProcessingFieldParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
5593 QVBoxLayout *vlayout =
new QVBoxLayout();
5594 vlayout->setContentsMargins( 0, 0, 0, 0 );
5596 vlayout->addWidget(
new QLabel( tr(
"Default value" ) ) );
5598 mDefaultComboBox =
new QComboBox();
5599 mDefaultComboBox->addItem( QString(), QVariant( -1 ) );
5602 for (
const QString &theme : mapThemes )
5606 mDefaultComboBox->setEditable(
true );
5610 if ( themeParam->defaultValueForGui().isValid() )
5613 mDefaultComboBox->setCurrentIndex( mDefaultComboBox->findData( -1 ) );
5616 mDefaultComboBox->setCurrentIndex( mDefaultComboBox->findData( -1 ) );
5618 vlayout->addWidget( mDefaultComboBox );
5620 setLayout( vlayout );
5625 QVariant defaultVal;
5626 if ( mDefaultComboBox->currentText().isEmpty() )
5627 defaultVal = QVariant();
5629 defaultVal = mDefaultComboBox->currentText();
5630 auto param = std::make_unique< QgsProcessingParameterMapTheme>( name, description, defaultVal );
5632 return param.release();
5642QWidget *QgsProcessingMapThemeWidgetWrapper::createWidget()
5646 mComboBox =
new QComboBox();
5649 mComboBox->addItem( tr(
"[Not selected]" ), QVariant( -1 ) );
5652 for (
const QString &theme : mapThemes )
5664 mComboBox->setEditable(
true );
5668 mComboBox->setToolTip( parameterDefinition()->toolTip() );
5669 connect( mComboBox, qOverload<int>( &QComboBox::currentIndexChanged ),
this, [ = ](
int )
5671 emit widgetValueHasChanged(
this );
5677void QgsProcessingMapThemeWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext &context )
5681 if ( !value.isValid() )
5682 mComboBox->setCurrentIndex( mComboBox->findData( QVariant( -1 ) ) );
5685 if ( mComboBox->isEditable() && mComboBox->findData( v ) == -1 )
5687 const QString prev = mComboBox->currentText();
5688 mComboBox->setCurrentText( v );
5690 emit widgetValueHasChanged(
this );
5693 mComboBox->setCurrentIndex( mComboBox->findData( v ) );
5697QVariant QgsProcessingMapThemeWidgetWrapper::widgetValue()
const
5700 return mComboBox->currentData().toInt() == -1 ? QVariant() :
5701 !mComboBox->currentData().isValid() && mComboBox->isEditable() ? mComboBox->currentText().isEmpty() ? QVariant() : QVariant( mComboBox->currentText() )
5702 : mComboBox->currentData();
5707QStringList QgsProcessingMapThemeWidgetWrapper::compatibleParameterTypes()
const
5709 return QStringList()
5714QStringList QgsProcessingMapThemeWidgetWrapper::compatibleOutputTypes()
const
5716 return QStringList()
5721QString QgsProcessingMapThemeWidgetWrapper::modelerExpressionFormatString()
const
5723 return tr(
"map theme as a string value (e.g. 'base maps')" );
5726QString QgsProcessingMapThemeWidgetWrapper::parameterType()
const
5733 return new QgsProcessingMapThemeWidgetWrapper( parameter, type );
5738 return new QgsProcessingMapThemeParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
5751 QVBoxLayout *vlayout =
new QVBoxLayout();
5752 vlayout->setContentsMargins( 0, 0, 0, 0 );
5754 vlayout->addWidget(
new QLabel( tr(
"Type" ) ) );
5756 mTypeComboBox =
new QComboBox();
5761 mTypeComboBox->setCurrentIndex( mTypeComboBox->findData(
static_cast< int >( datetimeParam->dataType() ) ) );
5763 mTypeComboBox->setCurrentIndex( 0 );
5764 vlayout->addWidget( mTypeComboBox );
5766 setLayout( vlayout );
5771 auto param = std::make_unique< QgsProcessingParameterDateTime >( name, description );
5774 return param.release();
5784QWidget *QgsProcessingDateTimeWidgetWrapper::createWidget()
5789 switch ( dateTimeParam->
dataType() )
5793 widget = mDateTimeEdit;
5816 widget->setToolTip( parameterDefinition()->toolTip() );
5818 if ( mDateTimeEdit )
5822 emit widgetValueHasChanged(
this );
5825 else if ( mDateEdit )
5829 emit widgetValueHasChanged(
this );
5832 else if ( mTimeEdit )
5836 emit widgetValueHasChanged(
this );
5845 return new QgsProcessingDateTimeParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
5848void QgsProcessingDateTimeWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext &context )
5850 if ( mDateTimeEdit )
5854 else if ( mDateEdit )
5858 else if ( mTimeEdit )
5864QVariant QgsProcessingDateTimeWidgetWrapper::widgetValue()
const
5866 if ( mDateTimeEdit )
5867 return !mDateTimeEdit->dateTime().isNull() && mDateTimeEdit->dateTime().isValid() ? QVariant( mDateTimeEdit->dateTime() ) : QVariant();
5868 else if ( mDateEdit )
5869 return !mDateEdit->date().isNull() && mDateEdit->date().isValid() ? QVariant( mDateEdit->date() ) : QVariant();
5870 else if ( mTimeEdit )
5871 return !mTimeEdit->time().isNull() && mTimeEdit->time().isValid() ? QVariant( mTimeEdit->time() ) : QVariant();
5876QStringList QgsProcessingDateTimeWidgetWrapper::compatibleParameterTypes()
const
5878 return QStringList()
5883QStringList QgsProcessingDateTimeWidgetWrapper::compatibleOutputTypes()
const
5885 return QStringList()
5890QString QgsProcessingDateTimeWidgetWrapper::modelerExpressionFormatString()
const
5893 if ( dateTimeParam )
5895 switch ( dateTimeParam->
dataType() )
5898 return tr(
"datetime value, or a ISO string representation of a datetime" );
5901 return tr(
"date value, or a ISO string representation of a date" );
5904 return tr(
"time value, or a ISO string representation of a time" );
5910QString QgsProcessingDateTimeWidgetWrapper::parameterType()
const
5917 return new QgsProcessingDateTimeWidgetWrapper( parameter, type );
5931 QVBoxLayout *vlayout =
new QVBoxLayout();
5932 vlayout->setContentsMargins( 0, 0, 0, 0 );
5934 vlayout->addWidget(
new QLabel( tr(
"Provider" ) ) );
5935 mProviderComboBox =
new QComboBox();
5936 mProviderComboBox->addItem( QObject::tr(
"Postgres" ), QStringLiteral(
"postgres" ) );
5937 mProviderComboBox->addItem( QObject::tr(
"GeoPackage" ), QStringLiteral(
"ogr" ) );
5938 mProviderComboBox->addItem( QObject::tr(
"Spatialite" ), QStringLiteral(
"spatialite" ) );
5940 vlayout->addWidget( mProviderComboBox );
5942 vlayout->addWidget(
new QLabel( tr(
"Default value" ) ) );
5944 mDefaultEdit =
new QLineEdit();
5945 vlayout->addWidget( mDefaultEdit );
5946 setLayout( vlayout );
5948 if ( connectionParam )
5950 mProviderComboBox->setCurrentIndex( mProviderComboBox->findData( connectionParam->
providerId() ) );
5957 QVariant defaultVal;
5958 if ( mDefaultEdit->text().isEmpty() )
5959 defaultVal = QVariant();
5961 defaultVal = mDefaultEdit->text();
5962 auto param = std::make_unique< QgsProcessingParameterProviderConnection>( name, description, mProviderComboBox->currentData().toString(), defaultVal );
5964 return param.release();
5974QWidget *QgsProcessingProviderConnectionWidgetWrapper::createWidget()
5980 mProviderComboBox->setAllowEmptyConnection(
true );
5988 mProviderComboBox->setEditable(
true );
5992 mProviderComboBox->setToolTip( parameterDefinition()->toolTip() );
5993 connect( mProviderComboBox, &QgsProviderConnectionComboBox::currentTextChanged,
this, [ = ](
const QString & )
5995 if ( mBlockSignals )
5998 emit widgetValueHasChanged(
this );
6001 return mProviderComboBox;
6006 return new QgsProcessingProviderConnectionParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
6009void QgsProcessingProviderConnectionWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext &context )
6013 if ( !value.isValid() )
6014 mProviderComboBox->setCurrentIndex( -1 );
6017 if ( mProviderComboBox->isEditable() )
6019 const QString prev = mProviderComboBox->currentText();
6021 mProviderComboBox->setConnection( v );
6022 mProviderComboBox->setCurrentText( v );
6026 emit widgetValueHasChanged(
this );
6029 mProviderComboBox->setConnection( v );
6033QVariant QgsProcessingProviderConnectionWidgetWrapper::widgetValue()
const
6035 if ( mProviderComboBox )
6036 if ( mProviderComboBox->isEditable() )
6037 return mProviderComboBox->currentText().isEmpty() ? QVariant() : QVariant( mProviderComboBox->currentText() );
6039 return mProviderComboBox->currentConnection().isEmpty() ? QVariant() : QVariant( mProviderComboBox->currentConnection() );
6044QStringList QgsProcessingProviderConnectionWidgetWrapper::compatibleParameterTypes()
const
6046 return QStringList()
6052QStringList QgsProcessingProviderConnectionWidgetWrapper::compatibleOutputTypes()
const
6054 return QStringList()
6059QString QgsProcessingProviderConnectionWidgetWrapper::modelerExpressionFormatString()
const
6061 return tr(
"connection name as a string value" );
6064QString QgsProcessingProviderConnectionWidgetWrapper::parameterType()
const
6071 return new QgsProcessingProviderConnectionWidgetWrapper( parameter, type );
6086 QVBoxLayout *vlayout =
new QVBoxLayout();
6087 vlayout->setContentsMargins( 0, 0, 0, 0 );
6089 mConnectionParamComboBox =
new QComboBox();
6090 QString initialConnection;
6096 if (
auto *lModel = widgetContext.
model() )
6099 const QMap<QString, QgsProcessingModelParameter> components = lModel->parameterComponents();
6100 for (
auto it = components.constBegin(); it != components.constEnd(); ++it )
6102 if ( definition && it->parameterName() == definition->
name() )
6108 mConnectionParamComboBox->addItem( it->parameterName(), it->parameterName() );
6109 if ( !initialConnection.isEmpty() && initialConnection == it->parameterName() )
6111 mConnectionParamComboBox->setCurrentIndex( mConnectionParamComboBox->count() - 1 );
6116 if ( mConnectionParamComboBox->count() == 0 && !initialConnection.isEmpty() )
6119 mConnectionParamComboBox->addItem( initialConnection, initialConnection );
6120 mConnectionParamComboBox->setCurrentIndex( mConnectionParamComboBox->count() - 1 );
6123 vlayout->addWidget(
new QLabel( tr(
"Provider connection parameter" ) ) );
6124 vlayout->addWidget( mConnectionParamComboBox );
6126 vlayout->addWidget(
new QLabel( tr(
"Default value" ) ) );
6128 mDefaultEdit =
new QLineEdit();
6129 vlayout->addWidget( mDefaultEdit );
6130 setLayout( vlayout );
6140 QVariant defaultVal;
6141 if ( mDefaultEdit->text().isEmpty() )
6142 defaultVal = QVariant();
6144 defaultVal = mDefaultEdit->text();
6145 auto param = std::make_unique< QgsProcessingParameterDatabaseSchema>( name, description, mConnectionParamComboBox->currentData().toString(), defaultVal );
6147 return param.release();
6157QWidget *QgsProcessingDatabaseSchemaWidgetWrapper::createWidget()
6163 mSchemaComboBox->setAllowEmptySchema(
true );
6171 mSchemaComboBox->comboBox()->setEditable(
true );
6175 mSchemaComboBox->setToolTip( parameterDefinition()->toolTip() );
6176 connect( mSchemaComboBox->comboBox(), &QComboBox::currentTextChanged,
this, [ = ](
const QString & )
6178 if ( mBlockSignals )
6181 emit widgetValueHasChanged( this );
6184 return mSchemaComboBox;
6189 return new QgsProcessingDatabaseSchemaParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
6196 std::unique_ptr< QgsProcessingContext > tmpContext;
6197 if ( mProcessingContextGenerator )
6198 context = mProcessingContextGenerator->processingContext();
6202 tmpContext = std::make_unique< QgsProcessingContext >();
6203 context = tmpContext.get();
6209 if ( mSchemaComboBox )
6210 mSchemaComboBox->setConnectionName( connection, qgis::down_cast< const QgsProcessingParameterProviderConnection * >( parentWrapper->
parameterDefinition() )->providerId() );
6214 setWidgetValue( parameterDefinition()->defaultValueForGui(), *context );
6217void QgsProcessingDatabaseSchemaWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext &context )
6221 if ( !value.isValid() )
6222 mSchemaComboBox->comboBox()->setCurrentIndex( -1 );
6225 if ( mSchemaComboBox->comboBox()->isEditable() )
6227 const QString prev = mSchemaComboBox->comboBox()->currentText();
6229 mSchemaComboBox->setSchema( v );
6230 mSchemaComboBox->comboBox()->setCurrentText( v );
6234 emit widgetValueHasChanged(
this );
6237 mSchemaComboBox->setSchema( v );
6241QVariant QgsProcessingDatabaseSchemaWidgetWrapper::widgetValue()
const
6243 if ( mSchemaComboBox )
6244 if ( mSchemaComboBox->comboBox()->isEditable() )
6245 return mSchemaComboBox->comboBox()->currentText().isEmpty() ? QVariant() : QVariant( mSchemaComboBox->comboBox()->currentText() );
6247 return mSchemaComboBox->currentSchema().isEmpty() ? QVariant() : QVariant( mSchemaComboBox->currentSchema() );
6252QStringList QgsProcessingDatabaseSchemaWidgetWrapper::compatibleParameterTypes()
const
6254 return QStringList()
6260QStringList QgsProcessingDatabaseSchemaWidgetWrapper::compatibleOutputTypes()
const
6262 return QStringList()
6267QString QgsProcessingDatabaseSchemaWidgetWrapper::modelerExpressionFormatString()
const
6269 return tr(
"database schema name as a string value" );
6272QString QgsProcessingDatabaseSchemaWidgetWrapper::parameterType()
const
6279 return new QgsProcessingDatabaseSchemaWidgetWrapper( parameter, type );
6282void QgsProcessingDatabaseSchemaWidgetWrapper::postInitialize(
const QList<QgsAbstractProcessingParameterWidgetWrapper *> &wrappers )
6294 setParentConnectionWrapperValue( wrapper );
6297 setParentConnectionWrapperValue( wrapper );
6321 QVBoxLayout *vlayout =
new QVBoxLayout();
6322 vlayout->setContentsMargins( 0, 0, 0, 0 );
6324 mConnectionParamComboBox =
new QComboBox();
6325 mSchemaParamComboBox =
new QComboBox();
6326 QString initialConnection;
6327 QString initialSchema;
6334 if (
auto *lModel = widgetContext.
model() )
6337 const QMap<QString, QgsProcessingModelParameter> components = lModel->parameterComponents();
6338 for (
auto it = components.constBegin(); it != components.constEnd(); ++it )
6340 if ( definition && it->parameterName() == definition->
name() )
6345 mConnectionParamComboBox->addItem( it->parameterName(), it->parameterName() );
6346 if ( !initialConnection.isEmpty() && initialConnection == it->parameterName() )
6348 mConnectionParamComboBox->setCurrentIndex( mConnectionParamComboBox->count() - 1 );
6353 mSchemaParamComboBox->addItem( it->parameterName(), it->parameterName() );
6354 if ( !initialConnection.isEmpty() && initialConnection == it->parameterName() )
6356 mSchemaParamComboBox->setCurrentIndex( mSchemaParamComboBox->count() - 1 );
6362 if ( mConnectionParamComboBox->count() == 0 && !initialConnection.isEmpty() )
6365 mConnectionParamComboBox->addItem( initialConnection, initialConnection );
6366 mConnectionParamComboBox->setCurrentIndex( mConnectionParamComboBox->count() - 1 );
6369 if ( mSchemaParamComboBox->count() == 0 && !initialSchema.isEmpty() )
6372 mSchemaParamComboBox->addItem( initialSchema, initialSchema );
6373 mSchemaParamComboBox->setCurrentIndex( mSchemaParamComboBox->count() - 1 );
6376 vlayout->addWidget(
new QLabel( tr(
"Provider connection parameter" ) ) );
6377 vlayout->addWidget( mConnectionParamComboBox );
6379 vlayout->addWidget(
new QLabel( tr(
"Database schema parameter" ) ) );
6380 vlayout->addWidget( mSchemaParamComboBox );
6382 vlayout->addWidget(
new QLabel( tr(
"Default value" ) ) );
6384 mDefaultEdit =
new QLineEdit();
6385 vlayout->addWidget( mDefaultEdit );
6386 setLayout( vlayout );
6396 QVariant defaultVal;
6397 if ( mDefaultEdit->text().isEmpty() )
6398 defaultVal = QVariant();
6400 defaultVal = mDefaultEdit->text();
6401 auto param = std::make_unique< QgsProcessingParameterDatabaseTable>( name, description,
6402 mConnectionParamComboBox->currentData().toString(),
6403 mSchemaParamComboBox->currentData().toString(),
6406 return param.release();
6416QWidget *QgsProcessingDatabaseTableWidgetWrapper::createWidget()
6422 mTableComboBox->setAllowEmptyTable(
true );
6425 mTableComboBox->comboBox()->setEditable(
true );
6427 mTableComboBox->setToolTip( parameterDefinition()->toolTip() );
6428 connect( mTableComboBox->comboBox(), &QComboBox::currentTextChanged,
this, [ = ](
const QString & )
6430 if ( mBlockSignals )
6433 emit widgetValueHasChanged( this );
6436 return mTableComboBox;
6441 return new QgsProcessingDatabaseTableParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
6448 std::unique_ptr< QgsProcessingContext > tmpContext;
6449 if ( mProcessingContextGenerator )
6450 context = mProcessingContextGenerator->processingContext();
6454 tmpContext = std::make_unique< QgsProcessingContext >();
6455 context = tmpContext.get();
6460 mProvider = qgis::down_cast< const QgsProcessingParameterProviderConnection * >( parentWrapper->
parameterDefinition() )->providerId();
6461 if ( mTableComboBox && !mSchema.isEmpty() )
6463 mTableComboBox->setSchema( mSchema );
6464 mTableComboBox->setConnectionName( mConnection, mProvider );
6468 setWidgetValue( parameterDefinition()->defaultValueForGui(), *context );
6476 std::unique_ptr< QgsProcessingContext > tmpContext;
6477 if ( mProcessingContextGenerator )
6478 context = mProcessingContextGenerator->processingContext();
6482 tmpContext = std::make_unique< QgsProcessingContext >();
6483 context = tmpContext.get();
6489 if ( mTableComboBox && !mSchema.isEmpty() && !mConnection.isEmpty() )
6491 mTableComboBox->setSchema( mSchema );
6492 mTableComboBox->setConnectionName( mConnection, mProvider );
6496 setWidgetValue( parameterDefinition()->defaultValueForGui(), *context );
6501void QgsProcessingDatabaseTableWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext &context )
6505 if ( !value.isValid() )
6506 mTableComboBox->comboBox()->setCurrentIndex( -1 );
6509 if ( mTableComboBox->comboBox()->isEditable() )
6511 const QString prev = mTableComboBox->comboBox()->currentText();
6513 mTableComboBox->setTable( v );
6514 mTableComboBox->comboBox()->setCurrentText( v );
6518 emit widgetValueHasChanged(
this );
6521 mTableComboBox->setTable( v );
6525QVariant QgsProcessingDatabaseTableWidgetWrapper::widgetValue()
const
6527 if ( mTableComboBox )
6528 if ( mTableComboBox->comboBox()->isEditable() )
6529 return mTableComboBox->comboBox()->currentText().isEmpty() ? QVariant() : QVariant( mTableComboBox->comboBox()->currentText() );
6531 return mTableComboBox->currentTable().isEmpty() ? QVariant() : QVariant( mTableComboBox->currentTable() );
6536QStringList QgsProcessingDatabaseTableWidgetWrapper::compatibleParameterTypes()
const
6538 return QStringList()
6544QStringList QgsProcessingDatabaseTableWidgetWrapper::compatibleOutputTypes()
const
6546 return QStringList()
6551QString QgsProcessingDatabaseTableWidgetWrapper::modelerExpressionFormatString()
const
6553 return tr(
"database table name as a string value" );
6556QString QgsProcessingDatabaseTableWidgetWrapper::parameterType()
const
6563 return new QgsProcessingDatabaseTableWidgetWrapper( parameter, type );
6566void QgsProcessingDatabaseTableWidgetWrapper::postInitialize(
const QList<QgsAbstractProcessingParameterWidgetWrapper *> &wrappers )
6578 setParentConnectionWrapperValue( wrapper );
6581 setParentConnectionWrapperValue( wrapper );
6586 setParentSchemaWrapperValue( wrapper );
6589 setParentSchemaWrapperValue( wrapper );
6609 QVBoxLayout *vlayout =
new QVBoxLayout();
6610 vlayout->setContentsMargins( 0, 0, 0, 0 );
6612 vlayout->addWidget(
new QLabel( tr(
"Default value" ) ) );
6615 mDefaultWidget->setNullValueAllowed(
true, tr(
"Not set" ) );
6618 if ( extentParam->defaultValueForGui().isValid() )
6622 mDefaultWidget->setCurrentExtent( rect,
crs );
6623 mDefaultWidget->setOutputExtentFromCurrent();
6627 mDefaultWidget->clear();
6631 vlayout->addWidget( mDefaultWidget );
6632 setLayout( vlayout );
6637 const QString defaultVal = mDefaultWidget->isValid() ? QStringLiteral(
"%1,%2,%3,%4%5" ).arg(
6638 QString::number( mDefaultWidget->outputExtent().xMinimum(),
'f', 9 ),
6639 QString::number( mDefaultWidget->outputExtent().xMaximum(),
'f', 9 ),
6640 QString::number( mDefaultWidget->outputExtent().yMinimum(),
'f', 9 ),
6641 QString::number( mDefaultWidget->outputExtent().yMaximum(),
'f', 9 ),
6642 mDefaultWidget->outputCrs().isValid() ? QStringLiteral(
" [%1]" ).arg( mDefaultWidget->outputCrs().authid() ) : QString()
6644 auto param = std::make_unique< QgsProcessingParameterExtent >( name, description, !defaultVal.isEmpty() ? QVariant( defaultVal ) : QVariant() );
6646 return param.release();
6657QWidget *QgsProcessingExtentWidgetWrapper::createWidget()
6667 if ( widgetContext().mapCanvas() )
6668 mExtentWidget->setMapCanvas( widgetContext().mapCanvas() );
6671 mExtentWidget->setNullValueAllowed(
true, tr(
"Not set" ) );
6673 mExtentWidget->setToolTip( parameterDefinition()->toolTip() );
6677 emit widgetValueHasChanged(
this );
6681 setDialog( mDialog );
6683 return mExtentWidget;
6693 mExtentWidget->setMapCanvas( context.
mapCanvas() );
6696void QgsProcessingExtentWidgetWrapper::setDialog( QDialog *dialog )
6704 mDialog->showMinimized();
6707 mDialog->showNormal();
6709 mDialog->activateWindow();
6716void QgsProcessingExtentWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext &context )
6718 if ( mExtentWidget )
6720 if ( !value.isValid() || ( value.userType() == QMetaType::Type::QString && value.toString().isEmpty() ) )
6721 mExtentWidget->clear();
6726 mExtentWidget->setCurrentExtent( r,
crs );
6727 mExtentWidget->setOutputExtentFromUser( r,
crs );
6732QVariant QgsProcessingExtentWidgetWrapper::widgetValue()
const
6734 if ( mExtentWidget )
6736 const QString val = mExtentWidget->isValid() ? QStringLiteral(
"%1,%2,%3,%4%5" ).arg(
6737 QString::number( mExtentWidget->outputExtent().xMinimum(),
'f', 9 ),
6738 QString::number( mExtentWidget->outputExtent().xMaximum(),
'f', 9 ),
6739 QString::number( mExtentWidget->outputExtent().yMinimum(),
'f', 9 ),
6740 QString::number( mExtentWidget->outputExtent().yMaximum(),
'f', 9 ),
6741 mExtentWidget->outputCrs().isValid() ? QStringLiteral(
" [%1]" ).arg( mExtentWidget->outputCrs().authid() ) : QString()
6744 return val.isEmpty() ? QVariant() : QVariant( val );
6750QStringList QgsProcessingExtentWidgetWrapper::compatibleParameterTypes()
const
6752 return QStringList()
6764QStringList QgsProcessingExtentWidgetWrapper::compatibleOutputTypes()
const
6766 return QStringList()
6774QString QgsProcessingExtentWidgetWrapper::modelerExpressionFormatString()
const
6776 return tr(
"string of the format 'x min,x max,y min,y max' or a geometry value (bounding box is used)" );
6779QString QgsProcessingExtentWidgetWrapper::parameterType()
const
6786 return new QgsProcessingExtentWidgetWrapper( parameter, type );
6791 return new QgsProcessingExtentParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
6803 QVBoxLayout *vlayout =
new QVBoxLayout();
6804 vlayout->setContentsMargins( 0, 0, 0, 0 );
6806 vlayout->addWidget(
new QLabel( tr(
"Layer type" ) ) );
6821 for (
int i : layerParam->dataTypes() )
6823 mLayerTypeComboBox->setItemCheckState( mLayerTypeComboBox->findData( i ), Qt::Checked );
6827 vlayout->addWidget( mLayerTypeComboBox );
6829 setLayout( vlayout );
6834 QList< int > dataTypes;
6835 for (
const QVariant &v : mLayerTypeComboBox->checkedItemsData() )
6836 dataTypes << v.toInt();
6838 auto param = std::make_unique< QgsProcessingParameterMapLayer >( name, description );
6839 param->setDataTypes( dataTypes );
6841 return param.release();
6850QWidget *QgsProcessingMapLayerWidgetWrapper::createWidget()
6852 mComboBox =
new QgsProcessingMapLayerComboBox( parameterDefinition(), type() );
6860 mComboBox->setEditable(
true );
6864 mComboBox->setToolTip( parameterDefinition()->toolTip() );
6866 connect( mComboBox, &QgsProcessingMapLayerComboBox::valueChanged,
this, [ = ]()
6868 if ( mBlockSignals )
6871 emit widgetValueHasChanged(
this );
6874 setWidgetContext( widgetContext() );
6883 mComboBox->setWidgetContext( context );
6888 if ( !parameterDefinition()->defaultValueForGui().isValid() )
6894void QgsProcessingMapLayerWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext &context )
6897 mComboBox->setValue( value, context );
6900QVariant QgsProcessingMapLayerWidgetWrapper::widgetValue()
const
6902 return mComboBox ? mComboBox->value() : QVariant();
6905QStringList QgsProcessingMapLayerWidgetWrapper::compatibleParameterTypes()
const
6907 return QStringList()
6918QStringList QgsProcessingMapLayerWidgetWrapper::compatibleOutputTypes()
const
6920 return QStringList()
6929QString QgsProcessingMapLayerWidgetWrapper::modelerExpressionFormatString()
const
6931 return tr(
"path to a map layer" );
6948QString QgsProcessingMapLayerWidgetWrapper::parameterType()
const
6955 return new QgsProcessingMapLayerWidgetWrapper( parameter, type );
6960 return new QgsProcessingMapLayerParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
6969 : QgsProcessingMapLayerWidgetWrapper( parameter, type, parent )
6974QStringList QgsProcessingRasterLayerWidgetWrapper::compatibleParameterTypes()
const
6976 return QStringList()
6983QStringList QgsProcessingRasterLayerWidgetWrapper::compatibleOutputTypes()
const
6985 return QStringList()
6993QString QgsProcessingRasterLayerWidgetWrapper::modelerExpressionFormatString()
const
6995 return tr(
"path to a raster layer" );
6998QString QgsProcessingRasterLayerWidgetWrapper::parameterType()
const
7005 return new QgsProcessingRasterLayerWidgetWrapper( parameter, type );
7010 Q_UNUSED( context );
7011 Q_UNUSED( widgetContext );
7012 Q_UNUSED( definition );
7026 QVBoxLayout *vlayout =
new QVBoxLayout();
7027 vlayout->setContentsMargins( 0, 0, 0, 0 );
7029 vlayout->addWidget(
new QLabel( tr(
"Geometry type" ) ) );
7039 for (
int i : vectorParam->dataTypes() )
7041 mGeometryTypeComboBox->setItemCheckState( mGeometryTypeComboBox->findData( i ), Qt::Checked );
7045 vlayout->addWidget( mGeometryTypeComboBox );
7047 setLayout( vlayout );
7052 QList< int > dataTypes;
7053 for (
const QVariant &v : mGeometryTypeComboBox->checkedItemsData() )
7054 dataTypes << v.toInt();
7056 auto param = std::make_unique< QgsProcessingParameterVectorLayer >( name, description, dataTypes );
7058 return param.release();
7063 : QgsProcessingMapLayerWidgetWrapper( parameter, type, parent )
7068QStringList QgsProcessingVectorLayerWidgetWrapper::compatibleParameterTypes()
const
7070 return QStringList()
7077QStringList QgsProcessingVectorLayerWidgetWrapper::compatibleOutputTypes()
const
7079 return QStringList()
7087QString QgsProcessingVectorLayerWidgetWrapper::modelerExpressionFormatString()
const
7089 return tr(
"path to a vector layer" );
7095 return param->dataTypes();
7097 return QList< int >();
7100QString QgsProcessingVectorLayerWidgetWrapper::parameterType()
const
7107 return new QgsProcessingVectorLayerWidgetWrapper( parameter, type );
7112 return new QgsProcessingVectorLayerParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
7124 QVBoxLayout *vlayout =
new QVBoxLayout();
7125 vlayout->setContentsMargins( 0, 0, 0, 0 );
7127 vlayout->addWidget(
new QLabel( tr(
"Geometry type" ) ) );
7137 for (
int i : sourceParam->dataTypes() )
7139 mGeometryTypeComboBox->setItemCheckState( mGeometryTypeComboBox->findData( i ), Qt::Checked );
7147 vlayout->addWidget( mGeometryTypeComboBox );
7149 setLayout( vlayout );
7154 QList< int > dataTypes;
7155 for (
const QVariant &v : mGeometryTypeComboBox->checkedItemsData() )
7156 dataTypes << v.toInt();
7158 auto param = std::make_unique< QgsProcessingParameterFeatureSource >( name, description, dataTypes );
7160 return param.release();
7164 : QgsProcessingMapLayerWidgetWrapper( parameter, type, parent )
7169QStringList QgsProcessingFeatureSourceWidgetWrapper::compatibleParameterTypes()
const
7171 return QStringList()
7179QStringList QgsProcessingFeatureSourceWidgetWrapper::compatibleOutputTypes()
const
7181 return QStringList()
7189QString QgsProcessingFeatureSourceWidgetWrapper::modelerExpressionFormatString()
const
7191 return tr(
"path to a vector layer" );
7197 return param->dataTypes();
7199 return QList< int >();
7202QString QgsProcessingFeatureSourceWidgetWrapper::parameterType()
const
7209 return new QgsProcessingFeatureSourceWidgetWrapper( parameter, type );
7214 return new QgsProcessingFeatureSourceParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
7222 : QgsProcessingMapLayerWidgetWrapper( parameter, type, parent )
7227QStringList QgsProcessingMeshLayerWidgetWrapper::compatibleParameterTypes()
const
7229 return QStringList()
7236QStringList QgsProcessingMeshLayerWidgetWrapper::compatibleOutputTypes()
const
7238 return QStringList()
7246QString QgsProcessingMeshLayerWidgetWrapper::modelerExpressionFormatString()
const
7248 return tr(
"path to a mesh layer" );
7251QString QgsProcessingMeshLayerWidgetWrapper::parameterType()
const
7258 return new QgsProcessingMeshLayerWidgetWrapper( parameter, type );
7263 Q_UNUSED( context );
7264 Q_UNUSED( widgetContext );
7265 Q_UNUSED( definition );
7277QgsProcessingRasterBandPanelWidget::QgsProcessingRasterBandPanelWidget( QWidget *parent,
const QgsProcessingParameterBand *param )
7281 QHBoxLayout *hl =
new QHBoxLayout();
7282 hl->setContentsMargins( 0, 0, 0, 0 );
7284 mLineEdit =
new QLineEdit();
7285 mLineEdit->setEnabled(
false );
7286 hl->addWidget( mLineEdit, 1 );
7288 mToolButton =
new QToolButton();
7289 mToolButton->setText( QString( QChar( 0x2026 ) ) );
7290 hl->addWidget( mToolButton );
7296 mLineEdit->setText( tr(
"%n band(s) selected",
nullptr, 0 ) );
7299 connect( mToolButton, &QToolButton::clicked,
this, &QgsProcessingRasterBandPanelWidget::showDialog );
7302void QgsProcessingRasterBandPanelWidget::setBands(
const QList< int > &bands )
7307void QgsProcessingRasterBandPanelWidget::setBandNames(
const QHash<int, QString> &names )
7312void QgsProcessingRasterBandPanelWidget::setValue(
const QVariant &value )
7314 if ( value.isValid() )
7315 mValue = value.userType() == QMetaType::Type::QVariantList ? value.toList() : QVariantList() << value;
7319 updateSummaryText();
7323void QgsProcessingRasterBandPanelWidget::showDialog()
7325 QVariantList availableOptions;
7326 availableOptions.reserve( mBands.size() );
7327 for (
int band : std::as_const( mBands ) )
7329 availableOptions << band;
7335 QgsProcessingMultipleSelectionPanelWidget *widget =
new QgsProcessingMultipleSelectionPanelWidget( availableOptions, mValue );
7336 widget->setPanelTitle( mParam->description() );
7338 widget->setValueFormatter( [
this](
const QVariant & v ) -> QString
7340 int band = v.toInt();
7341 return mBandNames.contains( band ) ? mBandNames.value( band ) : v.toString();
7344 connect( widget, &QgsProcessingMultipleSelectionPanelWidget::selectionChanged,
this, [ = ]()
7346 setValue( widget->selectedOptions() );
7353 QgsProcessingMultipleSelectionDialog dlg( availableOptions, mValue,
this, Qt::WindowFlags() );
7355 dlg.setValueFormatter( [
this](
const QVariant & v ) -> QString
7357 int band = v.toInt();
7358 return mBandNames.contains( band ) ? mBandNames.value( band ) : v.toString();
7362 setValue( dlg.selectedOptions() );
7367void QgsProcessingRasterBandPanelWidget::updateSummaryText()
7370 mLineEdit->setText( tr(
"%n band(s) selected",
nullptr, mValue.count() ) );
7382 QVBoxLayout *vlayout =
new QVBoxLayout();
7383 vlayout->setContentsMargins( 0, 0, 0, 0 );
7385 vlayout->addWidget(
new QLabel( tr(
"Default value" ) ) );
7387 mDefaultLineEdit =
new QLineEdit();
7388 mDefaultLineEdit->setToolTip( tr(
"Band number (separate bands with ; for multiple band parameters)" ) );
7393 for (
int b : bands )
7395 defVal << QString::number( b );
7398 mDefaultLineEdit->setText( defVal.join(
';' ) );
7400 vlayout->addWidget( mDefaultLineEdit );
7402 vlayout->addWidget(
new QLabel( tr(
"Parent layer" ) ) );
7403 mParentLayerComboBox =
new QComboBox();
7405 QString initialParent;
7407 initialParent = bandParam->parentLayerParameterName();
7409 if (
auto *lModel = widgetContext.
model() )
7412 const QMap<QString, QgsProcessingModelParameter> components = lModel->parameterComponents();
7413 for (
auto it = components.constBegin(); it != components.constEnd(); ++it )
7417 mParentLayerComboBox-> addItem( definition->
description(), definition->
name() );
7418 if ( !initialParent.isEmpty() && initialParent == definition->
name() )
7420 mParentLayerComboBox->setCurrentIndex( mParentLayerComboBox->count() - 1 );
7426 if ( mParentLayerComboBox->count() == 0 && !initialParent.isEmpty() )
7429 mParentLayerComboBox->addItem( initialParent, initialParent );
7430 mParentLayerComboBox->setCurrentIndex( mParentLayerComboBox->count() - 1 );
7433 vlayout->addWidget( mParentLayerComboBox );
7435 mAllowMultipleCheckBox =
new QCheckBox( tr(
"Allow multiple" ) );
7437 mAllowMultipleCheckBox->setChecked( bandParam->allowMultiple() );
7439 vlayout->addWidget( mAllowMultipleCheckBox );
7440 setLayout( vlayout );
7445 auto param = std::make_unique< QgsProcessingParameterBand >( name, description, mDefaultLineEdit->text().split(
';' ), mParentLayerComboBox->currentData().toString(),
false, mAllowMultipleCheckBox->isChecked() );
7447 return param.release();
7456QWidget *QgsProcessingBandWidgetWrapper::createWidget()
7466 mPanel =
new QgsProcessingRasterBandPanelWidget(
nullptr, bandParam );
7467 mPanel->setToolTip( parameterDefinition()->toolTip() );
7468 connect( mPanel, &QgsProcessingRasterBandPanelWidget::changed,
this, [ = ]
7470 emit widgetValueHasChanged(
this );
7479 mComboBox->setToolTip( parameterDefinition()->toolTip() );
7482 emit widgetValueHasChanged(
this );
7490 mLineEdit =
new QLineEdit();
7491 mLineEdit->setToolTip( QObject::tr(
"Band number (separate bands with ; for multiple band parameters)" ) );
7492 connect( mLineEdit, &QLineEdit::textChanged,
this, [ = ]
7494 emit widgetValueHasChanged(
this );
7503void QgsProcessingBandWidgetWrapper::postInitialize(
const QList<QgsAbstractProcessingParameterWidgetWrapper *> &wrappers )
7515 setParentLayerWrapperValue( wrapper );
7518 setParentLayerWrapperValue( wrapper );
7535 std::unique_ptr< QgsProcessingContext > tmpContext;
7536 if ( mProcessingContextGenerator )
7537 context = mProcessingContextGenerator->processingContext();
7541 tmpContext = std::make_unique< QgsProcessingContext >();
7542 context = tmpContext.get();
7548 if ( layer && layer->
isValid() )
7552 std::unique_ptr< QgsMapLayer > ownedLayer( context->
takeResultLayer( layer->
id() ) );
7555 mParentLayer.reset( qobject_cast< QgsRasterLayer * >( ownedLayer.release() ) );
7556 layer = mParentLayer.get();
7564 mComboBox->setLayer( layer );
7568 if ( provider && layer->
isValid() )
7573 QHash< int, QString > bandNames;
7574 for (
int i = 1; i <= nBands; ++i )
7579 mPanel->setBands( bands );
7580 mPanel->setBandNames( bandNames );
7587 mComboBox->setLayer(
nullptr );
7589 mPanel->setBands( QList< int >() );
7591 if ( value.isValid() && widgetContext().messageBar() )
7594 widgetContext().
messageBar()->
pushMessage( QString(), QObject::tr(
"Could not load selected layer/table. Dependent bands could not be populated" ),
7599 if ( parameterDefinition()->defaultValueForGui().isValid() )
7600 setWidgetValue( parameterDefinition()->defaultValueForGui(), *context );
7603void QgsProcessingBandWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext &context )
7607 if ( !value.isValid() )
7608 mComboBox->setBand( -1 );
7612 mComboBox->setBand( v );
7618 if ( value.isValid() )
7621 opts.reserve( v.size() );
7626 mPanel->setValue( value.isValid() ? opts : QVariant() );
7628 else if ( mLineEdit )
7635 opts.reserve( v.size() );
7637 opts << QString::number( i );
7638 mLineEdit->setText( value.isValid() && !opts.empty() ? opts.join(
';' ) : QString() );
7642 if ( value.isValid() )
7650QVariant QgsProcessingBandWidgetWrapper::widgetValue()
const
7653 return mComboBox->currentBand() == -1 ? QVariant() : mComboBox->currentBand();
7655 return !mPanel->value().toList().isEmpty() ? mPanel->value() : QVariant();
7656 else if ( mLineEdit )
7661 const QStringList parts = mLineEdit->text().split(
';', Qt::SkipEmptyParts );
7663 res.reserve( parts.count() );
7664 for (
const QString &s : parts )
7667 int band = s.toInt( &ok );
7671 return res.
isEmpty() ? QVariant() : res;
7675 return mLineEdit->text().isEmpty() ? QVariant() : mLineEdit->text();
7682QStringList QgsProcessingBandWidgetWrapper::compatibleParameterTypes()
const
7684 return QStringList()
7689QStringList QgsProcessingBandWidgetWrapper::compatibleOutputTypes()
const
7691 return QStringList()
7696QString QgsProcessingBandWidgetWrapper::modelerExpressionFormatString()
const
7698 return tr(
"selected band numbers as an array of numbers, or semicolon separated string of options (e.g. '1;3')" );
7701QString QgsProcessingBandWidgetWrapper::parameterType()
const
7708 return new QgsProcessingBandWidgetWrapper( parameter, type );
7713 return new QgsProcessingBandParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
7724 setAcceptDrops(
true );
7727void QgsProcessingMultipleLayerLineEdit::dragEnterEvent( QDragEnterEvent *event )
7729 const QStringList uris = QgsProcessingMultipleInputPanelWidget::compatibleUrisFromMimeData( mParam, event->mimeData(), {} );
7730 if ( !uris.isEmpty() )
7732 event->setDropAction( Qt::CopyAction );
7734 setHighlighted(
true );
7742void QgsProcessingMultipleLayerLineEdit::dragLeaveEvent( QDragLeaveEvent *event )
7744 QgsHighlightableLineEdit::dragLeaveEvent( event );
7746 setHighlighted(
false );
7749void QgsProcessingMultipleLayerLineEdit::dropEvent( QDropEvent *event )
7751 const QStringList uris = QgsProcessingMultipleInputPanelWidget::compatibleUrisFromMimeData( mParam, event->mimeData(), {} );
7752 if ( !uris.isEmpty() )
7754 event->acceptProposedAction();
7755 QVariantList uriList;
7756 uriList.reserve( uris.size() );
7757 for (
const QString &uri : uris )
7758 uriList.append( QVariant( uri ) );
7759 emit layersDropped( uriList );
7762 setHighlighted(
false );
7773 QHBoxLayout *hl =
new QHBoxLayout();
7774 hl->setContentsMargins( 0, 0, 0, 0 );
7776 mLineEdit =
new QgsProcessingMultipleLayerLineEdit(
nullptr, param );
7777 mLineEdit->setEnabled(
true );
7778 mLineEdit->setReadOnly(
true );
7780 hl->addWidget( mLineEdit, 1 );
7781 connect( mLineEdit, &QgsProcessingMultipleLayerLineEdit::layersDropped,
this, &QgsProcessingMultipleLayerPanelWidget::setValue );
7783 mToolButton =
new QToolButton();
7784 mToolButton->setText( QString( QChar( 0x2026 ) ) );
7785 hl->addWidget( mToolButton );
7791 mLineEdit->setText( tr(
"%n input(s) selected",
nullptr, 0 ) );
7794 connect( mToolButton, &QToolButton::clicked,
this, &QgsProcessingMultipleLayerPanelWidget::showDialog );
7797void QgsProcessingMultipleLayerPanelWidget::setValue(
const QVariant &value )
7799 if ( value.isValid() )
7800 mValue = value.userType() == QMetaType::Type::QVariantList ? value.toList() : QVariantList() << value;
7804 updateSummaryText();
7808void QgsProcessingMultipleLayerPanelWidget::setProject(
QgsProject *project )
7815 if ( mValue.removeAll( layerId ) )
7817 updateSummaryText();
7824void QgsProcessingMultipleLayerPanelWidget::setModel( QgsProcessingModelAlgorithm *model,
const QString &modelChildAlgorithmID )
7830 switch ( mParam->layerType() )
7988void QgsProcessingMultipleLayerPanelWidget::showDialog()
7993 QgsProcessingMultipleInputPanelWidget *widget =
new QgsProcessingMultipleInputPanelWidget( mParam, mValue, mModelSources, mModel );
7994 widget->setPanelTitle( mParam->description() );
7995 widget->setProject( mProject );
7996 connect( widget, &QgsProcessingMultipleSelectionPanelWidget::selectionChanged,
this, [ = ]()
7998 setValue( widget->selectedOptions() );
8005 QgsProcessingMultipleInputDialog dlg( mParam, mValue, mModelSources, mModel,
this, Qt::WindowFlags() );
8006 dlg.setProject( mProject );
8009 setValue( dlg.selectedOptions() );
8014void QgsProcessingMultipleLayerPanelWidget::updateSummaryText()
8017 mLineEdit->setText( tr(
"%n input(s) selected",
nullptr, mValue.count() ) );
8027 QVBoxLayout *vlayout =
new QVBoxLayout();
8028 vlayout->setContentsMargins( 0, 0, 0, 0 );
8030 vlayout->addWidget(
new QLabel( tr(
"Allowed layer type" ) ) );
8031 mLayerTypeComboBox =
new QComboBox();
8045 mLayerTypeComboBox->setCurrentIndex( mLayerTypeComboBox->findData(
static_cast< int >( layersParam->layerType() ) ) );
8047 vlayout->addWidget( mLayerTypeComboBox );
8048 setLayout( vlayout );
8053 auto param = std::make_unique< QgsProcessingParameterMultipleLayers >( name, description,
static_cast< Qgis::ProcessingSourceType >( mLayerTypeComboBox->currentData().toInt() ) );
8055 return param.release();
8064QWidget *QgsProcessingMultipleLayerWidgetWrapper::createWidget()
8068 mPanel =
new QgsProcessingMultipleLayerPanelWidget(
nullptr, layerParam );
8069 mPanel->setToolTip( parameterDefinition()->toolTip() );
8070 mPanel->setProject( widgetContext().project() );
8072 mPanel->setModel( widgetContext().model(), widgetContext().modelChildAlgorithmId() );
8073 connect( mPanel, &QgsProcessingMultipleLayerPanelWidget::changed,
this, [ = ]
8075 emit widgetValueHasChanged(
this );
8085 mPanel->setProject( context.
project() );
8087 mPanel->setModel( widgetContext().model(), widgetContext().modelChildAlgorithmId() );
8091void QgsProcessingMultipleLayerWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext &context )
8096 if ( value.isValid() )
8099 opts.reserve( v.size() );
8101 opts << l->source();
8104 for (
const QVariant &v : value.toList() )
8106 if ( v.userType() == qMetaTypeId<QgsProcessingModelChildParameterSource>() )
8108 const QgsProcessingModelChildParameterSource source = v.value< QgsProcessingModelChildParameterSource >();
8109 opts << QVariant::fromValue( source );
8114 mPanel->setValue( value.isValid() ? opts : QVariant() );
8118QVariant QgsProcessingMultipleLayerWidgetWrapper::widgetValue()
const
8121 return !mPanel->value().toList().isEmpty() ? mPanel->value() : QVariant();
8126QStringList QgsProcessingMultipleLayerWidgetWrapper::compatibleParameterTypes()
const
8128 return QStringList()
8139QStringList QgsProcessingMultipleLayerWidgetWrapper::compatibleOutputTypes()
const
8141 return QStringList()
8151QString QgsProcessingMultipleLayerWidgetWrapper::modelerExpressionFormatString()
const
8153 return tr(
"an array of layer paths, or semicolon separated string of layer paths" );
8156QString QgsProcessingMultipleLayerWidgetWrapper::parameterType()
const
8163 return new QgsProcessingMultipleLayerWidgetWrapper( parameter, type );
8168 return new QgsProcessingMultipleLayerParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
8177 : QgsProcessingMapLayerWidgetWrapper( parameter, type, parent )
8182QStringList QgsProcessingPointCloudLayerWidgetWrapper::compatibleParameterTypes()
const
8184 return QStringList()
8191QStringList QgsProcessingPointCloudLayerWidgetWrapper::compatibleOutputTypes()
const
8193 return QStringList()
8201QString QgsProcessingPointCloudLayerWidgetWrapper::modelerExpressionFormatString()
const
8203 return tr(
"path to a point cloud layer" );
8206QString QgsProcessingPointCloudLayerWidgetWrapper::parameterType()
const
8213 return new QgsProcessingPointCloudLayerWidgetWrapper( parameter, type );
8218 Q_UNUSED( context );
8219 Q_UNUSED( widgetContext );
8220 Q_UNUSED( definition );
8237QStringList QgsProcessingAnnotationLayerWidgetWrapper::compatibleParameterTypes()
const
8239 return QStringList()
8246QStringList QgsProcessingAnnotationLayerWidgetWrapper::compatibleOutputTypes()
const
8248 return QStringList()
8254QString QgsProcessingAnnotationLayerWidgetWrapper::modelerExpressionFormatString()
const
8256 return tr(
"name of an annotation layer, or \"main\" for the main annotation layer" );
8259QString QgsProcessingAnnotationLayerWidgetWrapper::parameterType()
const
8266 return new QgsProcessingAnnotationLayerWidgetWrapper( parameter, type );
8271 Q_UNUSED( context );
8272 Q_UNUSED( widgetContext );
8273 Q_UNUSED( definition );
8284 if ( mWidgetContext.project() )
8285 mComboBox->setAdditionalLayers( { mWidgetContext.project()->mainAnnotationLayer() } );
8289QWidget *QgsProcessingAnnotationLayerWidgetWrapper::createWidget()
8300 mComboBox->setEditable(
true );
8304 mComboBox->setToolTip( parameterDefinition()->toolTip() );
8306 if ( mWidgetContext.project() )
8307 mComboBox->setAdditionalLayers( { mWidgetContext.project()->mainAnnotationLayer() } );
8310 mComboBox->setAllowEmptyLayer(
true );
8314 if ( mBlockSignals )
8317 emit widgetValueHasChanged(
this );
8320 setWidgetContext( widgetContext() );
8324void QgsProcessingAnnotationLayerWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext &context )
8330 mComboBox->setLayer(
nullptr );
8334 QVariant val = value;
8335 if ( val.userType() == qMetaTypeId<QgsProperty>() )
8347 QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( val.value< QObject * >() );
8348 if ( !layer && val.userType() == QMetaType::Type::QString )
8355 mComboBox->setLayer( layer );
8360QVariant QgsProcessingAnnotationLayerWidgetWrapper::widgetValue()
const
8362 return mComboBox && mComboBox->currentLayer() ?
8363 ( mWidgetContext.project() ? ( mComboBox->currentLayer() == mWidgetContext.project()->mainAnnotationLayer() ? QStringLiteral(
"main" ) : mComboBox->currentLayer()->id() ) : mComboBox->currentLayer()->id() )
8376 QHBoxLayout *hl =
new QHBoxLayout();
8377 hl->setContentsMargins( 0, 0, 0, 0 );
8379 mLineEdit =
new QLineEdit();
8380 mLineEdit->setEnabled(
false );
8381 hl->addWidget( mLineEdit, 1 );
8383 mToolButton =
new QToolButton();
8384 mToolButton->setText( QString( QChar( 0x2026 ) ) );
8385 hl->addWidget( mToolButton );
8391 mLineEdit->setText( tr(
"%n attribute(s) selected",
nullptr, 0 ) );
8394 connect( mToolButton, &QToolButton::clicked,
this, &QgsProcessingPointCloudAttributePanelWidget::showDialog );
8399 mAttributes = attributes;
8402void QgsProcessingPointCloudAttributePanelWidget::setValue(
const QVariant &value )
8404 if ( value.isValid() )
8405 mValue = value.userType() == QMetaType::Type::QVariantList ? value.toList() : QVariantList() << value;
8409 updateSummaryText();
8413void QgsProcessingPointCloudAttributePanelWidget::showDialog()
8415 QVariantList availableOptions;
8416 availableOptions.reserve( mAttributes.count() );
8417 const QVector<QgsPointCloudAttribute> attributes = mAttributes.attributes();
8420 availableOptions << attr.name();
8426 QgsProcessingMultipleSelectionPanelWidget *widget =
new QgsProcessingMultipleSelectionPanelWidget( availableOptions, mValue );
8427 widget->setPanelTitle( mParam->description() );
8429 widget->setValueFormatter( [](
const QVariant & v ) -> QString
8431 return v.toString();
8434 connect( widget, &QgsProcessingMultipleSelectionPanelWidget::selectionChanged,
this, [ = ]()
8436 setValue( widget->selectedOptions() );
8443 QgsProcessingMultipleSelectionDialog dlg( availableOptions, mValue,
this, Qt::WindowFlags() );
8445 dlg.setValueFormatter( [](
const QVariant & v ) -> QString
8447 return v.toString();
8451 setValue( dlg.selectedOptions() );
8456void QgsProcessingPointCloudAttributePanelWidget::updateSummaryText()
8461 if ( mValue.empty() )
8463 mLineEdit->setText( tr(
"%n attribute(s) selected",
nullptr, 0 ) );
8468 values.reserve( mValue.size() );
8469 for (
const QVariant &val : std::as_const( mValue ) )
8471 values << val.toString();
8474 const QString concatenated = values.join( tr(
"," ) );
8475 if ( concatenated.length() < 100 )
8476 mLineEdit->setText( concatenated );
8478 mLineEdit->setText( tr(
"%n attribute(s) selected",
nullptr, mValue.count() ) );
8490 QVBoxLayout *vlayout =
new QVBoxLayout();
8491 vlayout->setContentsMargins( 0, 0, 0, 0 );
8493 vlayout->addWidget(
new QLabel( tr(
"Parent layer" ) ) );
8494 mParentLayerComboBox =
new QComboBox();
8496 QString initialParent;
8498 initialParent = attrParam->parentLayerParameterName();
8500 if (
auto *lModel = widgetContext.
model() )
8503 const QMap<QString, QgsProcessingModelParameter> components = lModel->parameterComponents();
8504 for (
auto it = components.constBegin(); it != components.constEnd(); ++it )
8508 mParentLayerComboBox-> addItem( definition->
description(), definition->
name() );
8509 if ( !initialParent.isEmpty() && initialParent == definition->
name() )
8511 mParentLayerComboBox->setCurrentIndex( mParentLayerComboBox->count() - 1 );
8517 if ( mParentLayerComboBox->count() == 0 && !initialParent.isEmpty() )
8520 mParentLayerComboBox->addItem( initialParent, initialParent );
8521 mParentLayerComboBox->setCurrentIndex( mParentLayerComboBox->count() - 1 );
8524 vlayout->addWidget( mParentLayerComboBox );
8526 mAllowMultipleCheckBox =
new QCheckBox( tr(
"Accept multiple attributes" ) );
8528 mAllowMultipleCheckBox->setChecked( attrParam->allowMultiple() );
8530 vlayout->addWidget( mAllowMultipleCheckBox );
8532 mDefaultToAllCheckBox =
new QCheckBox( tr(
"Select all attributes by default" ) );
8533 mDefaultToAllCheckBox->setEnabled( mAllowMultipleCheckBox->isChecked() );
8535 mDefaultToAllCheckBox->setChecked( attrParam->defaultToAllAttributes() );
8537 vlayout->addWidget( mDefaultToAllCheckBox );
8539 connect( mAllowMultipleCheckBox, &QCheckBox::stateChanged,
this, [ = ]
8541 mDefaultToAllCheckBox->setEnabled( mAllowMultipleCheckBox->isChecked() );
8544 vlayout->addWidget(
new QLabel( tr(
"Default value" ) ) );
8546 mDefaultLineEdit =
new QLineEdit();
8547 mDefaultLineEdit->setToolTip( tr(
"Default attribute name, or ; separated list of attribute names for multiple attribute parameters" ) );
8551 mDefaultLineEdit->setText( attributes.join(
';' ) );
8553 vlayout->addWidget( mDefaultLineEdit );
8555 setLayout( vlayout );
8560 QVariant defaultValue;
8561 if ( !mDefaultLineEdit->text().trimmed().isEmpty() )
8563 defaultValue = mDefaultLineEdit->text();
8565 auto param = std::make_unique< QgsProcessingParameterPointCloudAttribute >( name, description, defaultValue, mParentLayerComboBox->currentData().toString(), mAllowMultipleCheckBox->isChecked(),
false, mDefaultToAllCheckBox->isChecked() );
8567 return param.release();
8575QWidget *QgsProcessingPointCloudAttributeWidgetWrapper::createWidget()
8585 mPanel =
new QgsProcessingPointCloudAttributePanelWidget(
nullptr, attrParam );
8586 mPanel->setToolTip( parameterDefinition()->toolTip() );
8587 connect( mPanel, &QgsProcessingPointCloudAttributePanelWidget::changed,
this, [ = ]
8589 emit widgetValueHasChanged(
this );
8597 mComboBox->setToolTip( parameterDefinition()->toolTip() );
8600 emit widgetValueHasChanged(
this );
8608 mLineEdit =
new QLineEdit();
8609 mLineEdit->setToolTip( QObject::tr(
"Name of attribute (separate attribute names with ; for multiple attribute parameters)" ) );
8610 connect( mLineEdit, &QLineEdit::textChanged,
this, [ = ]
8612 emit widgetValueHasChanged(
this );
8621void QgsProcessingPointCloudAttributeWidgetWrapper::postInitialize(
const QList<QgsAbstractProcessingParameterWidgetWrapper *> &wrappers )
8633 setParentLayerWrapperValue( wrapper );
8636 setParentLayerWrapperValue( wrapper );
8653 std::unique_ptr< QgsProcessingContext > tmpContext;
8654 if ( mProcessingContextGenerator )
8655 context = mProcessingContextGenerator->processingContext();
8659 tmpContext = std::make_unique< QgsProcessingContext >();
8660 context = tmpContext.get();
8666 if ( layer && layer->
isValid() )
8670 std::unique_ptr< QgsMapLayer > ownedLayer( context->
takeResultLayer( layer->
id() ) );
8673 mParentLayer.reset( qobject_cast< QgsPointCloudLayer * >( ownedLayer.release() ) );
8674 layer = mParentLayer.get();
8682 mComboBox->setLayer( layer );
8685 mPanel->setAttributes( layer->
attributes() );
8692 mComboBox->setLayer(
nullptr );
8697 if ( value.isValid() && widgetContext().messageBar() )
8700 widgetContext().
messageBar()->
pushMessage( QString(), QObject::tr(
"Could not load selected layer/table. Dependent attributes could not be populated" ),
8709 val.reserve( mPanel->attributes().attributes().size() );
8712 setWidgetValue( val, *context );
8715 setWidgetValue( parameterDefinition()->defaultValueForGui(), *context );
8718void QgsProcessingPointCloudAttributeWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext &context )
8722 if ( !value.isValid() )
8723 mComboBox->setAttribute( QString() );
8727 mComboBox->setAttribute( v );
8733 if ( value.isValid() )
8736 opts.reserve( v.size() );
8737 for (
const QString &i : v )
8741 mPanel->setValue( opts );
8743 else if ( mLineEdit )
8749 mLineEdit->setText( v.join(
';' ) );
8758QVariant QgsProcessingPointCloudAttributeWidgetWrapper::widgetValue()
const
8761 return mComboBox->currentAttribute();
8763 return mPanel->value();
8764 else if ( mLineEdit )
8769 return mLineEdit->text().split(
';' );
8772 return mLineEdit->text();
8778QStringList QgsProcessingPointCloudAttributeWidgetWrapper::compatibleParameterTypes()
const
8780 return QStringList()
8785QStringList QgsProcessingPointCloudAttributeWidgetWrapper::compatibleOutputTypes()
const
8787 return QStringList()
8792QString QgsProcessingPointCloudAttributeWidgetWrapper::modelerExpressionFormatString()
const
8794 return tr(
"selected attribute names as an array of names, or semicolon separated string of options (e.g. 'X;Intensity')" );
8797QString QgsProcessingPointCloudAttributeWidgetWrapper::parameterType()
const
8804 return new QgsProcessingPointCloudAttributeWidgetWrapper( parameter, type );
8809 return new QgsProcessingPointCloudAttributeParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
8823QWidget *QgsProcessingOutputWidgetWrapper::createWidget()
8831 mOutputWidget =
new QgsProcessingLayerOutputDestinationWidget( destParam,
false );
8832 if ( mProcessingContextGenerator )
8833 mOutputWidget->setContext( mProcessingContextGenerator->processingContext() );
8834 if ( mParametersGenerator )
8835 mOutputWidget->registerProcessingParametersGenerator( mParametersGenerator );
8836 mOutputWidget->setToolTip( parameterDefinition()->toolTip() );
8838 connect( mOutputWidget, &QgsProcessingLayerOutputDestinationWidget::destinationChanged,
this, [ = ]()
8840 if ( mBlockSignals )
8843 emit widgetValueHasChanged(
this );
8852 mOutputWidget->addOpenAfterRunningOption();
8854 return mOutputWidget;
8864void QgsProcessingOutputWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext & )
8866 if ( mOutputWidget )
8867 mOutputWidget->setValue( value );
8870QVariant QgsProcessingOutputWidgetWrapper::widgetValue()
const
8872 if ( mOutputWidget )
8873 return mOutputWidget->value();
8878QVariantMap QgsProcessingOutputWidgetWrapper::customProperties()
const
8881 if ( mOutputWidget )
8882 res.insert( QStringLiteral(
"OPEN_AFTER_RUNNING" ), mOutputWidget->openAfterRunning() );
8886QStringList QgsProcessingOutputWidgetWrapper::compatibleParameterTypes()
const
8888 return QStringList()
8897QStringList QgsProcessingOutputWidgetWrapper::compatibleOutputTypes()
const
8899 return QStringList()
8911 : QgsProcessingOutputWidgetWrapper( parameter, type, parent )
8916QString QgsProcessingFeatureSinkWidgetWrapper::parameterType()
const
8923 return new QgsProcessingFeatureSinkWidgetWrapper( parameter, type );
8926QString QgsProcessingFeatureSinkWidgetWrapper::modelerExpressionFormatString()
const
8928 return tr(
"path to layer destination" );
8936 : QgsProcessingOutputWidgetWrapper( parameter, type, parent )
8941QString QgsProcessingVectorDestinationWidgetWrapper::parameterType()
const
8948 return new QgsProcessingVectorDestinationWidgetWrapper( parameter, type );
8951QString QgsProcessingVectorDestinationWidgetWrapper::modelerExpressionFormatString()
const
8953 return tr(
"path to layer destination" );
8961 : QgsProcessingOutputWidgetWrapper( parameter, type, parent )
8966QString QgsProcessingRasterDestinationWidgetWrapper::parameterType()
const
8973 return new QgsProcessingRasterDestinationWidgetWrapper( parameter, type );
8976QString QgsProcessingRasterDestinationWidgetWrapper::modelerExpressionFormatString()
const
8978 return tr(
"path to layer destination" );
8986 : QgsProcessingOutputWidgetWrapper( parameter, type, parent )
8991QString QgsProcessingPointCloudDestinationWidgetWrapper::parameterType()
const
8998 return new QgsProcessingPointCloudDestinationWidgetWrapper( parameter, type );
9001QString QgsProcessingPointCloudDestinationWidgetWrapper::modelerExpressionFormatString()
const
9003 return tr(
"path to layer destination" );
9011 : QgsProcessingOutputWidgetWrapper( parameter, type, parent )
9016QString QgsProcessingFileDestinationWidgetWrapper::parameterType()
const
9023 return new QgsProcessingFileDestinationWidgetWrapper( parameter, type );
9026QStringList QgsProcessingFileDestinationWidgetWrapper::compatibleParameterTypes()
const
9028 return QStringList()
9033QStringList QgsProcessingFileDestinationWidgetWrapper::compatibleOutputTypes()
const
9043QString QgsProcessingFileDestinationWidgetWrapper::modelerExpressionFormatString()
const
9045 return tr(
"path to file destination" );
9053 : QgsProcessingOutputWidgetWrapper( parameter, type, parent )
9058QString QgsProcessingFolderDestinationWidgetWrapper::parameterType()
const
9065 return new QgsProcessingFolderDestinationWidgetWrapper( parameter, type );
9068QStringList QgsProcessingFolderDestinationWidgetWrapper::compatibleParameterTypes()
const
9070 return QStringList()
9075QStringList QgsProcessingFolderDestinationWidgetWrapper::compatibleOutputTypes()
const
9083QString QgsProcessingFolderDestinationWidgetWrapper::modelerExpressionFormatString()
const
9085 return tr(
"path to folder destination" );
9093 : QgsProcessingOutputWidgetWrapper( parameter, type, parent )
9097QString QgsProcessingVectorTileDestinationWidgetWrapper::parameterType()
const
9104 return new QgsProcessingPointCloudDestinationWidgetWrapper( parameter, type );
9107QString QgsProcessingVectorTileDestinationWidgetWrapper::modelerExpressionFormatString()
const
9109 return tr(
"path to layer destination" );
@ Standard
Unit is a standard measurement unit.
ProcessingSourceType
Processing data source types.
@ File
Files (i.e. non map layer sources, such as text files)
@ Annotation
Annotation layers.
@ Vector
Tables (i.e. vector layers with or without geometry). When used for a sink this indicates the sink ha...
@ VectorTile
Vector tile layers.
@ MapLayer
Any map layer type (raster, vector, mesh, point cloud, annotation or plugin layer)
@ VectorAnyGeometry
Any vector layer with geometry.
@ VectorPoint
Vector point layers.
@ VectorPolygon
Vector polygon layers.
@ VectorLine
Vector line layers.
@ PointCloud
Point cloud layers.
ProcessingFileParameterBehavior
Flags which dictate the behavior of QgsProcessingParameterFile.
@ File
Parameter is a single file.
@ Folder
Parameter is a folder.
ExpressionType
Expression types.
@ RasterCalculator
Raster calculator expression.
@ Qgis
Native QGIS expression.
@ PointCloud
Point cloud expression.
DistanceUnit
Units of distance.
@ Centimeters
Centimeters.
@ Millimeters
Millimeters.
@ Miles
Terrestrial miles.
@ Unknown
Unknown distance unit.
@ Degrees
Degrees, for planar geographic CRS distance measurements.
@ NauticalMiles
Nautical miles.
ProcessingFieldParameterDataType
Processing field parameter data types.
@ String
Accepts string fields.
@ Boolean
Accepts boolean fields, since QGIS 3.34.
@ Binary
Accepts binary fields, since QGIS 3.34.
@ Numeric
Accepts numeric fields.
@ DateTime
Accepts datetime fields.
@ SquareCentimeters
Square centimeters.
@ SquareInches
Square inches.
@ SquareNauticalMiles
Square nautical miles.
@ SquareMillimeters
Square millimeters.
@ SquareYards
Square yards.
@ SquareKilometers
Square kilometers.
@ SquareMeters
Square meters.
@ Unknown
Unknown areal unit.
@ SquareDegrees
Square degrees, for planar geographic CRS area measurements.
@ SquareMiles
Square miles.
@ Info
Information message.
@ AnnotationLayer
QgsAnnotationLayer.
TemporalUnit
Temporal units.
@ Milliseconds
Milliseconds.
@ PointCloud
Point cloud layer. Added in QGIS 3.18.
QFlags< ProcessingParameterFlag > ProcessingParameterFlags
Flags which dictate the behavior of Processing parameters.
VolumeUnit
Units of volume.
@ CubicMeters
Cubic meters.
@ CubicDegrees
Cubic degrees, for planar geographic CRS volume measurements.
@ CubicDecimeter
Cubic decimeters.
@ Unknown
Unknown volume unit.
@ CubicCentimeter
Cubic Centimeters.
ProcessingModelChildParameterSource
Processing model child parameter sources.
@ ModelParameter
Parameter value is taken from a parent model parameter.
@ StaticValue
Parameter value is a static value.
@ Optional
Parameter is optional.
ProcessingDateTimeParameterDataType
Processing date time parameter data types.
@ DateTime
Datetime values.
ProcessingNumberParameterType
Processing numeric parameter data types.
@ Double
Double/float values.
static QCursor getThemeCursor(Cursor cursor)
Helper to get a theme cursor.
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
@ CapturePoint
Select and capture a point or a feature.
Selector widget for authentication configs.
void selectedConfigIdChanged(const QString &authcfg)
Emitted when authentication config is changed or missing.
QComboBox subclass which allows selecting multiple items.
This class represents a coordinate reference system (CRS).
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
Qgis::DistanceUnit mapUnits
The QgsDatabaseSchemaComboBox class is a combo box which displays the list of schemas for a specific ...
The QgsDatabaseTableComboBox class is a combo box which displays the list of tables for a specific da...
The QgsDateEdit class is a QDateEdit widget with the capability of setting/reading null dates.
void dateValueChanged(const QDate &date)
Signal emitted whenever the date changes.
The QgsDateTimeEdit class is a QDateTimeEdit with the capability of setting/reading null date/times.
void setAllowNull(bool allowNull)
Determines if the widget allows setting null date/time.
void setNullRepresentation(const QString &null)
Sets the widget's null representation, which defaults to QgsApplication::nullRepresentation().
void valueChanged(const QDateTime &date)
Signal emitted whenever the value changes.
The QgsSpinBox is a spin box with a clear button that will set the value to the defined clear value.
static double toDouble(const QString &input, bool *ok)
Converts input string to double value.
The QgsExpressionLineEdit widget includes a line edit for entering expressions together with a button...
void expressionChanged(const QString &expression)
Emitted when the expression is changed.
The QgsFieldComboBox is a combo box which displays the list of fields of a given layer.
void fieldChanged(const QString &fieldName)
Emitted when the currently selected field changes.
@ DateTime
Datetime fields.
@ Date
Date or datetime fields.
@ Binary
Binary fields, since QGIS 3.34.
@ Boolean
Boolean fields, since QGIS 3.34.
@ Numeric
All numeric fields.
Encapsulate a field in an attribute table or data source.
Container of fields for a vector layer.
bool append(const QgsField &field, Qgis::FieldOrigin origin=Qgis::FieldOrigin::Provider, int originIndex=-1)
Appends a field.
QList< QgsField > toList() const
Utility function to return a list of QgsField instances.
void remove(int fieldIdx)
Removes the field with the given index.
QgsField at(int i) const
Returns the field at particular index (must be in range 0..N-1).
Q_INVOKABLE int lookupField(const QString &fieldName) const
Looks up field's index from the field name.
QLineEdit subclass with built in support for clearing the widget's value and handling custom null val...
A geometry is the spatial representation of a feature.
static QgsGeometry fromPointXY(const QgsPointXY &point)
Creates a new geometry from a QgsPointXY object.
Q_INVOKABLE QString asWkt(int precision=17) const
Exports the geometry to WKT.
A QgsFilterLineEdit subclass with the ability to "highlight" the edges of the widget.
The QgsLayoutComboBox class is a combo box which displays available layouts from a QgsLayoutManager.
void layoutChanged(QgsMasterLayoutInterface *layout)
Emitted whenever the currently selected layout changes.
void setAllowEmptyLayout(bool allowEmpty)
Sets whether an optional empty layout ("not set") option is present in the combobox.
The QgsLayoutItemComboBox class is a combo box which displays items of a matching type from a layout.
void itemChanged(QgsLayoutItem *item)
Emitted whenever the currently selected item changes.
Base class for graphical items within a QgsLayout.
virtual QString uuid() const
Returns the item identification string.
@ FilterPrintLayouts
Includes print layouts.
QList< QgsPrintLayout * > printLayouts() const
Returns a list of all print layouts contained in the manager.
Map canvas is a class for displaying all GIS data types on a canvas.
const QgsMapSettings & mapSettings() const
Gets access to properties used for map rendering.
The QgsMapLayerComboBox class is a combo box which displays the list of layers.
void layerChanged(QgsMapLayer *layer)
Emitted whenever the currently selected layer changes.
Base class for all map layer types.
A QgsMapMouseEvent is the result of a user interaction with the mouse on a QgsMapCanvas.
QgsPointLocator::Match mapPointMatch() const
Returns the matching data from the most recently snapped point.
QgsPointXY snapPoint()
snapPoint will snap the points using the map canvas snapping utils configuration
QgsCoordinateReferenceSystem destinationCrs() const
Returns the destination coordinate reference system for the map render.
Interface for master layout type objects, such as print layouts and reports.
virtual QString name() const =0
Returns the layout's name.
void pushMessage(const QString &text, Qgis::MessageLevel level=Qgis::MessageLevel::Info, int duration=-1)
A convenience method for pushing a message with the specified text to the bar.
bool clearWidgets()
Removes all items from the bar.
Collection of point cloud attributes.
The QgsPointCloudAttributeComboBox is a combo box which displays the list of attributes of a given po...
void attributeChanged(const QString &name)
Emitted when the currently selected attribute changes.
Attribute for point cloud data pair of name and size in bytes.
Represents a map layer supporting display of point clouds.
QgsPointCloudAttributeCollection attributes() const
Returns the attributes available from the layer.
A class to represent a 2D point.
Print layout, a QgsLayout subclass for static or atlas-based layouts.
Abstract base class for processing algorithms.
An interface for objects which can create Processing contexts.
Contains information about the context in which a processing algorithm is executed.
QgsExpressionContext & expressionContext()
Returns the expression context.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context.
QgsMapLayer * takeResultLayer(const QString &id)
Takes the result map layer with matching id from the context and transfers ownership of it back to th...
Base class for all parameter definitions which represent file or layer destinations,...
Encapsulates settings relating to a feature source input to a processing algorithm.
QgsProperty source
Source definition.
WidgetType
Types of dialogs which Processing widgets can be created for.
@ Standard
Standard algorithm dialog.
@ Batch
Batch processing dialog.
static QString typeName()
Returns the type name for the output class.
static QString typeName()
Returns the type name for the output class.
static QString typeName()
Returns the type name for the output class.
static QString typeName()
Returns the type name for the output class.
static QString typeName()
Returns the type name for the output class.
static QString typeName()
Returns the type name for the output class.
static QString typeName()
Returns the type name for the output class.
static QString typeName()
Returns the type name for the output class.
static QString typeName()
Returns the type name for the output class.
static QString typeName()
Returns the type name for the output class.
static QString typeName()
Returns the type name for the parameter class.
A double numeric parameter for area values.
Qgis::AreaUnit defaultUnit() const
Returns the default area unit for the parameter.
static QString typeName()
Returns the type name for the parameter class.
static QString typeName()
Returns the type name for the parameter class.
A raster band parameter for Processing algorithms.
static QString typeName()
Returns the type name for the parameter class.
bool allowMultiple() const
Returns whether multiple band selections are permitted.
A boolean parameter for processing algorithms.
static QString typeName()
Returns the type name for the parameter class.
A color parameter for processing algorithms.
bool opacityEnabled() const
Returns true if the parameter allows opacity control.
static QString typeName()
Returns the type name for the parameter class.
A coordinate operation parameter for processing algorithms, for selection between available coordinat...
static QString typeName()
Returns the type name for the parameter class.
QVariant sourceCrs() const
Returns the static source CRS, or an invalid value if this is not set.
QVariant destinationCrs() const
Returns the static destination CRS, or an invalid value if this is not set.
A coordinate reference system parameter for processing algorithms.
static QString typeName()
Returns the type name for the parameter class.
A database schema parameter for processing algorithms, allowing users to select from existing schemas...
static QString typeName()
Returns the type name for the parameter class.
QString parentConnectionParameterName() const
Returns the name of the parent connection parameter, or an empty string if this is not set.
A database table name parameter for processing algorithms, allowing users to select from existing dat...
static QString typeName()
Returns the type name for the parameter class.
QString parentConnectionParameterName() const
Returns the name of the parent connection parameter, or an empty string if this is not set.
QString parentSchemaParameterName() const
Returns the name of the parent schema parameter, or an empty string if this is not set.
bool allowNewTableNames() const
Returns true if the parameter allows users to enter names for a new (non-existing) tables.
A datetime (or pure date or time) parameter for processing algorithms.
static QString typeName()
Returns the type name for the parameter class.
Qgis::ProcessingDateTimeParameterDataType dataType() const
Returns the acceptable data type for the parameter.
Base class for the definition of processing parameters.
void setFlags(Qgis::ProcessingParameterFlags flags)
Sets the flags associated with the parameter.
QVariantMap metadata() const
Returns the parameter's freeform metadata.
QString description() const
Returns the description for the parameter.
QVariant defaultValueForGui() const
Returns the default value to use for the parameter in a GUI.
virtual QString type() const =0
Unique parameter type name.
QString name() const
Returns the name of the parameter.
Qgis::ProcessingParameterFlags flags() const
Returns any flags associated with the parameter.
A double numeric parameter for distance values.
static QString typeName()
Returns the type name for the parameter class.
Qgis::DistanceUnit defaultUnit() const
Returns the default distance unit for the parameter.
A double numeric parameter for duration values.
Qgis::TemporalUnit defaultUnit() const
Returns the default duration unit for the parameter.
static QString typeName()
Returns the type name for the parameter class.
An enum based parameter for processing algorithms, allowing for selection from predefined values.
bool allowMultiple() const
Returns true if the parameter allows multiple selected values.
QStringList options() const
Returns the list of acceptable options for the parameter.
bool usesStaticStrings() const
Returns true if the parameter uses static (non-translated) string values for its enumeration choice l...
static QString typeName()
Returns the type name for the parameter class.
An expression parameter for processing algorithms.
QString parentLayerParameterName() const
Returns the name of the parent layer parameter, or an empty string if this is not set.
static QString typeName()
Returns the type name for the parameter class.
Qgis::ExpressionType expressionType() const
Returns the parameter's expression type.
A rectangular map extent parameter for processing algorithms.
static QString typeName()
Returns the type name for the parameter class.
static QString typeName()
Returns the type name for the parameter class.
An input feature source (such as vector layers) parameter for processing algorithms.
static QString typeName()
Returns the type name for the parameter class.
A vector layer or feature source field parameter for processing algorithms.
Qgis::ProcessingFieldParameterDataType dataType() const
Returns the acceptable data type for the field.
bool allowMultiple() const
Returns whether multiple field selections are permitted.
bool defaultToAllFields() const
Returns whether a parameter which allows multiple selections (see allowMultiple()) should automatical...
static QString typeName()
Returns the type name for the parameter class.
void setDataType(Qgis::ProcessingFieldParameterDataType type)
Sets the acceptable data type for the field.
static QString typeName()
Returns the type name for the parameter class.
An input file or folder parameter for processing algorithms.
QString extension() const
Returns any specified file extension for the parameter.
static QString typeName()
Returns the type name for the parameter class.
QString fileFilter() const
Returns the file filter string for file destinations compatible with this parameter.
Qgis::ProcessingFileParameterBehavior behavior() const
Returns the parameter behavior (e.g.
static QString typeName()
Returns the type name for the parameter class.
A geometry parameter for processing algorithms.
static QString typeName()
Returns the type name for the parameter class.
A print layout item parameter, allowing users to select a particular item from a print layout.
static QString typeName()
Returns the type name for the parameter class.
int itemType() const
Returns the acceptable item type, or -1 if any item type is allowed.
A print layout parameter, allowing users to select a print layout.
static QString typeName()
Returns the type name for the parameter class.
A map layer parameter for processing algorithms.
static QString typeName()
Returns the type name for the parameter class.
A map theme parameter for processing algorithms, allowing users to select an existing map theme from ...
static QString typeName()
Returns the type name for the parameter class.
A table (matrix) parameter for processing algorithms.
static QString typeName()
Returns the type name for the parameter class.
static QString typeName()
Returns the type name for the parameter class.
A parameter for processing algorithms which accepts multiple map layers.
static QString typeName()
Returns the type name for the parameter class.
A numeric parameter for processing algorithms.
double minimum() const
Returns the minimum value acceptable by the parameter.
double maximum() const
Returns the maximum value acceptable by the parameter.
Qgis::ProcessingNumberParameterType dataType() const
Returns the acceptable data type for the parameter.
static QString typeName()
Returns the type name for the parameter class.
A point cloud layer attribute parameter for Processing algorithms.
static QString typeName()
Returns the type name for the parameter class.
bool allowMultiple() const
Returns whether multiple field selections are permitted.
bool defaultToAllAttributes() const
Returns whether a parameter which allows multiple selections (see allowMultiple()) should automatical...
static QString typeName()
Returns the type name for the parameter class.
A point cloud layer parameter for processing algorithms.
static QString typeName()
Returns the type name for the parameter class.
A point parameter for processing algorithms.
static QString typeName()
Returns the type name for the parameter class.
A data provider connection parameter for processing algorithms, allowing users to select from availab...
static QString typeName()
Returns the type name for the parameter class.
QString providerId() const
Returns the ID of the provider associated with the connections.
A numeric range parameter for processing algorithms.
static QString typeName()
Returns the type name for the parameter class.
Qgis::ProcessingNumberParameterType dataType() const
Returns the acceptable data type for the range.
static QString typeName()
Returns the type name for the parameter class.
A raster layer parameter for processing algorithms.
static QString typeName()
Returns the type name for the parameter class.
A double numeric parameter for map scale values.
static QString typeName()
Returns the type name for the parameter class.
A string parameter for processing algorithms.
static QString typeName()
Returns the type name for the parameter class.
bool multiLine() const
Returns true if the parameter allows multiline strings.
static QString typeName()
Returns the type name for the parameter class.
A vector layer (with or without geometry) parameter for processing algorithms.
static QString typeName()
Returns the type name for the parameter class.
static QString typeName()
Returns the type name for the parameter class.
A double numeric parameter for volume values.
static QString typeName()
Returns the type name for the parameter class.
Qgis::VolumeUnit defaultUnit() const
Returns the default volume unit for the parameter.
Contains settings which reflect the context in which a Processing parameter widget is shown,...
QgsMapCanvas * mapCanvas() const
Returns the map canvas associated with the widget.
QgsProject * project() const
Returns the project associated with the widget.
QgsMessageBar * messageBar() const
Returns the message bar associated with the widget.
QgsProcessingModelAlgorithm * model() const
Returns the model which the parameter widget is associated with.
QgsMapLayer * activeLayer() const
Returns the current active layer.
static int parameterAsEnum(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, const QgsProcessingContext &context)
Evaluates the parameter with matching definition to a enum value.
static double parameterAsDouble(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, const QgsProcessingContext &context)
Evaluates the parameter with matching definition to a static double value.
static QgsPointXY parameterAsPoint(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, QgsProcessingContext &context, const QgsCoordinateReferenceSystem &crs=QgsCoordinateReferenceSystem())
Evaluates the parameter with matching definition to a point.
static QgsPrintLayout * parameterAsLayout(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, QgsProcessingContext &context)
Evaluates the parameter with matching definition to a print layout.
static QList< QgsMapLayer * > parameterAsLayerList(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessing::LayerOptionsFlags flags=QgsProcessing::LayerOptionsFlags())
Evaluates the parameter with matching definition to a list of map layers.
static QTime parameterAsTime(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, const QgsProcessingContext &context)
Evaluates the parameter with matching definition to a static time value.
static QgsRectangle parameterAsExtent(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, QgsProcessingContext &context, const QgsCoordinateReferenceSystem &crs=QgsCoordinateReferenceSystem())
Evaluates the parameter with matching definition to a rectangular extent.
static QString parameterAsEnumString(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, const QgsProcessingContext &context)
Evaluates the parameter with matching definition to a static enum string.
static QList< double > parameterAsRange(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, QgsProcessingContext &context)
Evaluates the parameter with matching definition to a range of values.
static QStringList parameterAsStrings(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, QgsProcessingContext &context)
Evaluates the parameter with matching definition to a list of strings (e.g.
static QList< int > parameterAsInts(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, const QgsProcessingContext &context)
Evaluates the parameter with matching definition to a list of integer values.
static QString parameterAsConnectionName(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, const QgsProcessingContext &context)
Evaluates the parameter with matching definition to a connection name string.
static QgsProcessingFeatureSource * parameterAsSource(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, QgsProcessingContext &context)
Evaluates the parameter with matching definition to a feature source.
static QgsPointCloudLayer * parameterAsPointCloudLayer(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, QgsProcessingContext &context, QgsProcessing::LayerOptionsFlags flags=QgsProcessing::LayerOptionsFlags())
Evaluates the parameter with matching definition to a point cloud layer.
static QgsCoordinateReferenceSystem parameterAsPointCrs(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, QgsProcessingContext &context)
Returns the coordinate reference system associated with an point parameter value.
static QgsLayoutItem * parameterAsLayoutItem(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, QgsProcessingContext &context, QgsPrintLayout *layout)
Evaluates the parameter with matching definition to a print layout item, taken from the specified lay...
static bool parameterAsBool(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, const QgsProcessingContext &context)
Evaluates the parameter with matching definition to a static boolean value.
static QColor parameterAsColor(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, QgsProcessingContext &context)
Returns the color associated with an point parameter value, or an invalid color if the parameter was ...
static QgsVectorLayer * parameterAsVectorLayer(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, QgsProcessingContext &context)
Evaluates the parameter with matching definition to a vector layer.
static int parameterAsInt(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, const QgsProcessingContext &context)
Evaluates the parameter with matching definition to a static integer value.
static QString parameterAsDatabaseTableName(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, const QgsProcessingContext &context)
Evaluates the parameter with matching definition to a database table name.
static QString parameterAsSchema(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, const QgsProcessingContext &context)
Evaluates the parameter with matching definition to a database schema name.
static QgsGeometry parameterAsGeometry(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, QgsProcessingContext &context, const QgsCoordinateReferenceSystem &crs=QgsCoordinateReferenceSystem())
Evaluates the parameter with matching definition to a geometry.
static QString parameterAsExpression(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, const QgsProcessingContext &context)
Evaluates the parameter with matching definition to an expression.
static QString parameterAsString(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, const QgsProcessingContext &context)
Evaluates the parameter with matching definition to a static string value.
static QgsRasterLayer * parameterAsRasterLayer(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, QgsProcessingContext &context)
Evaluates the parameter with matching definition to a raster layer.
static QList< int > parameterAsEnums(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, const QgsProcessingContext &context)
Evaluates the parameter with matching definition to list of enum values.
static QStringList parameterAsEnumStrings(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, const QgsProcessingContext &context)
Evaluates the parameter with matching definition to list of static enum strings.
static QgsCoordinateReferenceSystem parameterAsExtentCrs(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, QgsProcessingContext &context)
Returns the coordinate reference system associated with an extent parameter value.
static QDateTime parameterAsDateTime(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, const QgsProcessingContext &context)
Evaluates the parameter with matching definition to a static datetime value.
static QDate parameterAsDate(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, const QgsProcessingContext &context)
Evaluates the parameter with matching definition to a static date value.
static QVariantList parameterAsMatrix(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, QgsProcessingContext &context)
Evaluates the parameter with matching definition to a matrix/table of values.
static QgsCoordinateReferenceSystem parameterAsCrs(const QgsProcessingParameterDefinition *definition, const QVariantMap ¶meters, QgsProcessingContext &context)
Evaluates the parameter with matching definition to a coordinate reference system.
Utility functions for use with processing classes.
@ Annotation
Annotation layer type, since QGIS 3.22.
static QgsCoordinateReferenceSystem variantToCrs(const QVariant &value, QgsProcessingContext &context, const QVariant &fallbackValue=QVariant())
Converts a variant value to a coordinate reference system.
static QgsMapLayer * mapLayerFromString(const QString &string, QgsProcessingContext &context, bool allowLoadingNewLayers=true, QgsProcessingUtils::LayerHint typeHint=QgsProcessingUtils::LayerHint::UnknownType, QgsProcessing::LayerOptionsFlags flags=QgsProcessing::LayerOptionsFlags())
Interprets a string as a map layer within the supplied context.
@ SkipIndexGeneration
Do not generate index when creating a layer. Makes sense only for point cloud layers.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
static QgsProject * instance()
Returns the QgsProject singleton instance.
QgsMapThemeCollection * mapThemeCollection
const QgsLayoutManager * layoutManager() const
Returns the project's layout manager, which manages print layouts, atlases and reports within the pro...
void layerRemoved(const QString &layerId)
Emitted after a layer was removed from the registry.
A store for object properties.
Qgis::PropertyType propertyType() const
Returns the property type.
The QgsProviderConnectionComboBox class is a combo box which displays the list of connections registe...
A combobox widget which displays the bands present in a raster layer.
void bandChanged(int band)
Emitted when the currently selected band changes.
static QString displayBandName(QgsRasterDataProvider *provider, int band)
Returns a user-friendly band name for the specified band.
Base class for raster data providers.
virtual int bandCount() const =0
Gets number of bands.
Represents a raster layer.
QgsRasterDataProvider * dataProvider() override
Returns the source data provider.
A rectangle specified with double values.
A class for drawing transient features (e.g.
@ ICON_X
A cross is used to highlight points (x)
This class is a composition of two QSettings instances:
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
Class that shows snapping marker on map canvas for the current snapping match.
The QgsSpinBox is a spin box with a clear button that will set the value to the defined clear value.
The QgsTimeEdit class is a QTimeEdit widget with the capability of setting/reading null date/times.
void timeValueChanged(const QTime &time)
Signal emitted whenever the time changes.
static Q_INVOKABLE QString toString(Qgis::DistanceUnit unit)
Returns a translated string representing a distance unit.
static Q_INVOKABLE double fromUnitToUnitFactor(Qgis::DistanceUnit fromUnit, Qgis::DistanceUnit toUnit)
Returns the conversion factor between the specified distance units.
static Q_INVOKABLE Qgis::DistanceUnitType unitType(Qgis::DistanceUnit unit)
Returns the type for a distance unit.
static Q_INVOKABLE Qgis::AreaUnit distanceToAreaUnit(Qgis::DistanceUnit distanceUnit)
Converts a distance unit to its corresponding area unit, e.g., meters to square meters.
static Q_INVOKABLE Qgis::VolumeUnit distanceToVolumeUnit(Qgis::DistanceUnit distanceUnit)
Converts a distance unit to its corresponding volume unit, e.g., meters to cubic meters.
Represents a vector layer which manages a vector based data sets.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into allowing algorithms to be written in pure substantial changes are required in order to port existing x Processing algorithms for QGIS x The most significant changes are outlined not GeoAlgorithm For algorithms which operate on features one by consider subclassing the QgsProcessingFeatureBasedAlgorithm class This class allows much of the boilerplate code for looping over features from a vector layer to be bypassed and instead requires implementation of a processFeature method Ensure that your algorithm(or algorithm 's parent class) implements the new pure virtual createInstance(self) call
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
double qgsRound(double number, int places)
Returns a double number, rounded (as close as possible) to the specified number of places.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
const QgsCoordinateReferenceSystem & crs