20#include "moc_qgsprocessingconfigurationwidgets.cpp" 
   27#include <QTableWidget> 
   36QgsFilterAlgorithmConfigurationWidget::QgsFilterAlgorithmConfigurationWidget( QWidget *parent )
 
   39  setContentsMargins( 0, 0, 0, 0 );
 
   41  mOutputExpressionWidget = 
new QTableWidget();
 
   42  mOutputExpressionWidget->setColumnCount( 3 );
 
   43  mOutputExpressionWidget->setHorizontalHeaderItem( 0, 
new QTableWidgetItem( tr( 
"Output Name" ) ) );
 
   44  mOutputExpressionWidget->setHorizontalHeaderItem( 1, 
new QTableWidgetItem( tr( 
"Filter Expression" ) ) );
 
   45  mOutputExpressionWidget->setHorizontalHeaderItem( 2, 
new QTableWidgetItem( tr( 
"Final Output" ) ) );
 
   46  mOutputExpressionWidget->horizontalHeader()->setSectionResizeMode( 1, QHeaderView::Stretch );
 
   47  QGridLayout *layout = 
new QGridLayout();
 
   50  layout->addWidget( 
new QLabel( tr( 
"Outputs and filters" ) ), 0, 0, 1, 2 );
 
   51  layout->addWidget( mOutputExpressionWidget, 1, 0, 4, 1 );
 
   52  QToolButton *addOutputButton = 
new QToolButton();
 
   54  addOutputButton->setText( tr( 
"Add Output" ) );
 
   56  QToolButton *removeOutputButton = 
new QToolButton();
 
   58  removeOutputButton->setToolTip( tr( 
"Remove Selected Outputs" ) );
 
   60  layout->addWidget( addOutputButton, 2, 1, 1, 1 );
 
   61  layout->addWidget( removeOutputButton, 3, 1, 1, 1 );
 
   63  connect( addOutputButton, &QToolButton::clicked, 
this, &QgsFilterAlgorithmConfigurationWidget::addOutput );
 
   64  connect( removeOutputButton, &QToolButton::clicked, 
this, &QgsFilterAlgorithmConfigurationWidget::removeSelectedOutputs );
 
   66  connect( mOutputExpressionWidget->selectionModel(), &QItemSelectionModel::selectionChanged, 
this, [removeOutputButton, 
this] {
 
   67    removeOutputButton->setEnabled( !mOutputExpressionWidget->selectionModel()->selectedIndexes().isEmpty() );
 
   71QVariantMap QgsFilterAlgorithmConfigurationWidget::configuration()
 const 
   75  for ( 
int i = 0; i < mOutputExpressionWidget->rowCount(); ++i )
 
   78    output.insert( QStringLiteral( 
"name" ), mOutputExpressionWidget->item( i, 0 )->text() );
 
   79    output.insert( QStringLiteral( 
"expression" ), qobject_cast<QgsExpressionLineEdit *>( mOutputExpressionWidget->cellWidget( i, 1 ) )->expression() );
 
   80    output.insert( QStringLiteral( 
"isModelOutput" ), qobject_cast<QCheckBox *>( mOutputExpressionWidget->cellWidget( i, 2 ) )->isChecked() );
 
   81    outputs.append( output );
 
   85  map.insert( 
"outputs", outputs );
 
   91void QgsFilterAlgorithmConfigurationWidget::setConfiguration( 
const QVariantMap &configuration )
 
   93  mOutputExpressionWidget->setRowCount( 0 );
 
   95  const QVariantList outputs = configuration.value( 
"outputs" ).toList();
 
   97  for ( 
const QVariant &outputvar : outputs )
 
   99    const QVariantMap output = outputvar.toMap();
 
  100    mOutputExpressionWidget->insertRow( currentRow );
 
  101    mOutputExpressionWidget->setItem( currentRow, 0, 
new QTableWidgetItem( output.value( 
"name" ).toString() ) );
 
  104    expressionBuilder->
setExpression( output.value( 
"expression" ).toString() );
 
  105    mOutputExpressionWidget->setCellWidget( currentRow, 1, expressionBuilder );
 
  106    QCheckBox *isModelOutput = 
new QCheckBox();
 
  107    isModelOutput->setChecked( output.value( 
"isModelOutput" ).toBool() );
 
  108    mOutputExpressionWidget->setCellWidget( currentRow, 2, isModelOutput );
 
  113  if ( outputs.isEmpty() )
 
  117void QgsFilterAlgorithmConfigurationWidget::removeSelectedOutputs()
 
  119  const QItemSelection selection( mOutputExpressionWidget->selectionModel()->selection() );
 
  122  const QModelIndexList indexes = selection.indexes();
 
  123  for ( 
const QModelIndex &index : indexes )
 
  125    rows.append( index.row() );
 
  128  std::sort( rows.begin(), rows.end() );
 
  131  for ( 
int i = rows.count() - 1; i >= 0; i -= 1 )
 
  133    const int current = rows[i];
 
  134    if ( current != prev )
 
  136      mOutputExpressionWidget->removeRow( current );
 
  142void QgsFilterAlgorithmConfigurationWidget::addOutput()
 
  144  const int rowIndex = mOutputExpressionWidget->rowCount();
 
  145  mOutputExpressionWidget->setRowCount( rowIndex + 1 );
 
  148  mOutputExpressionWidget->setItem( rowIndex, 0, 
new QTableWidgetItem( QString() ) );
 
  149  mOutputExpressionWidget->setCellWidget( rowIndex, 1, expressionBuilder );
 
  150  mOutputExpressionWidget->setCellWidget( rowIndex, 2, 
new QCheckBox() );
 
  156    return new QgsFilterAlgorithmConfigurationWidget();
 
  171QgsConditionalBranchAlgorithmConfigurationWidget::QgsConditionalBranchAlgorithmConfigurationWidget( QWidget *parent )
 
  174  setContentsMargins( 0, 0, 0, 0 );
 
  176  mConditionExpressionWidget = 
new QTableWidget();
 
  177  mConditionExpressionWidget->setColumnCount( 2 );
 
  178  mConditionExpressionWidget->setHorizontalHeaderItem( 0, 
new QTableWidgetItem( tr( 
"Branch Name" ) ) );
 
  179  mConditionExpressionWidget->setHorizontalHeaderItem( 1, 
new QTableWidgetItem( tr( 
"Condition" ) ) );
 
  180  mConditionExpressionWidget->horizontalHeader()->setSectionResizeMode( 1, QHeaderView::Stretch );
 
  181  QGridLayout *layout = 
new QGridLayout();
 
  184  layout->addWidget( 
new QLabel( tr( 
"Conditions" ) ), 0, 0, 1, 2 );
 
  185  layout->addWidget( mConditionExpressionWidget, 1, 0, 4, 1 );
 
  186  QToolButton *addConditionButton = 
new QToolButton();
 
  188  addConditionButton->setText( tr( 
"Add Condition" ) );
 
  190  QToolButton *removeConditionButton = 
new QToolButton();
 
  192  removeConditionButton->setToolTip( tr( 
"Remove Selected Conditions" ) );
 
  194  layout->addWidget( addConditionButton, 2, 1, 1, 1 );
 
  195  layout->addWidget( removeConditionButton, 3, 1, 1, 1 );
 
  197  connect( addConditionButton, &QToolButton::clicked, 
this, &QgsConditionalBranchAlgorithmConfigurationWidget::addCondition );
 
  198  connect( removeConditionButton, &QToolButton::clicked, 
this, &QgsConditionalBranchAlgorithmConfigurationWidget::removeSelectedConditions );
 
  200  connect( mConditionExpressionWidget->selectionModel(), &QItemSelectionModel::selectionChanged, 
this, [removeConditionButton, 
this] {
 
  201    removeConditionButton->setEnabled( !mConditionExpressionWidget->selectionModel()->selectedIndexes().isEmpty() );
 
  205QVariantMap QgsConditionalBranchAlgorithmConfigurationWidget::configuration()
 const 
  207  QVariantList outputs;
 
  209  for ( 
int i = 0; i < mConditionExpressionWidget->rowCount(); ++i )
 
  212    output.insert( QStringLiteral( 
"name" ), mConditionExpressionWidget->item( i, 0 )->text() );
 
  213    output.insert( QStringLiteral( 
"expression" ), qobject_cast<QgsExpressionLineEdit *>( mConditionExpressionWidget->cellWidget( i, 1 ) )->expression() );
 
  214    outputs.append( output );
 
  218  map.insert( 
"conditions", outputs );
 
  224void QgsConditionalBranchAlgorithmConfigurationWidget::setConfiguration( 
const QVariantMap &configuration )
 
  226  mConditionExpressionWidget->setRowCount( 0 );
 
  228  const QVariantList conditions = configuration.value( 
"conditions" ).toList();
 
  230  for ( 
const QVariant &conditionvar : conditions )
 
  232    const QVariantMap output = conditionvar.toMap();
 
  233    mConditionExpressionWidget->insertRow( currentRow );
 
  234    mConditionExpressionWidget->setItem( currentRow, 0, 
new QTableWidgetItem( output.value( 
"name" ).toString() ) );
 
  237    expressionBuilder->
setExpression( output.value( 
"expression" ).toString() );
 
  238    mConditionExpressionWidget->setCellWidget( currentRow, 1, expressionBuilder );
 
  242  if ( conditions.isEmpty() )
 
  246void QgsConditionalBranchAlgorithmConfigurationWidget::removeSelectedConditions()
 
  248  const QItemSelection selection( mConditionExpressionWidget->selectionModel()->selection() );
 
  251  const QModelIndexList indexes = selection.indexes();
 
  252  for ( 
const QModelIndex &index : indexes )
 
  254    rows.append( index.row() );
 
  257  std::sort( rows.begin(), rows.end() );
 
  260  for ( 
int i = rows.count() - 1; i >= 0; i -= 1 )
 
  262    const int current = rows[i];
 
  263    if ( current != prev )
 
  265      mConditionExpressionWidget->removeRow( current );
 
  271void QgsConditionalBranchAlgorithmConfigurationWidget::addCondition()
 
  273  const int rowIndex = mConditionExpressionWidget->rowCount();
 
  274  mConditionExpressionWidget->setRowCount( rowIndex + 1 );
 
  277  mConditionExpressionWidget->setItem( rowIndex, 0, 
new QTableWidgetItem( QString() ) );
 
  278  mConditionExpressionWidget->setCellWidget( rowIndex, 1, expressionBuilder );
 
  281QgsConditionalBranchAlgorithmConfigurationWidget *QgsConditionalBranchAlgorithmConfigurationWidgetFactory::create( 
const QgsProcessingAlgorithm *
algorithm )
 const 
  284    return new QgsConditionalBranchAlgorithmConfigurationWidget();
 
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
 
A widget which includes a line edit for entering expressions together with a button to open the expre...
 
void registerExpressionContextGenerator(const QgsExpressionContextGenerator *generator)
Register an expression context generator class that will be used to retrieve an expression context fo...
 
void setExpression(const QString &expression)
Sets the current expression to show in the widget.
 
Abstract base class for processing algorithms.
 
virtual QString name() const =0
Returns the algorithm name, used for identifying the algorithm.
 
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