20#include "moc_qgsprocessingmodelerparameterwidget.cpp"
33#include <QStackedWidget>
42 , mParameterDefinition( parameter )
45 setFocusPolicy( Qt::StrongFocus );
50 QHBoxLayout *hLayout =
new QHBoxLayout();
53 const QVariantList acceptedSourcesMetadata = mParameterDefinition->
metadata().value( QStringLiteral(
"model_widget" ) ).toMap().value( QStringLiteral(
"accepted_sources" ) ).toList();
54 for (
const QVariant &acceptedSource : acceptedSourcesMetadata )
60 mSourceButton =
new QToolButton();
61 mSourceButton->setFocusPolicy( Qt::StrongFocus );
64 mSourceButton->setFixedSize( 2 *
static_cast<int>( 1.25 * iconSize / 2.0 ), 2 *
static_cast<int>( iconSize * 1.1 / 2.0 ) );
65 mSourceButton->setIconSize( QSize( iconSize, iconSize ) );
66 mSourceButton->setPopupMode( QToolButton::InstantPopup );
68 mSourceMenu =
new QMenu(
this );
69 connect( mSourceMenu, &QMenu::aboutToShow,
this, &QgsProcessingModelerParameterWidget::sourceMenuAboutToShow );
70 connect( mSourceMenu, &QMenu::triggered,
this, &QgsProcessingModelerParameterWidget::sourceMenuActionTriggered );
71 mSourceButton->setMenu( mSourceMenu );
73 hLayout->addWidget( mSourceButton );
75 mStackedWidget =
new QStackedWidget();
78 if ( mStaticWidgetWrapper )
80 QWidget *widget = mStaticWidgetWrapper->createWrappedWidget( context );
83 mHasStaticWrapper =
true;
84 mStackedWidget->addWidget( widget );
87 mStackedWidget->addWidget(
new QWidget() );
91 mStackedWidget->addWidget(
new QWidget() );
96 mStackedWidget->addWidget( mExpressionWidget );
98 mModelInputCombo =
new QComboBox();
99 QHBoxLayout *hLayout2 =
new QHBoxLayout();
100 hLayout2->setContentsMargins( 0, 0, 0, 0 );
101 hLayout2->addWidget(
new QLabel( tr(
"Using model input" ) ) );
102 hLayout2->addWidget( mModelInputCombo, 1 );
103 QWidget *hWidget2 =
new QWidget();
104 hWidget2->setLayout( hLayout2 );
105 mStackedWidget->addWidget( hWidget2 );
107 mChildOutputCombo =
new QComboBox();
108 QHBoxLayout *hLayout3 =
new QHBoxLayout();
109 hLayout3->setContentsMargins( 0, 0, 0, 0 );
110 hLayout3->addWidget(
new QLabel( tr(
"Using algorithm output" ) ) );
111 hLayout3->addWidget( mChildOutputCombo, 1 );
112 QWidget *hWidget3 =
new QWidget();
113 hWidget3->setLayout( hLayout3 );
114 mStackedWidget->addWidget( hWidget3 );
119 mModelOutputName->setPlaceholderText( tr(
"[Enter name if this is a final result]" ) );
120 QHBoxLayout *hLayout4 =
new QHBoxLayout();
121 hLayout4->setContentsMargins( 0, 0, 0, 0 );
122 hLayout4->addWidget( mModelOutputName );
123 QWidget *hWidget4 =
new QWidget();
124 hWidget4->setLayout( hLayout4 );
125 mStackedWidget->addWidget( hWidget4 );
128 hLayout->setContentsMargins( 0, 0, 0, 0 );
129 hLayout->addWidget( mStackedWidget, 1 );
131 setLayout( hLayout );
139 if ( mStaticWidgetWrapper )
140 mStaticWidgetWrapper->setWidgetContext( context );
145 if ( mStaticWidgetWrapper )
146 mStaticWidgetWrapper->registerProcessingContextGenerator( generator );
151 return mParameterDefinition;
156 if ( mStaticWidgetWrapper )
157 return mStaticWidgetWrapper->createWrappedLabel();
166 mStaticValue =
value.staticValue();
167 mModelInputParameterName =
value.parameterName();
168 mOutputChildId =
value.outputChildId();
169 mOutputName =
value.outputName();
170 mExpression =
value.expression();
178 if ( values.size() == 1 )
183 for (
const QgsProcessingModelChildParameterSource &v : values )
184 r << QVariant::fromValue( v );
193 if ( mModelOutputName )
194 mModelOutputName->setText(
value );
200 return currentSourceType() == ModelOutput;
205 return mModelOutputName ? mModelOutputName->text().trimmed() : QString();
210 switch ( currentSourceType() )
214 const QVariant v = mStaticWidgetWrapper->parameterValue();
216 if ( v.userType() == QMetaType::Type::QVariantList )
218 const QVariantList vList = v.toList();
219 if ( std::all_of( vList.begin(), vList.end(), [](
const QVariant &val ) {
220 return val.userType() == qMetaTypeId<QgsProcessingModelChildParameterSource>();
226 return QVariant::fromValue( QgsProcessingModelChildParameterSource::fromStaticValue( v ) );
230 return QVariant::fromValue( QgsProcessingModelChildParameterSource::fromExpression( mExpressionWidget->
expression() ) );
233 return QVariant::fromValue( QgsProcessingModelChildParameterSource::fromModelParameter( mModelInputCombo->currentData().toString() ) );
237 const QStringList parts = mChildOutputCombo->currentData().toStringList();
238 return QVariant::fromValue( QgsProcessingModelChildParameterSource::fromChildOutput( parts.value( 0, QString() ), parts.value( 1, QString() ) ) );
242 return mModelOutputName ? ( mModelOutputName->text().trimmed().isEmpty() ? QVariant() : mModelOutputName->text() ) : QVariant();
245 return QVariant::fromValue( QgsProcessingModelChildParameterSource() );
250 if ( mStaticWidgetWrapper )
251 mStaticWidgetWrapper->setDialog( dialog );
260 if ( mModel->childAlgorithms().contains( mChildId ) )
261 alg = mModel->childAlgorithm( mChildId ).algorithm();
266 QgsExpressionContextScope *childScope = mModel->createExpressionContextScopeForChildAlgorithm( mChildId, mContext, QVariantMap(), QVariantMap() );
269 QStringList highlightedVariables = childScope->
variableNames();
270 QStringList highlightedFunctions = childScope->
functionNames();
272 highlightedVariables += mModel->variables().keys();
274 c.setHighlightedVariables( highlightedVariables );
275 c.setHighlightedFunctions( highlightedFunctions );
281void QgsProcessingModelerParameterWidget::sourceMenuAboutToShow()
283 mSourceMenu->clear();
285 const SourceType currentSource = currentSourceType();
290 QAction *modelOutputAction = mSourceMenu->addAction( tr(
"Model Output" ) );
291 modelOutputAction->setCheckable( currentSource == ModelOutput );
292 modelOutputAction->setChecked( currentSource == ModelOutput );
296 if ( mHasStaticWrapper
299 QAction *fixedValueAction = mSourceMenu->addAction( tr(
"Value" ) );
300 fixedValueAction->setCheckable( currentSource == StaticValue );
301 fixedValueAction->setChecked( currentSource == StaticValue );
307 QAction *calculatedValueAction = mSourceMenu->addAction( tr(
"Pre-calculated Value" ) );
308 calculatedValueAction->setCheckable( currentSource == Expression );
309 calculatedValueAction->setChecked( currentSource == Expression );
315 QAction *inputValueAction = mSourceMenu->addAction( tr(
"Model Input" ) );
316 inputValueAction->setCheckable( currentSource == ModelParameter );
317 inputValueAction->setChecked( currentSource == ModelParameter );
323 QAction *childOutputValueAction = mSourceMenu->addAction( tr(
"Algorithm Output" ) );
324 childOutputValueAction->setCheckable( currentSource == ChildOutput );
325 childOutputValueAction->setChecked( currentSource == ChildOutput );
332void QgsProcessingModelerParameterWidget::sourceMenuActionTriggered( QAction *action )
338QgsProcessingModelerParameterWidget::SourceType QgsProcessingModelerParameterWidget::currentSourceType()
const
340 return static_cast<SourceType
>( mStackedWidget->currentIndex() );
345 if ( !mLimitedSources.empty() && !mLimitedSources.contains( type ) )
349 type = mLimitedSources.at( 0 );
355 mStackedWidget->setCurrentIndex(
static_cast<int>( StaticValue ) );
357 mSourceButton->setToolTip( tr(
"Value" ) );
362 mStackedWidget->setCurrentIndex(
static_cast<int>( Expression ) );
363 mSourceButton->setToolTip( tr(
"Pre-calculated Value" ) );
369 mStackedWidget->setCurrentIndex(
static_cast<int>( ModelParameter ) );
370 mSourceButton->setToolTip( tr(
"Model Input" ) );
377 mStackedWidget->setCurrentIndex(
static_cast<int>( ChildOutput ) );
378 mSourceButton->setToolTip( tr(
"Algorithm Output" ) );
385 mStackedWidget->setCurrentIndex(
static_cast<int>( ModelOutput ) );
386 mSourceButton->setToolTip( tr(
"Model Output" ) );
395void QgsProcessingModelerParameterWidget::updateUi()
397 mStaticWidgetWrapper->setParameterValue( mStaticValue, mContext );
401 int currentIndex = mModelInputCombo->findData( mModelInputParameterName );
402 if ( currentIndex == -1 && mModelInputCombo->count() > 0 )
404 mModelInputCombo->setCurrentIndex( currentIndex );
406 const QStringList parts = QStringList() << mOutputChildId << mOutputName;
407 currentIndex = mChildOutputCombo->findData( parts );
408 if ( currentIndex == -1 && mChildOutputCombo->count() > 0 )
410 mChildOutputCombo->setCurrentIndex( currentIndex );
415 const QList<QgsProcessingModelChildParameterSource> sources = mModel->availableSourcesForChild( mChildId, compatibleParameterTypes, compatibleOutputTypes, compatibleDataTypes );
417 for (
const QgsProcessingModelChildParameterSource &source : sources )
419 switch ( source.source() )
422 mModelInputCombo->addItem( mModel->parameterDefinition( source.parameterName() )->description(), source.parameterName() );
427 if ( !mModel->childAlgorithms().contains( source.outputChildId() ) )
430 const QgsProcessingModelChildAlgorithm &alg = mModel->childAlgorithm( source.outputChildId() );
431 if ( !alg.algorithm() )
433 const QString outputDescription = alg.algorithm()->outputDefinition( source.outputName() )->description();
434 const QString childDescription = alg.description();
436 mChildOutputCombo->addItem( tr(
"“%1” from algorithm “%2”" ).arg( outputDescription, childDescription ), QStringList() << source.outputChildId() << source.outputName() );
ProcessingModelChildParameterSource
Processing model child parameter sources.
@ ExpressionText
Parameter value is taken from a text with expressions, evaluated just before the algorithm runs.
@ ModelOutput
Parameter value is linked to an output parameter for the model.
@ ChildOutput
Parameter value is taken from an output generated by a child algorithm.
@ ModelParameter
Parameter value is taken from a parent model parameter.
@ StaticValue
Parameter value is a static value.
@ Expression
Parameter value is taken from an expression, evaluated just before the algorithm runs.
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
Single scope for storing variables and functions for use within a QgsExpressionContext.
QStringList functionNames() const
Retrieves a list of names of functions contained in the scope.
QStringList variableNames() const
Returns a list of variable names contained within the scope.
static QgsExpressionContextScope * processingModelAlgorithmScope(const QgsProcessingModelAlgorithm *model, const QVariantMap ¶meters, QgsProcessingContext &context)
Creates a new scope which contains variables and functions relating to a processing model algorithm,...
static QgsExpressionContextScope * processingAlgorithmScope(const QgsProcessingAlgorithm *algorithm, const QVariantMap ¶meters, QgsProcessingContext &context)
Creates a new scope which contains variables and functions relating to a processing algorithm,...
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
The QgsExpressionLineEdit widget includes a line edit for entering expressions together with a button...
QString expression() const
Returns the current expression shown in the widget.
void registerExpressionContextGenerator(const QgsExpressionContextGenerator *generator)
Register an expression context generator class that will be used to retrieve an expression context fo...
void setExpectedOutputFormat(const QString &expected)
Set the expected format string, which is shown in the expression builder dialog for the widget.
void setExpression(const QString &expression)
Sets the current expression to show in the widget.
QLineEdit subclass with built in support for clearing the widget's value and handling custom null val...
static QgsProcessingGuiRegistry * processingGuiRegistry()
Returns the global processing gui registry, used for registering the GUI behavior of processing algor...
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.
Base class for the definition of processing parameters.
QVariantMap metadata() const
Returns the parameter's freeform metadata.
virtual bool isDestination() const
Returns true if this parameter represents a file or layer destination, e.g.
Contains settings which reflect the context in which a Processing parameter widget is shown,...
int scaleIconSize(int standardSize)
Scales an icon size to compensate for display pixel density, making the icon size hi-dpi friendly,...
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