20#include "moc_qgsprocessingmodelerparameterwidget.cpp"
35#include <QStackedWidget>
44 , mParameterDefinition( parameter )
47 setFocusPolicy( Qt::StrongFocus );
52 QHBoxLayout *hLayout =
new QHBoxLayout();
55 const QVariantList acceptedSourcesMetadata = mParameterDefinition->
metadata().value( QStringLiteral(
"model_widget" ) ).toMap().value( QStringLiteral(
"accepted_sources" ) ).toList();
56 for (
const QVariant &acceptedSource : acceptedSourcesMetadata )
62 mSourceButton =
new QToolButton();
63 mSourceButton->setFocusPolicy( Qt::StrongFocus );
66 mSourceButton->setFixedSize( 2 *
static_cast<int>( 1.25 * iconSize / 2.0 ), 2 *
static_cast<int>( iconSize * 1.1 / 2.0 ) );
67 mSourceButton->setIconSize( QSize( iconSize, iconSize ) );
68 mSourceButton->setPopupMode( QToolButton::InstantPopup );
70 mSourceMenu =
new QMenu(
this );
71 connect( mSourceMenu, &QMenu::aboutToShow,
this, &QgsProcessingModelerParameterWidget::sourceMenuAboutToShow );
72 connect( mSourceMenu, &QMenu::triggered,
this, &QgsProcessingModelerParameterWidget::sourceMenuActionTriggered );
73 mSourceButton->setMenu( mSourceMenu );
75 hLayout->addWidget( mSourceButton );
77 mStackedWidget =
new QStackedWidget();
80 if ( mStaticWidgetWrapper )
82 QWidget *widget = mStaticWidgetWrapper->createWrappedWidget( context );
85 mHasStaticWrapper =
true;
86 mStackedWidget->addWidget( widget );
89 mStackedWidget->addWidget(
new QWidget() );
93 mStackedWidget->addWidget(
new QWidget() );
98 mStackedWidget->addWidget( mExpressionWidget );
100 mModelInputCombo =
new QComboBox();
101 QHBoxLayout *hLayout2 =
new QHBoxLayout();
102 hLayout2->setContentsMargins( 0, 0, 0, 0 );
103 hLayout2->addWidget(
new QLabel( tr(
"Using model input" ) ) );
104 hLayout2->addWidget( mModelInputCombo, 1 );
105 QWidget *hWidget2 =
new QWidget();
106 hWidget2->setLayout( hLayout2 );
107 mStackedWidget->addWidget( hWidget2 );
109 mChildOutputCombo =
new QComboBox();
110 QHBoxLayout *hLayout3 =
new QHBoxLayout();
111 hLayout3->setContentsMargins( 0, 0, 0, 0 );
112 hLayout3->addWidget(
new QLabel( tr(
"Using algorithm output" ) ) );
113 hLayout3->addWidget( mChildOutputCombo, 1 );
114 QWidget *hWidget3 =
new QWidget();
115 hWidget3->setLayout( hLayout3 );
116 mStackedWidget->addWidget( hWidget3 );
121 mModelOutputName->setPlaceholderText( tr(
"[Enter name if this is a final result]" ) );
122 QHBoxLayout *hLayout4 =
new QHBoxLayout();
123 hLayout4->setContentsMargins( 0, 0, 0, 0 );
124 hLayout4->addWidget( mModelOutputName );
125 QWidget *hWidget4 =
new QWidget();
126 hWidget4->setLayout( hLayout4 );
127 mStackedWidget->addWidget( hWidget4 );
130 hLayout->setContentsMargins( 0, 0, 0, 0 );
131 hLayout->addWidget( mStackedWidget, 1 );
133 setLayout( hLayout );
141 if ( mStaticWidgetWrapper )
142 mStaticWidgetWrapper->setWidgetContext( context );
147 if ( mStaticWidgetWrapper )
148 mStaticWidgetWrapper->registerProcessingContextGenerator( generator );
153 return mParameterDefinition;
158 if ( mStaticWidgetWrapper )
159 return mStaticWidgetWrapper->createWrappedLabel();
168 mStaticValue =
value.staticValue();
169 mModelInputParameterName =
value.parameterName();
170 mOutputChildId =
value.outputChildId();
171 mOutputName =
value.outputName();
172 mExpression =
value.expression();
180 if ( values.size() == 1 )
185 for (
const QgsProcessingModelChildParameterSource &v : values )
186 r << QVariant::fromValue( v );
195 if ( mModelOutputName )
196 mModelOutputName->setText(
value );
202 return currentSourceType() == ModelOutput;
207 return mModelOutputName ? mModelOutputName->text().trimmed() : QString();
212 switch ( currentSourceType() )
216 const QVariant v = mStaticWidgetWrapper->parameterValue();
218 if ( v.userType() == QMetaType::Type::QVariantList )
220 const QVariantList vList = v.toList();
221 if ( std::all_of( vList.begin(), vList.end(), [](
const QVariant &val ) {
222 return val.userType() == qMetaTypeId<QgsProcessingModelChildParameterSource>();
228 return QVariant::fromValue( QgsProcessingModelChildParameterSource::fromStaticValue( v ) );
232 return QVariant::fromValue( QgsProcessingModelChildParameterSource::fromExpression( mExpressionWidget->
expression() ) );
235 return QVariant::fromValue( QgsProcessingModelChildParameterSource::fromModelParameter( mModelInputCombo->currentData().toString() ) );
239 const QStringList parts = mChildOutputCombo->currentData().toStringList();
240 return QVariant::fromValue( QgsProcessingModelChildParameterSource::fromChildOutput( parts.value( 0, QString() ), parts.value( 1, QString() ) ) );
244 return mModelOutputName ? ( mModelOutputName->text().trimmed().isEmpty() ? QVariant() : mModelOutputName->text() ) : QVariant();
247 return QVariant::fromValue( QgsProcessingModelChildParameterSource() );
252 if ( mStaticWidgetWrapper )
253 mStaticWidgetWrapper->setDialog( dialog );
262 if ( mModel->childAlgorithms().contains( mChildId ) )
263 alg = mModel->childAlgorithm( mChildId ).algorithm();
268 QgsExpressionContextScope *childScope = mModel->createExpressionContextScopeForChildAlgorithm( mChildId, mContext, QVariantMap(), QVariantMap() );
271 QStringList highlightedVariables = childScope->
variableNames();
272 QStringList highlightedFunctions = childScope->
functionNames();
274 highlightedVariables += mModel->variables().keys();
276 c.setHighlightedVariables( highlightedVariables );
277 c.setHighlightedFunctions( highlightedFunctions );
283void QgsProcessingModelerParameterWidget::sourceMenuAboutToShow()
285 mSourceMenu->clear();
287 const SourceType currentSource = currentSourceType();
292 QAction *modelOutputAction = mSourceMenu->addAction( tr(
"Model Output" ) );
293 modelOutputAction->setCheckable( currentSource == ModelOutput );
294 modelOutputAction->setChecked( currentSource == ModelOutput );
298 if ( mHasStaticWrapper
301 QAction *fixedValueAction = mSourceMenu->addAction( tr(
"Value" ) );
302 fixedValueAction->setCheckable( currentSource == StaticValue );
303 fixedValueAction->setChecked( currentSource == StaticValue );
309 QAction *calculatedValueAction = mSourceMenu->addAction( tr(
"Pre-calculated Value" ) );
310 calculatedValueAction->setCheckable( currentSource == Expression );
311 calculatedValueAction->setChecked( currentSource == Expression );
317 QAction *inputValueAction = mSourceMenu->addAction( tr(
"Model Input" ) );
318 inputValueAction->setCheckable( currentSource == ModelParameter );
319 inputValueAction->setChecked( currentSource == ModelParameter );
325 QAction *childOutputValueAction = mSourceMenu->addAction( tr(
"Algorithm Output" ) );
326 childOutputValueAction->setCheckable( currentSource == ChildOutput );
327 childOutputValueAction->setChecked( currentSource == ChildOutput );
334void QgsProcessingModelerParameterWidget::sourceMenuActionTriggered( QAction *action )
340QgsProcessingModelerParameterWidget::SourceType QgsProcessingModelerParameterWidget::currentSourceType()
const
342 return static_cast<SourceType
>( mStackedWidget->currentIndex() );
347 if ( !mLimitedSources.empty() && !mLimitedSources.contains( type ) )
351 type = mLimitedSources.at( 0 );
357 mStackedWidget->setCurrentIndex(
static_cast<int>( StaticValue ) );
359 mSourceButton->setToolTip( tr(
"Value" ) );
364 mStackedWidget->setCurrentIndex(
static_cast<int>( Expression ) );
365 mSourceButton->setToolTip( tr(
"Pre-calculated Value" ) );
371 mStackedWidget->setCurrentIndex(
static_cast<int>( ModelParameter ) );
372 mSourceButton->setToolTip( tr(
"Model Input" ) );
379 mStackedWidget->setCurrentIndex(
static_cast<int>( ChildOutput ) );
380 mSourceButton->setToolTip( tr(
"Algorithm Output" ) );
387 mStackedWidget->setCurrentIndex(
static_cast<int>( ModelOutput ) );
388 mSourceButton->setToolTip( tr(
"Model Output" ) );
397void QgsProcessingModelerParameterWidget::updateUi()
399 mStaticWidgetWrapper->setParameterValue( mStaticValue, mContext );
403 int currentIndex = mModelInputCombo->findData( mModelInputParameterName );
404 if ( currentIndex == -1 && mModelInputCombo->count() > 0 )
406 mModelInputCombo->setCurrentIndex( currentIndex );
408 const QStringList parts = QStringList() << mOutputChildId << mOutputName;
409 currentIndex = mChildOutputCombo->findData( parts );
410 if ( currentIndex == -1 && mChildOutputCombo->count() > 0 )
412 mChildOutputCombo->setCurrentIndex( currentIndex );
417 QgsProcessingModelChildParameterSources sources = mModel->availableSourcesForChild( mChildId, compatibleParameterTypes, compatibleOutputTypes, compatibleDataTypes );
419 for (
const QgsProcessingModelChildParameterSource &source : sources )
421 switch ( source.source() )
424 mModelInputCombo->addItem( mModel->parameterDefinition( source.parameterName() )->description(), source.parameterName() );
429 if ( !mModel->childAlgorithms().contains( source.outputChildId() ) )
432 const QgsProcessingModelChildAlgorithm &alg = mModel->childAlgorithm( source.outputChildId() );
433 if ( !alg.algorithm() )
435 const QString outputDescription = alg.algorithm()->outputDefinition( source.outputName() )->description();
436 const QString childDescription = alg.description();
438 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...
A widget which includes a line edit for entering expressions together with a button to open the expre...
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