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