32#include <QTableWidget>
35#include "moc_qgsprocessingconfigurationwidgets.cpp"
37using namespace Qt::StringLiterals;
41QgsFilterAlgorithmConfigurationWidget::QgsFilterAlgorithmConfigurationWidget( QWidget *parent )
44 setContentsMargins( 0, 0, 0, 0 );
46 mOutputExpressionWidget =
new QTableWidget();
47 mOutputExpressionWidget->setColumnCount( 3 );
48 mOutputExpressionWidget->setHorizontalHeaderItem( 0,
new QTableWidgetItem( tr(
"Output Name" ) ) );
49 mOutputExpressionWidget->setHorizontalHeaderItem( 1,
new QTableWidgetItem( tr(
"Filter Expression" ) ) );
50 mOutputExpressionWidget->setHorizontalHeaderItem( 2,
new QTableWidgetItem( tr(
"Final Output" ) ) );
51 mOutputExpressionWidget->horizontalHeader()->setSectionResizeMode( 1, QHeaderView::Stretch );
52 QGridLayout *layout =
new QGridLayout();
55 layout->addWidget(
new QLabel( tr(
"Outputs and filters" ) ), 0, 0, 1, 2 );
56 layout->addWidget( mOutputExpressionWidget, 1, 0, 4, 1 );
57 QToolButton *addOutputButton =
new QToolButton();
59 addOutputButton->setText( tr(
"Add Output" ) );
61 QToolButton *removeOutputButton =
new QToolButton();
63 removeOutputButton->setToolTip( tr(
"Remove Selected Outputs" ) );
65 layout->addWidget( addOutputButton, 2, 1, 1, 1 );
66 layout->addWidget( removeOutputButton, 3, 1, 1, 1 );
68 connect( addOutputButton, &QToolButton::clicked,
this, &QgsFilterAlgorithmConfigurationWidget::addOutput );
69 connect( removeOutputButton, &QToolButton::clicked,
this, &QgsFilterAlgorithmConfigurationWidget::removeSelectedOutputs );
71 connect( mOutputExpressionWidget->selectionModel(), &QItemSelectionModel::selectionChanged,
this, [removeOutputButton,
this] {
72 removeOutputButton->setEnabled( !mOutputExpressionWidget->selectionModel()->selectedIndexes().isEmpty() );
76QVariantMap QgsFilterAlgorithmConfigurationWidget::configuration()
const
80 for (
int i = 0; i < mOutputExpressionWidget->rowCount(); ++i )
83 output.insert( u
"name"_s, mOutputExpressionWidget->item( i, 0 )->text() );
84 output.insert( u
"expression"_s, qobject_cast<QgsExpressionLineEdit *>( mOutputExpressionWidget->cellWidget( i, 1 ) )->expression() );
85 output.insert( u
"isModelOutput"_s, qobject_cast<QCheckBox *>( mOutputExpressionWidget->cellWidget( i, 2 ) )->isChecked() );
86 outputs.append( output );
90 map.insert(
"outputs", outputs );
96void QgsFilterAlgorithmConfigurationWidget::setConfiguration(
const QVariantMap &configuration )
98 mOutputExpressionWidget->setRowCount( 0 );
100 const QVariantList outputs = configuration.value(
"outputs" ).toList();
102 for (
const QVariant &outputvar : outputs )
104 const QVariantMap output = outputvar.toMap();
105 mOutputExpressionWidget->insertRow( currentRow );
106 mOutputExpressionWidget->setItem( currentRow, 0,
new QTableWidgetItem( output.value(
"name" ).toString() ) );
109 expressionBuilder->
setExpression( output.value(
"expression" ).toString() );
110 mOutputExpressionWidget->setCellWidget( currentRow, 1, expressionBuilder );
111 QCheckBox *isModelOutput =
new QCheckBox();
112 isModelOutput->setChecked( output.value(
"isModelOutput" ).toBool() );
113 mOutputExpressionWidget->setCellWidget( currentRow, 2, isModelOutput );
118 if ( outputs.isEmpty() )
122void QgsFilterAlgorithmConfigurationWidget::removeSelectedOutputs()
124 const QItemSelection selection( mOutputExpressionWidget->selectionModel()->selection() );
127 const QModelIndexList indexes = selection.indexes();
128 for (
const QModelIndex &index : indexes )
130 rows.append( index.row() );
133 std::sort( rows.begin(), rows.end() );
136 for (
int i = rows.count() - 1; i >= 0; i -= 1 )
138 const int current = rows[i];
139 if ( current != prev )
141 mOutputExpressionWidget->removeRow( current );
147void QgsFilterAlgorithmConfigurationWidget::addOutput()
149 const int rowIndex = mOutputExpressionWidget->rowCount();
150 mOutputExpressionWidget->setRowCount( rowIndex + 1 );
153 mOutputExpressionWidget->setItem( rowIndex, 0,
new QTableWidgetItem( QString() ) );
154 mOutputExpressionWidget->setCellWidget( rowIndex, 1, expressionBuilder );
155 mOutputExpressionWidget->setCellWidget( rowIndex, 2,
new QCheckBox() );
161 return new QgsFilterAlgorithmConfigurationWidget();
176QgsConditionalBranchAlgorithmConfigurationWidget::QgsConditionalBranchAlgorithmConfigurationWidget( QWidget *parent )
179 setContentsMargins( 0, 0, 0, 0 );
181 mConditionExpressionWidget =
new QTableWidget();
182 mConditionExpressionWidget->setColumnCount( 2 );
183 mConditionExpressionWidget->setHorizontalHeaderItem( 0,
new QTableWidgetItem( tr(
"Branch Name" ) ) );
184 mConditionExpressionWidget->setHorizontalHeaderItem( 1,
new QTableWidgetItem( tr(
"Condition" ) ) );
185 mConditionExpressionWidget->horizontalHeader()->setSectionResizeMode( 1, QHeaderView::Stretch );
186 QGridLayout *layout =
new QGridLayout();
189 layout->addWidget(
new QLabel( tr(
"Conditions" ) ), 0, 0, 1, 2 );
190 layout->addWidget( mConditionExpressionWidget, 1, 0, 4, 1 );
191 QToolButton *addConditionButton =
new QToolButton();
193 addConditionButton->setText( tr(
"Add Condition" ) );
195 QToolButton *removeConditionButton =
new QToolButton();
197 removeConditionButton->setToolTip( tr(
"Remove Selected Conditions" ) );
199 layout->addWidget( addConditionButton, 2, 1, 1, 1 );
200 layout->addWidget( removeConditionButton, 3, 1, 1, 1 );
202 connect( addConditionButton, &QToolButton::clicked,
this, &QgsConditionalBranchAlgorithmConfigurationWidget::addCondition );
203 connect( removeConditionButton, &QToolButton::clicked,
this, &QgsConditionalBranchAlgorithmConfigurationWidget::removeSelectedConditions );
205 connect( mConditionExpressionWidget->selectionModel(), &QItemSelectionModel::selectionChanged,
this, [removeConditionButton,
this] {
206 removeConditionButton->setEnabled( !mConditionExpressionWidget->selectionModel()->selectedIndexes().isEmpty() );
210QVariantMap QgsConditionalBranchAlgorithmConfigurationWidget::configuration()
const
212 QVariantList outputs;
214 for (
int i = 0; i < mConditionExpressionWidget->rowCount(); ++i )
217 output.insert( u
"name"_s, mConditionExpressionWidget->item( i, 0 )->text() );
218 output.insert( u
"expression"_s, qobject_cast<QgsExpressionLineEdit *>( mConditionExpressionWidget->cellWidget( i, 1 ) )->expression() );
219 outputs.append( output );
223 map.insert(
"conditions", outputs );
229void QgsConditionalBranchAlgorithmConfigurationWidget::setConfiguration(
const QVariantMap &configuration )
231 mConditionExpressionWidget->setRowCount( 0 );
233 const QVariantList conditions = configuration.value(
"conditions" ).toList();
235 for (
const QVariant &conditionvar : conditions )
237 const QVariantMap output = conditionvar.toMap();
238 mConditionExpressionWidget->insertRow( currentRow );
239 mConditionExpressionWidget->setItem( currentRow, 0,
new QTableWidgetItem( output.value(
"name" ).toString() ) );
242 expressionBuilder->
setExpression( output.value(
"expression" ).toString() );
243 mConditionExpressionWidget->setCellWidget( currentRow, 1, expressionBuilder );
247 if ( conditions.isEmpty() )
251void QgsConditionalBranchAlgorithmConfigurationWidget::removeSelectedConditions()
253 const QItemSelection selection( mConditionExpressionWidget->selectionModel()->selection() );
256 const QModelIndexList indexes = selection.indexes();
257 for (
const QModelIndex &index : indexes )
259 rows.append( index.row() );
262 std::sort( rows.begin(), rows.end() );
265 for (
int i = rows.count() - 1; i >= 0; i -= 1 )
267 const int current = rows[i];
268 if ( current != prev )
270 mConditionExpressionWidget->removeRow( current );
276void QgsConditionalBranchAlgorithmConfigurationWidget::addCondition()
278 const int rowIndex = mConditionExpressionWidget->rowCount();
279 mConditionExpressionWidget->setRowCount( rowIndex + 1 );
282 mConditionExpressionWidget->setItem( rowIndex, 0,
new QTableWidgetItem( QString() ) );
283 mConditionExpressionWidget->setCellWidget( rowIndex, 1, expressionBuilder );
286QgsConditionalBranchAlgorithmConfigurationWidget *QgsConditionalBranchAlgorithmConfigurationWidgetFactory::create(
const QgsProcessingAlgorithm *
algorithm )
const
288 if (
algorithm->name() ==
"condition"_L1 )
289 return new QgsConditionalBranchAlgorithmConfigurationWidget();
296 return algorithm->name() ==
"condition"_L1;
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