Skip to content

Commit 3be4324

Browse files
committed
Move processing algorithm configuration widget to gui library
This way we can also use all the fancy widgets like a QgsExpressionLineEdit.
1 parent 10db1c8 commit 3be4324

20 files changed

+511
-157
lines changed

python/core/processing/qgsprocessingalgorithm.sip.in

-6
Original file line numberDiff line numberDiff line change
@@ -349,12 +349,6 @@ If an algorithm subclass implements a custom parameters widget, a copy of this w
349349
should be constructed and returned by this method.
350350
The base class implementation returns None, which indicates that an autogenerated
351351
parameters widget should be used.
352-
%End
353-
354-
virtual QgsProcessingAlgorithmConfigurationWidget *createModelerWidget() const /Factory/;
355-
%Docstring
356-
If an algorithm subclass implements a configuration widget for the algorithm itself,
357-
a new instance of this widget should be returned by this method.
358352
%End
359353

360354
QgsExpressionContext createExpressionContext( const QVariantMap &parameters,

python/core/processing/qgsprocessingalgorithmconfigurationwidget.sip.in

+49
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,68 @@
99

1010

1111

12+
13+
14+
15+
1216
class QgsProcessingAlgorithmConfigurationWidget : QWidget
1317
{
18+
%Docstring
19+
A configuration widget for processing algorithms allows to provide additional
20+
configuration options directly on algorithm level, in addition to parameters.
21+
22+
.. versionadded:: 3.2
23+
%End
1424

1525
%TypeHeaderCode
1626
#include "qgsprocessingalgorithmconfigurationwidget.h"
1727
%End
1828
public:
29+
1930
QgsProcessingAlgorithmConfigurationWidget( QWidget *parent = 0 );
31+
%Docstring
32+
Creates a new QgsProcessingAlgorithmConfigurationWidget
33+
%End
2034
virtual ~QgsProcessingAlgorithmConfigurationWidget();
35+
2136
virtual QVariantMap configuration() const = 0;
37+
%Docstring
38+
Read the current configuration from this widget.
39+
%End
40+
2241
virtual void setConfiguration( const QVariantMap &configuration ) = 0;
42+
%Docstring
43+
Set the configuration which this widget should represent.
44+
%End
45+
};
46+
47+
48+
class QgsProcessingAlgorithmConfigurationWidgetFactory
49+
{
50+
%Docstring
51+
Interface base class for factories for algorithm configuration widgets.
52+
53+
.. versionadded:: 3.2
54+
%End
55+
56+
%TypeHeaderCode
57+
#include "qgsprocessingalgorithmconfigurationwidget.h"
58+
%End
59+
public:
60+
virtual ~QgsProcessingAlgorithmConfigurationWidgetFactory();
61+
62+
virtual QgsProcessingAlgorithmConfigurationWidget *create( QgsProcessingAlgorithm *algorithm ) const = 0 /Factory/;
63+
%Docstring
64+
Create a new configuration widget for ``algorithm``.
65+
%End
66+
67+
virtual bool canCreateFor( QgsProcessingAlgorithm *algorithm ) const = 0;
68+
%Docstring
69+
Check if this factory can create widgets for ``algorithm``.
70+
%End
2371
};
2472

73+
2574
/************************************************************************
2675
* This file has been generated automatically from *
2776
* *

python/core/processing/qgsprocessingregistry.sip.in

+23
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,29 @@ Return a list with all known parameter types.
143143
.. versionadded:: 3.2
144144
%End
145145

146+
void addAlgorithmConfigurationWidgetFactory( QgsProcessingAlgorithmConfigurationWidgetFactory *factory /Transfer/ );
147+
%Docstring
148+
Add a new configuration widget factory for customized algorithm configuration
149+
widgets. Ownership is taken.
150+
151+
.. versionadded:: 3.2
152+
%End
153+
154+
void removeAlgorithmConfigurationWidgetFactory( QgsProcessingAlgorithmConfigurationWidgetFactory *factory );
155+
%Docstring
156+
Remove a configuration widget factory for customized algorithm configuration
157+
widgets.
158+
159+
.. versionadded:: 3.2
160+
%End
161+
162+
QgsProcessingAlgorithmConfigurationWidget *algorithmConfigurationWidget( QgsProcessingAlgorithm *algorithm ) const;
163+
%Docstring
164+
algorithmConfigurationWidget
165+
@param algorithm
166+
@return
167+
%End
168+
146169

147170
signals:
148171

python/gui/gui_auto.sip

+1
Original file line numberDiff line numberDiff line change
@@ -312,4 +312,5 @@
312312
%Include layout/qgslayoutviewtoolzoom.sip
313313
%Include locator/qgslocatorwidget.sip
314314
%Include processing/qgsprocessingalgorithmdialogbase.sip
315+
%Include processing/qgsprocessingconfigurationwidgets.sip
315316
%Include qgsadvanceddigitizingcanvasitem.sip
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/************************************************************************
2+
* This file has been generated automatically from *
3+
* *
4+
* src/gui/processing/qgsprocessingconfigurationwidgets.h *
5+
* *
6+
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
7+
************************************************************************/
8+
9+
10+
11+
12+
13+
14+
class QgsProcessingConfigurationWidgets
15+
{
16+
%Docstring
17+
This class is responsible for the management of processing widgets which
18+
QGIS internally.
19+
20+
Standalone applications that require to show configuration widgets for processing
21+
algorithms will need to execute the following code to have the configuration
22+
interfaces available.
23+
24+
.. code-block:: python
25+
26+
# At startup time
27+
QgsApplicationProcessingConfigurationWidgets.initialize()
28+
29+
# At exit time
30+
QgsApplicationProcessingConfigurationWidgets.cleanup()
31+
%End
32+
33+
%TypeHeaderCode
34+
#include "qgsprocessingconfigurationwidgets.h"
35+
%End
36+
public:
37+
38+
static void initialize();
39+
%Docstring
40+
Initialize native configuration widgets.
41+
%End
42+
43+
static void cleanup();
44+
%Docstring
45+
Cleanup native configuration widgets.
46+
%End
47+
48+
private:
49+
QgsProcessingConfigurationWidgets();
50+
};
51+
52+
53+
54+
55+
/************************************************************************
56+
* This file has been generated automatically from *
57+
* *
58+
* src/gui/processing/qgsprocessingconfigurationwidgets.h *
59+
* *
60+
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
61+
************************************************************************/

python/plugins/processing/modeler/ModelerParametersDialog.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
QHBoxLayout, QWidget)
3737

3838
from qgis.core import (Qgis,
39+
QgsApplication,
3940
QgsProcessingParameterDefinition,
4041
QgsProcessingParameterPoint,
4142
QgsProcessingParameterExtent,
@@ -118,7 +119,7 @@ def setupUi(self):
118119
line.setFrameShape(QFrame.HLine)
119120
line.setFrameShadow(QFrame.Sunken)
120121
self.verticalLayout.addWidget(line)
121-
self.algorithmItem = self._alg.createModelerWidget()
122+
self.algorithmItem = QgsApplication.instance().processingRegistry().algorithmConfigurationWidget(self._alg)
122123
if self.configuration:
123124
self.algorithmItem.setConfiguration(self.configuration)
124125
self.verticalLayout.addWidget(self.algorithmItem)
@@ -330,6 +331,7 @@ def createAlgorithm(self):
330331
output.setChildId(alg.childId())
331332
output.setChildOutputName(dest.name())
332333
outputs[name] = output
334+
333335
alg.setModelOutputs(outputs)
334336

335337
selectedOptions = self.dependenciesPanel.selectedoptions

src/analysis/CMakeLists.txt

-1
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,6 @@ SET(QGIS_ANALYSIS_MOC_HDRS
140140
network/qgsvectorlayerdirector.h
141141

142142
processing/qgsalgorithmfiledownloader.h
143-
processing/qgsalgorithmfilter.h
144143

145144
vector/geometry_checker/qgsfeaturepool.h
146145
vector/geometry_checker/qgsgeometrychecker.h

src/analysis/processing/qgsalgorithmfilter.cpp

-115
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,6 @@
1818
#include "qgsalgorithmfilter.h"
1919
#include "qgsapplication.h"
2020

21-
#include <QLabel>
22-
#include <QGridLayout>
23-
#include <QTableWidget>
24-
#include <QHeaderView>
25-
#include <QToolButton>
26-
2721
///@cond PRIVATE
2822

2923
QString QgsFilterAlgorithm::name() const
@@ -66,11 +60,6 @@ QgsFilterAlgorithm *QgsFilterAlgorithm::createInstance() const
6660
return new QgsFilterAlgorithm();
6761
}
6862

69-
QgsProcessingAlgorithmConfigurationWidget *QgsFilterAlgorithm::createModelerWidget() const
70-
{
71-
return new QgsFilterAlgorithmConfigurationWidget();
72-
}
73-
7463
QgsFilterAlgorithm::~QgsFilterAlgorithm()
7564
{
7665
qDeleteAll( mOutputs );
@@ -93,60 +82,6 @@ void QgsFilterAlgorithm::initAlgorithm( const QVariantMap &configuration )
9382
}
9483

9584

96-
QgsFilterAlgorithmConfigurationWidget::QgsFilterAlgorithmConfigurationWidget( QWidget *parent )
97-
: QgsProcessingAlgorithmConfigurationWidget( parent )
98-
{
99-
setContentsMargins( 0, 0, 0, 0 );
100-
101-
mOutputExpressionWidget = new QTableWidget();
102-
mOutputExpressionWidget->setColumnCount( 2 );
103-
mOutputExpressionWidget->setHorizontalHeaderItem( 0, new QTableWidgetItem( tr( "Output Name" ) ) );
104-
mOutputExpressionWidget->setHorizontalHeaderItem( 1, new QTableWidgetItem( tr( "Filter Expression" ) ) );
105-
mOutputExpressionWidget->horizontalHeader()->setStretchLastSection( true );
106-
QGridLayout *layout = new QGridLayout();
107-
setLayout( layout );
108-
109-
layout->addWidget( new QLabel( tr( "Outputs and filters" ) ), 0, 0, 1, 2 );
110-
layout->addWidget( mOutputExpressionWidget, 1, 0, 4, 1 );
111-
QToolButton *addOutputButton = new QToolButton();
112-
addOutputButton->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/mActionAddLayer.svg" ) ) );
113-
addOutputButton->setText( tr( "Add Output" ) );
114-
115-
QToolButton *removeOutputButton = new QToolButton();
116-
removeOutputButton->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/mActionRemoveLayer.svg" ) ) );
117-
removeOutputButton->setToolTip( tr( "Remove Selected Outputs" ) );
118-
119-
layout->addWidget( addOutputButton, 2, 1, 1, 1 );
120-
layout->addWidget( removeOutputButton, 3, 1, 1, 1 );
121-
122-
connect( addOutputButton, &QToolButton::clicked, this, &QgsFilterAlgorithmConfigurationWidget::addOutput );
123-
connect( removeOutputButton, &QToolButton::clicked, this, &QgsFilterAlgorithmConfigurationWidget::removeSelectedOutputs );
124-
125-
connect( mOutputExpressionWidget->selectionModel(), &QItemSelectionModel::selectionChanged, [removeOutputButton, this]
126-
{
127-
removeOutputButton->setEnabled( !mOutputExpressionWidget->selectionModel()->selectedIndexes().isEmpty() );
128-
} );
129-
}
130-
131-
QVariantMap QgsFilterAlgorithmConfigurationWidget::configuration() const
132-
{
133-
QVariantList outputs;
134-
135-
for ( int i = 0; i < mOutputExpressionWidget->rowCount(); ++i )
136-
{
137-
QVariantMap output;
138-
output.insert( QStringLiteral( "name" ), mOutputExpressionWidget->item( i, 0 )->text() );
139-
output.insert( QStringLiteral( "expression" ), mOutputExpressionWidget->item( i, 1 )->text() );
140-
outputs.append( output );
141-
}
142-
143-
QVariantMap map;
144-
map.insert( "outputs", outputs );
145-
146-
return map;
147-
}
148-
149-
15085
QVariantMap QgsFilterAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
15186
{
15287
std::unique_ptr< QgsFeatureSource > source( parameterAsSource( parameters, QStringLiteral( "INPUT" ), context ) );
@@ -195,53 +130,3 @@ QVariantMap QgsFilterAlgorithm::processAlgorithm( const QVariantMap &parameters,
195130
return outputs;
196131
}
197132

198-
199-
void QgsFilterAlgorithmConfigurationWidget::setConfiguration( const QVariantMap &configuration )
200-
{
201-
mOutputExpressionWidget->setRowCount( 0 );
202-
int currentRow = 0;
203-
const QVariantList outputs = configuration.value( "outputs" ).toList();
204-
205-
for ( const QVariant &outputvar : outputs )
206-
{
207-
const QVariantMap output = outputvar.toMap();
208-
mOutputExpressionWidget->insertRow( currentRow );
209-
mOutputExpressionWidget->setItem( currentRow, 0, new QTableWidgetItem( output.value( "name" ).toString() ) );
210-
mOutputExpressionWidget->setItem( currentRow, 1, new QTableWidgetItem( output.value( "expression" ).toString() ) );
211-
212-
currentRow++;
213-
}
214-
215-
if ( outputs.isEmpty() )
216-
addOutput();
217-
}
218-
219-
void QgsFilterAlgorithmConfigurationWidget::removeSelectedOutputs()
220-
{
221-
QItemSelection selection( mOutputExpressionWidget->selectionModel()->selection() );
222-
223-
QList<int> rows;
224-
const QModelIndexList indexes = selection.indexes();
225-
for ( const QModelIndex &index : indexes )
226-
{
227-
rows.append( index.row() );
228-
}
229-
230-
qSort( rows );
231-
232-
int prev = -1;
233-
for ( int i = rows.count() - 1; i >= 0; i -= 1 )
234-
{
235-
int current = rows[i];
236-
if ( current != prev )
237-
{
238-
mOutputExpressionWidget->removeRow( current );
239-
prev = current;
240-
}
241-
}
242-
}
243-
244-
void QgsFilterAlgorithmConfigurationWidget::addOutput()
245-
{
246-
mOutputExpressionWidget->setRowCount( mOutputExpressionWidget->rowCount() + 1 );
247-
}

0 commit comments

Comments
 (0)