QGIS API Documentation 3.99.0-Master (26c88405ac0)
Loading...
Searching...
No Matches
qgsprocessingtoolboxmodel.h
Go to the documentation of this file.
1/***************************************************************************
2 qgsprocessingtoolboxmodel.h
3 ---------------------------
4 begin : May 2018
5 copyright : (C) 2018 by Nyall Dawson
6 email : nyall dot dawson at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
16#ifndef QGSPROCESSINGTOOLBOXMODEL_H
17#define QGSPROCESSINGTOOLBOXMODEL_H
18
19#include "qgis.h"
20#include "qgis_gui.h"
22
23#include <QAbstractItemModel>
24#include <QPointer>
25#include <QSortFilterProxyModel>
26
27class QgsVectorLayer;
31class QgsProcessingToolboxModelGroupNode;
32class QgsProcessingRecentAlgorithmLog;
33class QgsProcessingFavoriteAlgorithmManager;
34
36
43class GUI_EXPORT QgsProcessingToolboxModelNode : public QObject
44{
45 Q_OBJECT
46
47#ifdef SIP_RUN
49 if ( sipCpp->inherits( "QgsProcessingToolboxModelNode" ) )
50 {
51 sipType = sipType_QgsProcessingToolboxModelNode;
52 QgsProcessingToolboxModelNode *node = qobject_cast<QgsProcessingToolboxModelNode *>( sipCpp );
53 if ( node->nodeType() == QgsProcessingToolboxModelNode::NodeType::Provider )
54 sipType = sipType_QgsProcessingToolboxModelProviderNode;
55 else if ( node->nodeType() == QgsProcessingToolboxModelNode::NodeType::Group )
56 sipType = sipType_QgsProcessingToolboxModelGroupNode;
57 else if ( node->nodeType() == QgsProcessingToolboxModelNode::NodeType::Algorithm )
58 sipType = sipType_QgsProcessingToolboxModelAlgorithmNode;
59 else if ( node->nodeType() == QgsProcessingToolboxModelNode::NodeType::Parameter )
60 sipType = sipType_QgsProcessingToolboxModelParameterNode;
61 else if ( node->nodeType() == QgsProcessingToolboxModelNode::NodeType::Recent )
62 sipType = sipType_QgsProcessingToolboxModelRecentNode;
63 else if ( node->nodeType() == QgsProcessingToolboxModelNode::NodeType::Favorite )
64 sipType = sipType_QgsProcessingToolboxModelFavoriteNode;
65 else if ( node->nodeType() == QgsProcessingToolboxModelNode::NodeType::ParameterGroup )
66 sipType = sipType_QgsProcessingToolboxModelParameterGroupNode;
67 }
68 else
69 sipType = 0;
71#endif
72
73 public:
74 // *INDENT-OFF*
75
77 enum class NodeType SIP_MONKEYPATCH_SCOPEENUM_UNNEST( QgsProcessingToolboxModelNode, NodeType ) : int
78 {
79 Provider SIP_MONKEYPATCH_COMPAT_NAME( NodeProvider ) = 0,
80 Group SIP_MONKEYPATCH_COMPAT_NAME( NodeGroup ),
81 Algorithm SIP_MONKEYPATCH_COMPAT_NAME( NodeAlgorithm ),
82 Recent SIP_MONKEYPATCH_COMPAT_NAME( NodeRecent ),
83 Parameter,
84 ParameterGroup,
85 Favorite,
86 };
87 Q_ENUM( NodeType )
88 // *INDENT-ON*
89
90 ~QgsProcessingToolboxModelNode() override;
91
95 virtual NodeType nodeType() const = 0;
96
100 QgsProcessingToolboxModelNode *parent() { return mParent; }
101
105 QList<QgsProcessingToolboxModelNode *> children() { return mChildren; }
106
111 QList<QgsProcessingToolboxModelNode *> children() const SIP_SKIP
112 {
113 return mChildren;
114 }
115
120 QgsProcessingToolboxModelNode *takeChild( QgsProcessingToolboxModelNode *node );
121
127 QgsProcessingToolboxModelGroupNode *getChildGroupNode( const QString &id );
128
133 void addChildNode( QgsProcessingToolboxModelNode *node SIP_TRANSFER );
134
138 void deleteChildren();
139
140 private:
141 QgsProcessingToolboxModelNode *mParent = nullptr;
142 QList<QgsProcessingToolboxModelNode *> mChildren;
143};
144
151class GUI_EXPORT QgsProcessingToolboxModelRecentNode : public QgsProcessingToolboxModelNode
152{
153 Q_OBJECT
154
155 public:
156 QgsProcessingToolboxModelRecentNode() = default;
157
158 NodeType nodeType() const override { return NodeType::Recent; }
159};
160
167class GUI_EXPORT QgsProcessingToolboxModelFavoriteNode : public QgsProcessingToolboxModelNode
168{
169 Q_OBJECT
170
171 public:
172 QgsProcessingToolboxModelFavoriteNode() = default;
173
174 NodeType nodeType() const override { return NodeType::Favorite; }
175};
176
183class GUI_EXPORT QgsProcessingToolboxModelParameterGroupNode : public QgsProcessingToolboxModelNode
184{
185 Q_OBJECT
186
187 public:
188 QgsProcessingToolboxModelParameterGroupNode() = default;
189
190 NodeType nodeType() const override { return NodeType::ParameterGroup; }
191};
192
199class GUI_EXPORT QgsProcessingToolboxModelProviderNode : public QgsProcessingToolboxModelNode
200{
201 Q_OBJECT
202
203 public:
204
209 QgsProcessingToolboxModelProviderNode( QgsProcessingProvider *provider );
210
211 NodeType nodeType() const override { return NodeType::Provider; }
212
216 QgsProcessingProvider *provider();
217
221 QString providerId() const { return mProviderId; }
222
223 private:
224 // NOTE: we store both the provider ID and a pointer to the provider here intentionally.
225 // We store the provider pointer to avoid having to lookup the provider from the registry
226 // every time the node is used (which kills performance in the filter proxy model), but
227 // we also store the provider id string in order to identify the provider that the node
228 // is linked to for cleanups after the provider is removed.
229 QString mProviderId;
230 QPointer<QgsProcessingProvider> mProvider;
231};
232
239class GUI_EXPORT QgsProcessingToolboxModelGroupNode : public QgsProcessingToolboxModelNode
240{
241 Q_OBJECT
242
243 public:
244
252 QgsProcessingToolboxModelGroupNode( const QString &id, const QString &name );
253
254 NodeType nodeType() const override { return NodeType::Group; }
255
259 QString id() const { return mId; }
260
264 QString name() const { return mName; }
265
266 private:
267 QString mId;
268 QString mName;
269};
270
277class GUI_EXPORT QgsProcessingToolboxModelAlgorithmNode : public QgsProcessingToolboxModelNode
278{
279 Q_OBJECT
280
281 public:
282
287 QgsProcessingToolboxModelAlgorithmNode( const QgsProcessingAlgorithm *algorithm );
288
289 NodeType nodeType() const override { return NodeType::Algorithm; }
290
294 const QgsProcessingAlgorithm *algorithm() const;
295
296 private:
297 const QgsProcessingAlgorithm *mAlgorithm = nullptr;
298};
299
300
307class GUI_EXPORT QgsProcessingToolboxModelParameterNode : public QgsProcessingToolboxModelNode
308{
309 Q_OBJECT
310
311 public:
312
317 QgsProcessingToolboxModelParameterNode( const QgsProcessingParameterType *paramType );
318
319 NodeType nodeType() const override { return NodeType::Parameter; }
320
324 const QgsProcessingParameterType *parameterType() const;
325
326 private:
327 const QgsProcessingParameterType *mParamType = nullptr;
328};
329
331
341class GUI_EXPORT QgsProcessingToolboxModel : public QAbstractItemModel
342{
343 Q_OBJECT
344
345 public:
346 // *INDENT-OFF*
347
355 {
356 NodeType SIP_MONKEYPATCH_COMPAT_NAME( RoleNodeType ) = Qt::UserRole,
357 AlgorithmFlags SIP_MONKEYPATCH_COMPAT_NAME( RoleAlgorithmFlags ),
358 AlgorithmId SIP_MONKEYPATCH_COMPAT_NAME( RoleAlgorithmId ),
359 AlgorithmName SIP_MONKEYPATCH_COMPAT_NAME( RoleAlgorithmName ),
360 AlgorithmShortDescription SIP_MONKEYPATCH_COMPAT_NAME( RoleAlgorithmShortDescription ),
361 AlgorithmTags SIP_MONKEYPATCH_COMPAT_NAME( RoleAlgorithmTags ),
362 ProviderFlags SIP_MONKEYPATCH_COMPAT_NAME( RoleProviderFlags ),
363 ParameterTypeId,
364 };
365 Q_ENUM( CustomRole )
366 // *INDENT-ON*
367
368
382 QgsProcessingToolboxModel( QObject *parent SIP_TRANSFERTHIS = nullptr, QgsProcessingRegistry *registry = nullptr, QgsProcessingRecentAlgorithmLog *recentLog = nullptr, QgsProcessingFavoriteAlgorithmManager *favoriteManager = nullptr );
383
384 Qt::ItemFlags flags( const QModelIndex &index ) const override;
385 QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const override;
386 int rowCount( const QModelIndex &parent = QModelIndex() ) const override;
387 int columnCount( const QModelIndex & = QModelIndex() ) const override;
388 QModelIndex index( int row, int column, const QModelIndex &parent = QModelIndex() ) const override;
389 QModelIndex parent( const QModelIndex &index ) const override;
390 QMimeData *mimeData( const QModelIndexList &indexes ) const override;
391
396 QgsProcessingToolboxModelNode *index2node( const QModelIndex &index ) const;
397
402 QModelIndex node2index( QgsProcessingToolboxModelNode *node ) const;
403
411 QgsProcessingProvider *providerForIndex( const QModelIndex &index ) const;
412
420 QString providerIdForIndex( const QModelIndex &index ) const;
421
429 const QgsProcessingAlgorithm *algorithmForIndex( const QModelIndex &index ) const;
430
436 bool isAlgorithm( const QModelIndex &index ) const;
437
446 const QgsProcessingParameterType *parameterTypeForIndex( const QModelIndex &index ) const;
447
454 bool isParameter( const QModelIndex &index ) const;
455
460 QModelIndex indexForProvider( const QString &providerId ) const;
461
465 QModelIndex indexOfParentTreeNode( QgsProcessingToolboxModelNode *parentNode ) const;
466
467 signals:
468
473
478
479 private slots:
480
481 void rebuild();
482 void repopulateRecentAlgorithms( bool resetting = false );
483 void repopulateFavoriteAlgorithms( bool resetting = false );
484
485 private:
486 QPointer<QgsProcessingRegistry> mRegistry;
487 QPointer<QgsProcessingRecentAlgorithmLog> mRecentLog;
488 QPointer<QgsProcessingFavoriteAlgorithmManager> mFavoriteManager;
489
490 std::unique_ptr<QgsProcessingToolboxModelGroupNode> mRootNode;
491 QgsProcessingToolboxModelRecentNode *mRecentNode = nullptr;
492 QgsProcessingToolboxModelFavoriteNode *mFavoriteNode = nullptr;
493
494 void addProvider( QgsProcessingProvider *provider );
495
500 static bool isTopLevelProvider( const QString &providerId );
501
505 static QString toolTipForAlgorithm( const QgsProcessingAlgorithm *algorithm );
506};
507
508
518class GUI_EXPORT QgsProcessingToolboxProxyModel : public QSortFilterProxyModel
519{
520 Q_OBJECT
521
522 public:
523 // *INDENT-OFF*
524
527 {
528 Toolbox SIP_MONKEYPATCH_COMPAT_NAME( FilterToolbox ) = 1 << 1,
529 Modeler SIP_MONKEYPATCH_COMPAT_NAME( FilterModeler ) = 1 << 2,
530 InPlace SIP_MONKEYPATCH_COMPAT_NAME( FilterInPlace ) = 1 << 3,
531 ShowKnownIssues SIP_MONKEYPATCH_COMPAT_NAME( FilterShowKnownIssues ) = 1 << 4,
532 };
533 Q_ENUM( Filter )
534 Q_DECLARE_FLAGS( Filters, Filter )
535 Q_FLAG( Filters )
536 // *INDENT-ON*
537
552 explicit QgsProcessingToolboxProxyModel( QObject *parent SIP_TRANSFERTHIS = nullptr, QgsProcessingRegistry *registry = nullptr, QgsProcessingRecentAlgorithmLog *recentLog = nullptr, QgsProcessingFavoriteAlgorithmManager *favoriteManager = nullptr );
553
558
564
570
575 Filters filters() const { return mFilters; }
576
580 void setInPlaceLayer( QgsVectorLayer *layer );
581
591 void setFilterString( const QString &filter );
592
598 QString filterString() const { return mFilterString; }
599
600 bool filterAcceptsRow( int sourceRow, const QModelIndex &sourceParent ) const override;
601 bool lessThan( const QModelIndex &left, const QModelIndex &right ) const override;
602 QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const override;
603
604 private:
605 QgsProcessingToolboxModel *mModel = nullptr;
606 Filters mFilters = Filters();
607 QString mFilterString;
608 QPointer<QgsVectorLayer> mInPlaceLayer;
609};
611
612#endif // QGSPROCESSINGTOOLBOXMODEL_H
Abstract base class for processing algorithms.
Makes metadata of processing parameters available.
Abstract base class for processing providers.
Registry for various processing components, including providers, algorithms and various parameters an...
A model for providers and algorithms shown within the Processing toolbox.
QgsProcessingToolboxModel(QObject *parent=nullptr, QgsProcessingRegistry *registry=nullptr, QgsProcessingRecentAlgorithmLog *recentLog=nullptr, QgsProcessingFavoriteAlgorithmManager *favoriteManager=nullptr)
Constructor for QgsProcessingToolboxModel, with the given parent object.
void recentAlgorithmAdded()
Emitted whenever recent algorithms are added to the model.
void favoriteAlgorithmAdded()
Emitted whenever favorite algorithms are added to the model.
Filters filters() const
Returns any filters that affect how toolbox content is filtered.
QString filterString() const
Returns the current filter string, if set.
void setFilters(QgsProcessingToolboxProxyModel::Filters filters)
Set filters that affect how toolbox content is filtered.
QgsProcessingToolboxProxyModel(QObject *parent=nullptr, QgsProcessingRegistry *registry=nullptr, QgsProcessingRecentAlgorithmLog *recentLog=nullptr, QgsProcessingFavoriteAlgorithmManager *favoriteManager=nullptr)
Constructor for QgsProcessingToolboxProxyModel, with the given parent object.
QgsProcessingToolboxModel * toolboxModel()
Returns the underlying source Processing toolbox model.
Filter
Available filter flags for filtering the model.
Represents a vector layer which manages a vector based dataset.
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
#define SIP_CONVERT_TO_SUBCLASS_CODE(code)
Definition qgis_sip.h:199
#define SIP_TRANSFERTHIS
Definition qgis_sip.h:53
#define SIP_ENUM_BASETYPE(type)
Definition qgis_sip.h:275
#define SIP_SKIP
Definition qgis_sip.h:134
#define SIP_MONKEYPATCH_SCOPEENUM_UNNEST(OUTSIDE_CLASS, FORMERNAME)
Definition qgis_sip.h:268
#define SIP_TRANSFER
Definition qgis_sip.h:36
#define SIP_END
Definition qgis_sip.h:216
#define SIP_MONKEYPATCH_COMPAT_NAME(FORMERNAME)
Definition qgis_sip.h:270
Q_DECLARE_OPERATORS_FOR_FLAGS(QgsProjectionSelectionWidget::CrsOptions)