31#include <QTableWidget>
34#include "moc_qgsprocessingconfigurationwidgets.cpp"
38QgsFilterAlgorithmConfigurationWidget::QgsFilterAlgorithmConfigurationWidget( QWidget *parent )
41 setContentsMargins( 0, 0, 0, 0 );
43 mOutputExpressionWidget =
new QTableWidget();
44 mOutputExpressionWidget->setColumnCount( 3 );
45 mOutputExpressionWidget->setHorizontalHeaderItem( 0,
new QTableWidgetItem( tr(
"Output Name" ) ) );
46 mOutputExpressionWidget->setHorizontalHeaderItem( 1,
new QTableWidgetItem( tr(
"Filter Expression" ) ) );
47 mOutputExpressionWidget->setHorizontalHeaderItem( 2,
new QTableWidgetItem( tr(
"Final Output" ) ) );
48 mOutputExpressionWidget->horizontalHeader()->setSectionResizeMode( 1, QHeaderView::Stretch );
49 QGridLayout *layout =
new QGridLayout();
52 layout->addWidget(
new QLabel( tr(
"Outputs and filters" ) ), 0, 0, 1, 2 );
53 layout->addWidget( mOutputExpressionWidget, 1, 0, 4, 1 );
54 QToolButton *addOutputButton =
new QToolButton();
56 addOutputButton->setText( tr(
"Add Output" ) );
58 QToolButton *removeOutputButton =
new QToolButton();
60 removeOutputButton->setToolTip( tr(
"Remove Selected Outputs" ) );
62 layout->addWidget( addOutputButton, 2, 1, 1, 1 );
63 layout->addWidget( removeOutputButton, 3, 1, 1, 1 );
65 connect( addOutputButton, &QToolButton::clicked,
this, &QgsFilterAlgorithmConfigurationWidget::addOutput );
66 connect( removeOutputButton, &QToolButton::clicked,
this, &QgsFilterAlgorithmConfigurationWidget::removeSelectedOutputs );
68 connect( mOutputExpressionWidget->selectionModel(), &QItemSelectionModel::selectionChanged,
this, [removeOutputButton,
this] {
69 removeOutputButton->setEnabled( !mOutputExpressionWidget->selectionModel()->selectedIndexes().isEmpty() );
73QVariantMap QgsFilterAlgorithmConfigurationWidget::configuration()
const
77 for (
int i = 0; i < mOutputExpressionWidget->rowCount(); ++i )
80 output.insert( QStringLiteral(
"name" ), mOutputExpressionWidget->item( i, 0 )->text() );
81 output.insert( QStringLiteral(
"expression" ), qobject_cast<QgsExpressionLineEdit *>( mOutputExpressionWidget->cellWidget( i, 1 ) )->expression() );
82 output.insert( QStringLiteral(
"isModelOutput" ), qobject_cast<QCheckBox *>( mOutputExpressionWidget->cellWidget( i, 2 ) )->isChecked() );
83 outputs.append( output );
87 map.insert(
"outputs", outputs );
93void QgsFilterAlgorithmConfigurationWidget::setConfiguration(
const QVariantMap &configuration )
95 mOutputExpressionWidget->setRowCount( 0 );
97 const QVariantList outputs = configuration.value(
"outputs" ).toList();
99 for (
const QVariant &outputvar : outputs )
101 const QVariantMap output = outputvar.toMap();
102 mOutputExpressionWidget->insertRow( currentRow );
103 mOutputExpressionWidget->setItem( currentRow, 0,
new QTableWidgetItem( output.value(
"name" ).toString() ) );
106 expressionBuilder->
setExpression( output.value(
"expression" ).toString() );
107 mOutputExpressionWidget->setCellWidget( currentRow, 1, expressionBuilder );
108 QCheckBox *isModelOutput =
new QCheckBox();
109 isModelOutput->setChecked( output.value(
"isModelOutput" ).toBool() );
110 mOutputExpressionWidget->setCellWidget( currentRow, 2, isModelOutput );
115 if ( outputs.isEmpty() )
119void QgsFilterAlgorithmConfigurationWidget::removeSelectedOutputs()
121 const QItemSelection selection( mOutputExpressionWidget->selectionModel()->selection() );
124 const QModelIndexList indexes = selection.indexes();
125 for (
const QModelIndex &index : indexes )
127 rows.append( index.row() );
130 std::sort( rows.begin(), rows.end() );
133 for (
int i = rows.count() - 1; i >= 0; i -= 1 )
135 const int current = rows[i];
136 if ( current != prev )
138 mOutputExpressionWidget->removeRow( current );
144void QgsFilterAlgorithmConfigurationWidget::addOutput()
146 const int rowIndex = mOutputExpressionWidget->rowCount();
147 mOutputExpressionWidget->setRowCount( rowIndex + 1 );
150 mOutputExpressionWidget->setItem( rowIndex, 0,
new QTableWidgetItem( QString() ) );
151 mOutputExpressionWidget->setCellWidget( rowIndex, 1, expressionBuilder );
152 mOutputExpressionWidget->setCellWidget( rowIndex, 2,
new QCheckBox() );
157 if (
algorithm->name() == QLatin1String(
"filter" ) )
158 return new QgsFilterAlgorithmConfigurationWidget();
165 return algorithm->name() == QLatin1String(
"filter" );
173QgsConditionalBranchAlgorithmConfigurationWidget::QgsConditionalBranchAlgorithmConfigurationWidget( QWidget *parent )
176 setContentsMargins( 0, 0, 0, 0 );
178 mConditionExpressionWidget =
new QTableWidget();
179 mConditionExpressionWidget->setColumnCount( 2 );
180 mConditionExpressionWidget->setHorizontalHeaderItem( 0,
new QTableWidgetItem( tr(
"Branch Name" ) ) );
181 mConditionExpressionWidget->setHorizontalHeaderItem( 1,
new QTableWidgetItem( tr(
"Condition" ) ) );
182 mConditionExpressionWidget->horizontalHeader()->setSectionResizeMode( 1, QHeaderView::Stretch );
183 QGridLayout *layout =
new QGridLayout();
186 layout->addWidget(
new QLabel( tr(
"Conditions" ) ), 0, 0, 1, 2 );
187 layout->addWidget( mConditionExpressionWidget, 1, 0, 4, 1 );
188 QToolButton *addConditionButton =
new QToolButton();
190 addConditionButton->setText( tr(
"Add Condition" ) );
192 QToolButton *removeConditionButton =
new QToolButton();
194 removeConditionButton->setToolTip( tr(
"Remove Selected Conditions" ) );
196 layout->addWidget( addConditionButton, 2, 1, 1, 1 );
197 layout->addWidget( removeConditionButton, 3, 1, 1, 1 );
199 connect( addConditionButton, &QToolButton::clicked,
this, &QgsConditionalBranchAlgorithmConfigurationWidget::addCondition );
200 connect( removeConditionButton, &QToolButton::clicked,
this, &QgsConditionalBranchAlgorithmConfigurationWidget::removeSelectedConditions );
202 connect( mConditionExpressionWidget->selectionModel(), &QItemSelectionModel::selectionChanged,
this, [removeConditionButton,
this] {
203 removeConditionButton->setEnabled( !mConditionExpressionWidget->selectionModel()->selectedIndexes().isEmpty() );
207QVariantMap QgsConditionalBranchAlgorithmConfigurationWidget::configuration()
const
209 QVariantList outputs;
211 for (
int i = 0; i < mConditionExpressionWidget->rowCount(); ++i )
214 output.insert( QStringLiteral(
"name" ), mConditionExpressionWidget->item( i, 0 )->text() );
215 output.insert( QStringLiteral(
"expression" ), qobject_cast<QgsExpressionLineEdit *>( mConditionExpressionWidget->cellWidget( i, 1 ) )->expression() );
216 outputs.append( output );
220 map.insert(
"conditions", outputs );
226void QgsConditionalBranchAlgorithmConfigurationWidget::setConfiguration(
const QVariantMap &configuration )
228 mConditionExpressionWidget->setRowCount( 0 );
230 const QVariantList conditions = configuration.value(
"conditions" ).toList();
232 for (
const QVariant &conditionvar : conditions )
234 const QVariantMap output = conditionvar.toMap();
235 mConditionExpressionWidget->insertRow( currentRow );
236 mConditionExpressionWidget->setItem( currentRow, 0,
new QTableWidgetItem( output.value(
"name" ).toString() ) );
239 expressionBuilder->
setExpression( output.value(
"expression" ).toString() );
240 mConditionExpressionWidget->setCellWidget( currentRow, 1, expressionBuilder );
244 if ( conditions.isEmpty() )
248void QgsConditionalBranchAlgorithmConfigurationWidget::removeSelectedConditions()
250 const QItemSelection selection( mConditionExpressionWidget->selectionModel()->selection() );
253 const QModelIndexList indexes = selection.indexes();
254 for (
const QModelIndex &index : indexes )
256 rows.append( index.row() );
259 std::sort( rows.begin(), rows.end() );
262 for (
int i = rows.count() - 1; i >= 0; i -= 1 )
264 const int current = rows[i];
265 if ( current != prev )
267 mConditionExpressionWidget->removeRow( current );
273void QgsConditionalBranchAlgorithmConfigurationWidget::addCondition()
275 const int rowIndex = mConditionExpressionWidget->rowCount();
276 mConditionExpressionWidget->setRowCount( rowIndex + 1 );
279 mConditionExpressionWidget->setItem( rowIndex, 0,
new QTableWidgetItem( QString() ) );
280 mConditionExpressionWidget->setCellWidget( rowIndex, 1, expressionBuilder );
283QgsConditionalBranchAlgorithmConfigurationWidget *QgsConditionalBranchAlgorithmConfigurationWidgetFactory::create(
const QgsProcessingAlgorithm *
algorithm )
const
285 if (
algorithm->name() == QLatin1String(
"condition" ) )
286 return new QgsConditionalBranchAlgorithmConfigurationWidget();
293 return algorithm->name() == QLatin1String(
"condition" );
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.
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