49#include "moc_qgsprocessingguiregistry.cpp"
51using namespace Qt::StringLiterals;
134 mModelConfigWidgetFactory = std::make_unique< QgsProcessingGuiInternalModelConfigWidgetFactory >();
140 for (
auto it = mProviderToolboxActions.constBegin(); it != mProviderToolboxActions.constEnd(); ++it )
142 qDeleteAll( it.value() );
144 mProviderToolboxActions.clear();
146 for (
auto it = mProviderToolboxContextActions.constBegin(); it != mProviderToolboxContextActions.constEnd(); ++it )
148 qDeleteAll( it.value() );
150 mProviderToolboxContextActions.clear();
152 const QList<QgsProcessingAlgorithmConfigurationWidgetFactory *> factories = mAlgorithmConfigurationWidgetFactories;
155 const QMap<QString, QgsProcessingParameterWidgetFactoryInterface *> paramFactories = mParameterWidgetFactories;
156 for (
auto it = paramFactories.constBegin(); it != paramFactories.constEnd(); ++it )
160 mModelConfigWidgetFactory.reset();
165 mAlgorithmConfigurationWidgetFactories.append( factory );
170 mAlgorithmConfigurationWidgetFactories.removeAll( factory );
176 for (
const auto *factory : mAlgorithmConfigurationWidgetFactories )
178 if ( factory->canCreateFor(
algorithm ) )
180 std::unique_ptr<QgsProcessingAlgorithmConfigurationWidget> widget( factory->create(
algorithm ) );
183 return widget.release();
195 if ( mParameterWidgetFactories.contains( factory->
parameterType() ) )
201 mParameterWidgetFactories.insert( factory->
parameterType(), factory );
210 mParameterWidgetFactories.remove( factory->
parameterType() );
216 mModelConfigWidgetFactories << factory;
221 mModelConfigWidgetFactories.removeAll( factory );
229 const QVariantMap metadata = parameter->
metadata();
230 const QString widgetType = metadata.value( u
"widget_wrapper"_s ).toMap().value( u
"widget_type"_s ).toString();
231 const QString parameterType = !widgetType.isEmpty() ? widgetType : parameter->
type();
232 if ( !mParameterWidgetFactories.contains( parameterType ) )
237 return factory->createWidgetWrapper( parameter, type );
249 const QString parameterType = parameter->
type();
250 auto it = mParameterWidgetFactories.constFind( parameterType );
251 if ( it == mParameterWidgetFactories.constEnd() )
254 return it.value()->createModelerWidgetWrapper( model, childId, parameter, context );
261 auto it = mParameterWidgetFactories.constFind( type );
262 if ( it == mParameterWidgetFactories.constEnd() )
265 return it.value()->createParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
272 for (
auto it = mModelConfigWidgetFactories.constBegin(); it != mModelConfigWidgetFactories.constEnd(); ++it )
278 if ( it->data()->supportsComponent( component ) )
289 mWidgetContextGenerator = generator;
294 if ( mWidgetContextGenerator )
296 return mWidgetContextGenerator->createWidgetContext();
303 mProviderToolboxActions[providerId].append( action );
308 QList< QgsProcessingToolboxAction * > actions = mProviderToolboxActions.take( providerId );
309 qDeleteAll( actions );
314 return mProviderToolboxActions.value( providerId );
319 mProviderToolboxContextActions[providerId].append( action );
324 QList< QgsProcessingToolboxContextAction * > actions = mProviderToolboxContextActions.take( providerId );
325 qDeleteAll( actions );
330 for (
auto it = mProviderToolboxContextActions.begin(); it != mProviderToolboxContextActions.end(); ++it )
332 if ( it.value().contains( action ) )
334 QList< QgsProcessingToolboxContextAction * > actions = it.value();
335 actions.removeAll( action );
336 mProviderToolboxContextActions.insert( it.key(), actions );
344 QList<QgsProcessingToolboxContextAction *> res;
345 for (
auto it = mProviderToolboxContextActions.constBegin(); it != mProviderToolboxContextActions.constEnd(); ++it )
347 res.append( it.value() );
354 mProcessingDialogFactory.reset( factory );
359 return mProcessingDialogFactory.get();
364 mContextFactory.reset( factory );
369 return mContextFactory.get();
374 return mProviderToolboxContextActions.value( providerId );
378bool QgsProcessingGuiInternalModelConfigWidgetFactory::supportsComponent( QgsProcessingModelComponent *component )
const
380 if (
dynamic_cast< QgsProcessingModelGroupBox *
>( component ) )
383 if (
dynamic_cast< QgsProcessingModelChildAlgorithm *
>( component ) )
386 if (
dynamic_cast< QgsProcessingModelParameter *
>( component ) )
389 if (
dynamic_cast< QgsProcessingModelOutput *
>( component ) )
399 if ( QgsProcessingModelGroupBox *groupBox =
dynamic_cast< QgsProcessingModelGroupBox *
>( component ) )
402 const QString boxUuid = groupBox->uuid();
406 QgsModelGraphicsScene *modelScene = dialog->modelScene();
407 QgsModelGroupBoxGraphicItem *graphicItem =
dynamic_cast< QgsModelGroupBoxGraphicItem *
>( modelScene->groupBoxItem( boxUuid ) );
411 graphicItem->applyEdit( widget->groupBox() );
416 else if ( QgsProcessingModelChildAlgorithm *childAlg =
dynamic_cast< QgsProcessingModelChildAlgorithm *
>( component ) )
419 const QString childId = childAlg->childId();
421 std::unique_ptr< QgsProcessingAlgorithm >
algorithm( childAlg->algorithm()->create() );
423 widget->setComments( childAlg->comment()->description() );
424 widget->setCommentColor( childAlg->comment()->color() );
428 widget->setWidgetContext( widgetContextCopy );
431 QgsModelGraphicsScene *modelScene = dialog->modelScene();
432 QgsModelChildAlgorithmGraphicItem *graphicItem = modelScene->childAlgorithmItem( childId );
436 std::unique_ptr< QgsProcessingModelChildAlgorithm > updatedAlgorithm = widget->createAlgorithm();
437 if ( updatedAlgorithm )
439 graphicItem->applyEdit( *updatedAlgorithm );
445 else if ( QgsProcessingModelParameter *modelParam =
dynamic_cast< QgsProcessingModelParameter *
>( component ) )
448 QgsProcessingModelAlgorithm *model = widgetContext.
model();
450 const QString componentName = modelParam->parameterName();
452 if ( !existingParam )
455 const QString comment = modelParam->comment()->
description();
456 const QColor commentColor = modelParam->comment()->color();
457 const QString oldName = existingParam->
name();
458 const QString oldDescription = existingParam->
description();
461 widget->setComments( comment );
462 widget->setCommentColor( commentColor );
468 auto existingParamName = std::make_shared< QString >( existingParam->
name() );
471 QgsModelGraphicsScene *modelScene = dialog->modelScene();
475 QgsModelParameterGraphicItem *graphicItem =
dynamic_cast< QgsModelParameterGraphicItem *
>( modelScene->parameterItem( componentName ) );
479 std::unique_ptr< QgsProcessingParameterDefinition > newParam( widget->createParameter( *existingParamName ) );
483 const QString comment = widget->comments();
484 const QColor commentColor = widget->commentColor();
485 *existingParamName = graphicItem->applyEdit( std::move( newParam ), oldDescription, oldName, comment, commentColor );
490 else if ( QgsProcessingModelOutput *modelOutput =
dynamic_cast< QgsProcessingModelOutput *
>( component ) )
493 QgsProcessingModelAlgorithm *model = widgetContext.
model();
495 const QString childId = modelOutput->childId();
496 const QString childOutputName = modelOutput->childOutputName();
499 if ( !existingParam )
502 const QString comment = modelOutput->comment()->
description();
503 const QColor commentColor = modelOutput->comment()->color();
506 widget->setComments( comment );
507 widget->setCommentColor( commentColor );
514 QgsModelGraphicsScene *modelScene = dialog->modelScene();
518 QgsModelOutputGraphicItem *graphicItem =
dynamic_cast< QgsModelOutputGraphicItem *
>( modelScene->outputItem( childId, childOutputName ) );
522 std::unique_ptr< QgsProcessingParameterDefinition > newParam( widget->createParameter() );
527 ->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.
A factory for creating Processing contexts, aware of the GUI components which may influence this.
virtual ~QgsProcessingContextFactory()
Contains information about the context in which a processing algorithm is executed.
A factory for creating widgets and dialogs for Processing components.
virtual ~QgsProcessingDialogFactory()
~QgsProcessingGuiRegistry() override
QgsProcessingDialogFactory * dialogFactory()
Returns the application's processing dialog factory, if set.
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...
void deregisterProviderToolboxContextActions(const QString &providerId)
Deregisters all toolbox context menu actions for a provider.
QgsProcessingGuiRegistry()
Constructor.
QList< QgsProcessingToolboxContextAction * > toolboxContextActions() const
Returns a list of all toolbox context menu actions registered.
void removeAlgorithmConfigurationWidgetFactory(QgsProcessingAlgorithmConfigurationWidgetFactory *factory)
Remove a configuration widget factory for customized algorithm configuration widgets.
void registerProviderToolboxAction(const QString &providerId, QgsProcessingToolboxAction *action)
Registers a toolbox action for a provider.
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.
QList< QgsProcessingToolboxContextAction * > toolboxContextActionsForProvider(const QString &providerId) const
Returns a list of all toolbox context menu actions registered for a provider.
void deregisterProviderToolboxActions(const QString &providerId)
Deregisters all toolbox actions for a provider.
QgsAbstractProcessingParameterWidgetWrapper * createParameterWidgetWrapper(const QgsProcessingParameterDefinition *parameter, Qgis::ProcessingMode type)
Creates a new parameter widget wrapper for the given parameter.
Q_DECL_DEPRECATED void deregisterProviderToolboxContextAction(QgsProcessingToolboxContextAction *action)
Deregisters a context menu action.
void registerWidgetContextGenerator(QgsProcessingWidgetContextGenerator *generator)
Register a Processing widget context generator class that will be used to retrieve a widget context w...
void setDialogFactory(QgsProcessingDialogFactory *factory)
Sets the application's processing dialog factory.
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 setContextFactory(QgsProcessingContextFactory *factory)
Sets the application's Processing context factory.
void removeParameterWidgetFactory(QgsProcessingParameterWidgetFactoryInterface *factory)
Removes a parameter widget factory from the registry.
void registerProviderToolboxContextAction(const QString &providerId, QgsProcessingToolboxContextAction *action)
Registers a toolbox context menu action for a provider.
QgsProcessingContextFactory * contextFactory()
Returns the application's Processing context factory, if set.
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.
QList< QgsProcessingToolboxAction * > toolboxActionsForProvider(const QString &providerId) const
Returns a list of all toolbox actions registered for a provider.
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...
A custom action to show in the context menu for the Processing toolbox.
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