49#include "moc_qgsprocessingguiregistry.cpp"
51using namespace Qt::StringLiterals;
135 mModelConfigWidgetFactory = std::make_unique< QgsProcessingGuiInternalModelConfigWidgetFactory >();
141 for (
auto it = mProviderToolboxActions.constBegin(); it != mProviderToolboxActions.constEnd(); ++it )
143 qDeleteAll( it.value() );
145 mProviderToolboxActions.clear();
147 for (
auto it = mProviderToolboxContextActions.constBegin(); it != mProviderToolboxContextActions.constEnd(); ++it )
149 qDeleteAll( it.value() );
151 mProviderToolboxContextActions.clear();
153 const QList<QgsProcessingAlgorithmConfigurationWidgetFactory *> factories = mAlgorithmConfigurationWidgetFactories;
156 const QMap<QString, QgsProcessingParameterWidgetFactoryInterface *> paramFactories = mParameterWidgetFactories;
157 for (
auto it = paramFactories.constBegin(); it != paramFactories.constEnd(); ++it )
161 mModelConfigWidgetFactory.reset();
166 mAlgorithmConfigurationWidgetFactories.append( factory );
171 mAlgorithmConfigurationWidgetFactories.removeAll( factory );
177 for (
const auto *factory : mAlgorithmConfigurationWidgetFactories )
179 if ( factory->canCreateFor(
algorithm ) )
181 std::unique_ptr<QgsProcessingAlgorithmConfigurationWidget> widget( factory->create(
algorithm ) );
184 return widget.release();
196 if ( mParameterWidgetFactories.contains( factory->
parameterType() ) )
202 mParameterWidgetFactories.insert( factory->
parameterType(), factory );
211 mParameterWidgetFactories.remove( factory->
parameterType() );
217 mModelConfigWidgetFactories << factory;
222 mModelConfigWidgetFactories.removeAll( factory );
230 const QVariantMap metadata = parameter->
metadata();
231 const QString widgetType = metadata.value( u
"widget_wrapper"_s ).toMap().value( u
"widget_type"_s ).toString();
232 const QString parameterType = !widgetType.isEmpty() ? widgetType : parameter->
type();
233 if ( !mParameterWidgetFactories.contains( parameterType ) )
238 return factory->createWidgetWrapper( parameter, type );
250 const QString parameterType = parameter->
type();
251 auto it = mParameterWidgetFactories.constFind( parameterType );
252 if ( it == mParameterWidgetFactories.constEnd() )
255 return it.value()->createModelerWidgetWrapper( model, childId, parameter, context );
262 auto it = mParameterWidgetFactories.constFind( type );
263 if ( it == mParameterWidgetFactories.constEnd() )
266 return it.value()->createParameterDefinitionWidget( context, widgetContext, definition,
algorithm );
273 for (
auto it = mModelConfigWidgetFactories.constBegin(); it != mModelConfigWidgetFactories.constEnd(); ++it )
279 if ( it->data()->supportsComponent( component ) )
290 mWidgetContextGenerator = generator;
295 if ( mWidgetContextGenerator )
297 return mWidgetContextGenerator->createWidgetContext();
304 mProviderToolboxActions[providerId].append( action );
309 QList< QgsProcessingToolboxAction * > actions = mProviderToolboxActions.take( providerId );
310 qDeleteAll( actions );
315 return mProviderToolboxActions.value( providerId );
320 mProviderToolboxContextActions[providerId].append( action );
325 QList< QgsProcessingToolboxContextAction * > actions = mProviderToolboxContextActions.take( providerId );
326 qDeleteAll( actions );
331 for (
auto it = mProviderToolboxContextActions.begin(); it != mProviderToolboxContextActions.end(); ++it )
333 if ( it.value().contains( action ) )
335 QList< QgsProcessingToolboxContextAction * > actions = it.value();
336 actions.removeAll( action );
337 mProviderToolboxContextActions.insert( it.key(), actions );
345 QList<QgsProcessingToolboxContextAction *> res;
346 for (
auto it = mProviderToolboxContextActions.constBegin(); it != mProviderToolboxContextActions.constEnd(); ++it )
348 res.append( it.value() );
355 mProcessingDialogFactory.reset( factory );
360 return mProcessingDialogFactory.get();
365 mContextFactory.reset( factory );
370 return mContextFactory.get();
375 return mProviderToolboxContextActions.value( providerId );
379bool QgsProcessingGuiInternalModelConfigWidgetFactory::supportsComponent( QgsProcessingModelComponent *component )
const
381 if (
dynamic_cast< QgsProcessingModelGroupBox *
>( component ) )
384 if (
dynamic_cast< QgsProcessingModelChildAlgorithm *
>( component ) )
387 if (
dynamic_cast< QgsProcessingModelParameter *
>( component ) )
390 if (
dynamic_cast< QgsProcessingModelOutput *
>( component ) )
400 if ( QgsProcessingModelGroupBox *groupBox =
dynamic_cast< QgsProcessingModelGroupBox *
>( component ) )
403 const QString boxUuid = groupBox->uuid();
407 QgsModelGraphicsScene *modelScene = dialog->modelScene();
408 QgsModelGroupBoxGraphicItem *graphicItem =
dynamic_cast< QgsModelGroupBoxGraphicItem *
>( modelScene->groupBoxItem( boxUuid ) );
412 graphicItem->applyEdit( widget->groupBox() );
417 else if ( QgsProcessingModelChildAlgorithm *childAlg =
dynamic_cast< QgsProcessingModelChildAlgorithm *
>( component ) )
420 const QString childId = childAlg->childId();
422 std::unique_ptr< QgsProcessingAlgorithm >
algorithm( childAlg->algorithm()->create() );
424 widget->setComments( childAlg->comment()->description() );
425 widget->setCommentColor( childAlg->comment()->color() );
429 widget->setWidgetContext( widgetContextCopy );
432 QgsModelGraphicsScene *modelScene = dialog->modelScene();
433 QgsModelChildAlgorithmGraphicItem *graphicItem = modelScene->childAlgorithmItem( childId );
437 std::unique_ptr< QgsProcessingModelChildAlgorithm > updatedAlgorithm = widget->createAlgorithm();
438 if ( updatedAlgorithm )
440 graphicItem->applyEdit( *updatedAlgorithm );
446 else if ( QgsProcessingModelParameter *modelParam =
dynamic_cast< QgsProcessingModelParameter *
>( component ) )
449 QgsProcessingModelAlgorithm *model = widgetContext.
model();
451 const QString componentName = modelParam->parameterName();
453 if ( !existingParam )
456 const QString comment = modelParam->comment()->
description();
457 const QColor commentColor = modelParam->comment()->color();
458 const QString oldName = existingParam->
name();
459 const QString oldDescription = existingParam->
description();
462 widget->setComments( comment );
463 widget->setCommentColor( commentColor );
469 auto existingParamName = std::make_shared< QString >( existingParam->
name() );
472 QgsModelGraphicsScene *modelScene = dialog->modelScene();
476 QgsModelParameterGraphicItem *graphicItem =
dynamic_cast< QgsModelParameterGraphicItem *
>( modelScene->parameterItem( componentName ) );
480 std::unique_ptr< QgsProcessingParameterDefinition > newParam( widget->createParameter( *existingParamName ) );
484 const QString comment = widget->comments();
485 const QColor commentColor = widget->commentColor();
486 *existingParamName = graphicItem->applyEdit( std::move( newParam ), oldDescription, oldName, comment, commentColor );
491 else if ( QgsProcessingModelOutput *modelOutput =
dynamic_cast< QgsProcessingModelOutput *
>( component ) )
494 QgsProcessingModelAlgorithm *model = widgetContext.
model();
496 const QString childId = modelOutput->childId();
497 const QString childOutputName = modelOutput->childOutputName();
500 if ( !existingParam )
503 const QString comment = modelOutput->comment()->
description();
504 const QColor commentColor = modelOutput->comment()->color();
507 widget->setComments( comment );
508 widget->setCommentColor( commentColor );
515 QgsModelGraphicsScene *modelScene = dialog->modelScene();
519 QgsModelOutputGraphicItem *graphicItem =
dynamic_cast< QgsModelOutputGraphicItem *
>( modelScene->outputItem( childId, childOutputName ) );
523 std::unique_ptr< QgsProcessingParameterDefinition > newParam( widget->createParameter() );
528 ->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