48#include "moc_qgsprocessingguiregistry.cpp"
50using namespace Qt::StringLiterals;
117 mModelConfigWidgetFactory = std::make_unique< QgsProcessingGuiInternalModelConfigWidgetFactory >();
123 const QList<QgsProcessingAlgorithmConfigurationWidgetFactory *> factories = mAlgorithmConfigurationWidgetFactories;
126 const QMap<QString, QgsProcessingParameterWidgetFactoryInterface *> paramFactories = mParameterWidgetFactories;
127 for (
auto it = paramFactories.constBegin(); it != paramFactories.constEnd(); ++it )
131 mModelConfigWidgetFactory.reset();
136 mAlgorithmConfigurationWidgetFactories.append( factory );
141 mAlgorithmConfigurationWidgetFactories.removeAll( factory );
147 for (
const auto *factory : mAlgorithmConfigurationWidgetFactories )
149 if ( factory->canCreateFor(
algorithm ) )
151 std::unique_ptr<QgsProcessingAlgorithmConfigurationWidget> widget( factory->create(
algorithm ) );
154 return widget.release();
166 if ( mParameterWidgetFactories.contains( factory->
parameterType() ) )
172 mParameterWidgetFactories.insert( factory->
parameterType(), factory );
181 mParameterWidgetFactories.remove( factory->
parameterType() );
187 mModelConfigWidgetFactories << factory;
192 mModelConfigWidgetFactories.removeAll( factory );
200 const QVariantMap metadata = parameter->
metadata();
201 const QString widgetType = metadata.value( u
"widget_wrapper"_s ).toMap().value( u
"widget_type"_s ).toString();
202 const QString parameterType = !widgetType.isEmpty() ? widgetType : parameter->
type();
203 if ( !mParameterWidgetFactories.contains( parameterType ) )
208 return factory->createWidgetWrapper( parameter, type );
220 const QString parameterType = parameter->
type();
221 auto it = mParameterWidgetFactories.constFind( parameterType );
222 if ( it == mParameterWidgetFactories.constEnd() )
225 return it.value()->createModelerWidgetWrapper( model, childId, parameter, context );
232 auto it = mParameterWidgetFactories.constFind( type );
233 if ( it == mParameterWidgetFactories.constEnd() )
236 return it.value()->createParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
243 for (
auto it = mModelConfigWidgetFactories.constBegin(); it != mModelConfigWidgetFactories.constEnd(); ++it )
249 if ( it->data()->supportsComponent( component ) )
260 mWidgetContextGenerator = generator;
265 if ( mWidgetContextGenerator )
267 return mWidgetContextGenerator->createWidgetContext();
273bool QgsProcessingGuiInternalModelConfigWidgetFactory::supportsComponent( QgsProcessingModelComponent *component )
const
275 if (
dynamic_cast< QgsProcessingModelGroupBox *
>( component ) )
278 if (
dynamic_cast< QgsProcessingModelChildAlgorithm *
>( component ) )
281 if (
dynamic_cast< QgsProcessingModelParameter *
>( component ) )
284 if (
dynamic_cast< QgsProcessingModelOutput *
>( component ) )
294 if ( QgsProcessingModelGroupBox *groupBox =
dynamic_cast< QgsProcessingModelGroupBox *
>( component ) )
297 const QString boxUuid = groupBox->uuid();
301 QgsModelGraphicsScene *modelScene = dialog->modelScene();
302 QgsModelGroupBoxGraphicItem *graphicItem =
dynamic_cast< QgsModelGroupBoxGraphicItem *
>( modelScene->groupBoxItem( boxUuid ) );
306 graphicItem->applyEdit( widget->groupBox() );
311 else if ( QgsProcessingModelChildAlgorithm *childAlg =
dynamic_cast< QgsProcessingModelChildAlgorithm *
>( component ) )
314 const QString childId = childAlg->childId();
316 std::unique_ptr< QgsProcessingAlgorithm >
algorithm( childAlg->algorithm()->create() );
318 widget->setComments( childAlg->comment()->description() );
319 widget->setCommentColor( childAlg->comment()->color() );
323 widget->setWidgetContext( widgetContextCopy );
326 QgsModelGraphicsScene *modelScene = dialog->modelScene();
327 QgsModelChildAlgorithmGraphicItem *graphicItem = modelScene->childAlgorithmItem( childId );
331 std::unique_ptr< QgsProcessingModelChildAlgorithm > updatedAlgorithm = widget->createAlgorithm();
332 if ( updatedAlgorithm )
334 graphicItem->applyEdit( *updatedAlgorithm );
340 else if ( QgsProcessingModelParameter *modelParam =
dynamic_cast< QgsProcessingModelParameter *
>( component ) )
343 QgsProcessingModelAlgorithm *model = widgetContext.
model();
345 const QString componentName = modelParam->parameterName();
347 if ( !existingParam )
350 const QString comment = modelParam->comment()->
description();
351 const QColor commentColor = modelParam->comment()->color();
352 const QString oldName = existingParam->
name();
353 const QString oldDescription = existingParam->
description();
356 widget->setComments( comment );
357 widget->setCommentColor( commentColor );
363 auto existingParamName = std::make_shared< QString >( existingParam->
name() );
366 QgsModelGraphicsScene *modelScene = dialog->modelScene();
370 QgsModelParameterGraphicItem *graphicItem =
dynamic_cast< QgsModelParameterGraphicItem *
>( modelScene->parameterItem( componentName ) );
374 std::unique_ptr< QgsProcessingParameterDefinition > newParam( widget->createParameter( *existingParamName ) );
378 const QString comment = widget->comments();
379 const QColor commentColor = widget->commentColor();
380 *existingParamName = graphicItem->applyEdit( std::move( newParam ), oldDescription, oldName, comment, commentColor );
385 else if ( QgsProcessingModelOutput *modelOutput =
dynamic_cast< QgsProcessingModelOutput *
>( component ) )
388 QgsProcessingModelAlgorithm *model = widgetContext.
model();
390 const QString childId = modelOutput->childId();
391 const QString childOutputName = modelOutput->childOutputName();
394 if ( !existingParam )
397 const QString comment = modelOutput->comment()->
description();
398 const QColor commentColor = modelOutput->comment()->color();
401 widget->setComments( comment );
402 widget->setCommentColor( commentColor );
409 QgsModelGraphicsScene *modelScene = dialog->modelScene();
413 QgsModelOutputGraphicItem *graphicItem =
dynamic_cast< QgsModelOutputGraphicItem *
>( modelScene->outputItem( childId, childOutputName ) );
417 std::unique_ptr< QgsProcessingParameterDefinition > newParam( widget->createParameter() );
422 ->applyEdit( newParam->description(), newParam->description(), newParam->defaultValue(), !newParam->flags().testFlag(
Qgis::ProcessingParameterFlag::Optional ), widget->comments(), widget->commentColor() );
ProcessingMode
Types of modes which Processing widgets can be created for.
@ Optional
Parameter is optional.
static void warning(const QString &msg)
Goes to qWarning.
Abstract base class for processing algorithms.
Contains information about the context in which a processing algorithm is executed.
~QgsProcessingGuiRegistry() override
void addAlgorithmConfigurationWidgetFactory(QgsProcessingAlgorithmConfigurationWidgetFactory *factory)
Add a new configuration widget factory for customized algorithm configuration widgets.
bool addParameterWidgetFactory(QgsProcessingParameterWidgetFactoryInterface *factory)
Adds a parameter widget factory to the registry, allowing widget creation for parameters of the match...
QgsProcessingGuiRegistry()
Constructor.
void removeAlgorithmConfigurationWidgetFactory(QgsProcessingAlgorithmConfigurationWidgetFactory *factory)
Remove a configuration widget factory for customized algorithm configuration widgets.
void registerModelConfigWidgetFactory(QgsProcessingModelConfigWidgetFactory *factory)
Register a new factory class for creating panel widgets that can be shown in the Processing model des...
void unregisterModelConfigWidgetFactory(QgsProcessingModelConfigWidgetFactory *factory)
Unregister a previously registered factory for creating panel widgets that can be shown in the Proces...
QgsProcessingAlgorithmConfigurationWidget * algorithmConfigurationWidget(const QgsProcessingAlgorithm *algorithm) const
Gets the configuration widget for an algorithm.
QgsAbstractProcessingParameterWidgetWrapper * createParameterWidgetWrapper(const QgsProcessingParameterDefinition *parameter, Qgis::ProcessingMode type)
Creates a new parameter widget wrapper for the given parameter.
void registerWidgetContextGenerator(QgsProcessingWidgetContextGenerator *generator)
Register a Processing widget context generator class that will be used to retrieve a widget context w...
QgsProcessingAbstractParameterDefinitionWidget * createParameterDefinitionWidget(const QString &type, QgsProcessingContext &context, const QgsProcessingParameterWidgetContext &widgetContext, const QgsProcessingParameterDefinition *definition=nullptr, const QgsProcessingAlgorithm *algorithm=nullptr)
Creates a new parameter definition widget allowing for configuration of an instance of a specific par...
QgsProcessingModelerParameterWidget * createModelerParameterWidget(QgsProcessingModelAlgorithm *model, const QString &childId, const QgsProcessingParameterDefinition *parameter, QgsProcessingContext &context)
Creates a new modeler parameter widget for the given parameter.
void removeParameterWidgetFactory(QgsProcessingParameterWidgetFactoryInterface *factory)
Removes a parameter widget factory from the registry.
QgsProcessingModelConfigWidget * createModelConfigWidgetForComponent(QgsProcessingModelComponent *component, QgsProcessingContext &context, const QgsProcessingParameterWidgetContext &widgetContext) const
Creates a new widget for configuring a Processing model component.
QgsProcessingParameterWidgetContext createWidgetContext() override
Register a Processing widget context.
Base class for the definition of processing parameters.
QVariantMap metadata() const
Returns the parameter's freeform metadata.
QString description() const
Returns the description for the parameter.
virtual QString type() const =0
Unique parameter type name.
QString name() const
Returns the name of the parameter.
Contains settings which reflect the context in which a Processing parameter widget is shown.
QgsModelDesignerDialog * modelDesignerDialog() const
Returns the associated model designer dialog, if applicable.
void setModelChildAlgorithmId(const QString &id)
Sets the child algorithm id within the model which the parameter widget is associated with.
QgsProcessingModelAlgorithm * model() const
Returns the model which the parameter widget is associated with.
QgsProcessingContextGenerator * processingContextGenerator() const
Returns the Processing context generator class that will be used to retrieve a Processing context for...
An interface for objects which can create Processing widget contexts.
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