QGIS API Documentation 4.3.0-Master (149067ad0b9)
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"
23
24#include <QAbstractItemModel>
25#include <QPointer>
26#include <QSortFilterProxyModel>
27
28class QgsVectorLayer;
32class QgsProcessingToolboxModelGroupNode;
33class QgsProcessingRecentAlgorithmLog;
34class QgsProcessingFavoriteAlgorithmManager;
35
37
44class GUI_EXPORT QgsProcessingToolboxModelNode : public QObject
45{
46 Q_OBJECT
47
48#ifdef SIP_RUN
50 if ( sipCpp->inherits( "QgsProcessingToolboxModelNode" ) )
51 {
52 sipType = sipType_QgsProcessingToolboxModelNode;
53 QgsProcessingToolboxModelNode *node = qobject_cast<QgsProcessingToolboxModelNode *>( sipCpp );
54 if ( node->nodeType() == QgsProcessingToolboxModelNode::NodeType::Provider )
55 sipType = sipType_QgsProcessingToolboxModelProviderNode;
56 else if ( node->nodeType() == QgsProcessingToolboxModelNode::NodeType::Group )
57 sipType = sipType_QgsProcessingToolboxModelGroupNode;
58 else if ( node->nodeType() == QgsProcessingToolboxModelNode::NodeType::Algorithm )
59 sipType = sipType_QgsProcessingToolboxModelAlgorithmNode;
60 else if ( node->nodeType() == QgsProcessingToolboxModelNode::NodeType::Parameter )
61 sipType = sipType_QgsProcessingToolboxModelParameterNode;
62 else if ( node->nodeType() == QgsProcessingToolboxModelNode::NodeType::Recent )
63 sipType = sipType_QgsProcessingToolboxModelRecentNode;
64 else if ( node->nodeType() == QgsProcessingToolboxModelNode::NodeType::Favorite )
65 sipType = sipType_QgsProcessingToolboxModelFavoriteNode;
66 else if ( node->nodeType() == QgsProcessingToolboxModelNode::NodeType::ParameterGroup )
67 sipType = sipType_QgsProcessingToolboxModelParameterGroupNode;
68 }
69 else
70 sipType = 0;
72#endif
73
74 public:
75 // *INDENT-OFF*
76
78 enum class NodeType SIP_MONKEYPATCH_SCOPEENUM_UNNEST( QgsProcessingToolboxModelNode, NodeType ) : int
79 {
80 Provider SIP_MONKEYPATCH_COMPAT_NAME( NodeProvider ) = 0,
81 Group SIP_MONKEYPATCH_COMPAT_NAME( NodeGroup ),
82 Algorithm SIP_MONKEYPATCH_COMPAT_NAME( NodeAlgorithm ),
83 Recent SIP_MONKEYPATCH_COMPAT_NAME( NodeRecent ),
84 Parameter,
85 ParameterGroup,
86 Favorite,
87 };
88 Q_ENUM( NodeType )
89 // *INDENT-ON*
90
91 ~QgsProcessingToolboxModelNode() override;
92
96 virtual NodeType nodeType() const = 0;
97
101 QgsProcessingToolboxModelNode *parent() { return mParent; }
102
106 QList<QgsProcessingToolboxModelNode *> children() { return mChildren; }
107
112 QList<QgsProcessingToolboxModelNode *> children() const SIP_SKIP { return mChildren; }
113
118 QgsProcessingToolboxModelNode *takeChild( QgsProcessingToolboxModelNode *node );
119
125 QgsProcessingToolboxModelGroupNode *getChildGroupNode( const QString &id );
126
131 void addChildNode( QgsProcessingToolboxModelNode *node SIP_TRANSFER );
132
136 void deleteChildren();
137
138 private:
139 QgsProcessingToolboxModelNode *mParent = nullptr;
140 QList<QgsProcessingToolboxModelNode *> mChildren;
141};
142
149class GUI_EXPORT QgsProcessingToolboxModelRecentNode : public QgsProcessingToolboxModelNode
150{
151 Q_OBJECT
152
153 public:
154 QgsProcessingToolboxModelRecentNode() = default;
155
156 NodeType nodeType() const override { return NodeType::Recent; }
157};
158
165class GUI_EXPORT QgsProcessingToolboxModelFavoriteNode : public QgsProcessingToolboxModelNode
166{
167 Q_OBJECT
168
169 public:
170 QgsProcessingToolboxModelFavoriteNode() = default;
171
172 NodeType nodeType() const override { return NodeType::Favorite; }
173};
174
181class GUI_EXPORT QgsProcessingToolboxModelParameterGroupNode : public QgsProcessingToolboxModelNode
182{
183 Q_OBJECT
184
185 public:
186 QgsProcessingToolboxModelParameterGroupNode() = default;
187
188 NodeType nodeType() const override { return NodeType::ParameterGroup; }
189};
190
197class GUI_EXPORT QgsProcessingToolboxModelProviderNode : public QgsProcessingToolboxModelNode
198{
199 Q_OBJECT
200
201 public:
206 QgsProcessingToolboxModelProviderNode( QgsProcessingProvider *provider );
207
208 NodeType nodeType() const override { return NodeType::Provider; }
209
213 QgsProcessingProvider *provider();
214
218 QString providerId() const { return mProviderId; }
219
220 private:
221 // NOTE: we store both the provider ID and a pointer to the provider here intentionally.
222 // We store the provider pointer to avoid having to lookup the provider from the registry
223 // every time the node is used (which kills performance in the filter proxy model), but
224 // we also store the provider id string in order to identify the provider that the node
225 // is linked to for cleanups after the provider is removed.
226 QString mProviderId;
227 QPointer<QgsProcessingProvider> mProvider;
228};
229
236class GUI_EXPORT QgsProcessingToolboxModelGroupNode : public QgsProcessingToolboxModelNode
237{
238 Q_OBJECT
239
240 public:
248 QgsProcessingToolboxModelGroupNode( const QString &id, const QString &name );
249
250 NodeType nodeType() const override { return NodeType::Group; }
251
255 QString id() const { return mId; }
256
260 QString name() const { return mName; }
261
262 private:
263 QString mId;
264 QString mName;
265};
266
273class GUI_EXPORT QgsProcessingToolboxModelAlgorithmNode : public QgsProcessingToolboxModelNode
274{
275 Q_OBJECT
276
277 public:
282 QgsProcessingToolboxModelAlgorithmNode( const QgsProcessingAlgorithm *algorithm );
283
284 NodeType nodeType() const override { return NodeType::Algorithm; }
285
289 const QgsProcessingAlgorithm *algorithm() const;
290
291 private:
292 const QgsProcessingAlgorithm *mAlgorithm = nullptr;
293};
294
295
302class GUI_EXPORT QgsProcessingToolboxModelParameterNode : public QgsProcessingToolboxModelNode
303{
304 Q_OBJECT
305
306 public:
311 QgsProcessingToolboxModelParameterNode( const QgsProcessingParameterType *paramType );
312
313 NodeType nodeType() const override { return NodeType::Parameter; }
314
318 const QgsProcessingParameterType *parameterType() const;
319
320 private:
321 const QgsProcessingParameterType *mParamType = nullptr;
322};
323
325
335class GUI_EXPORT QgsProcessingToolboxModel : public QAbstractItemModel
336{
337 Q_OBJECT
338
339 public:
340 // *INDENT-OFF*
341
349 {
350 NodeType SIP_MONKEYPATCH_COMPAT_NAME( RoleNodeType ) = Qt::UserRole,
351 AlgorithmFlags SIP_MONKEYPATCH_COMPAT_NAME( RoleAlgorithmFlags ),
352 AlgorithmId SIP_MONKEYPATCH_COMPAT_NAME( RoleAlgorithmId ),
353 AlgorithmName SIP_MONKEYPATCH_COMPAT_NAME( RoleAlgorithmName ),
354 AlgorithmShortDescription SIP_MONKEYPATCH_COMPAT_NAME( RoleAlgorithmShortDescription ),
355 AlgorithmTags SIP_MONKEYPATCH_COMPAT_NAME( RoleAlgorithmTags ),
356 ProviderFlags SIP_MONKEYPATCH_COMPAT_NAME( RoleProviderFlags ),
357 ParameterTypeId,
358 };
359 Q_ENUM( CustomRole )
360 // *INDENT-ON*
361
362
377 QObject *parent SIP_TRANSFERTHIS = nullptr,
378 QgsProcessingRegistry *registry = nullptr,
379 QgsProcessingRecentAlgorithmLog *recentLog = nullptr,
380 QgsProcessingFavoriteAlgorithmManager *favoriteManager = nullptr
381 );
382
383 Qt::ItemFlags flags( const QModelIndex &index ) const override;
384 QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const override;
385 int rowCount( const QModelIndex &parent = QModelIndex() ) const override;
386 int columnCount( const QModelIndex & = QModelIndex() ) const override;
387 QModelIndex index( int row, int column, const QModelIndex &parent = QModelIndex() ) const override;
388 QModelIndex parent( const QModelIndex &index ) const override;
389 QMimeData *mimeData( const QModelIndexList &indexes ) const override;
390
395 QgsProcessingToolboxModelNode *index2node( const QModelIndex &index ) const;
396
401 QModelIndex node2index( QgsProcessingToolboxModelNode *node ) const;
402
410 QgsProcessingProvider *providerForIndex( const QModelIndex &index ) const;
411
419 QString providerIdForIndex( const QModelIndex &index ) const;
420
428 const QgsProcessingAlgorithm *algorithmForIndex( const QModelIndex &index ) const;
429
435 bool isAlgorithm( const QModelIndex &index ) const;
436
445 const QgsProcessingParameterType *parameterTypeForIndex( const QModelIndex &index ) const;
446
453 bool isParameter( const QModelIndex &index ) const;
454
459 QModelIndex indexForProvider( const QString &providerId ) const;
460
464 QModelIndex indexOfParentTreeNode( QgsProcessingToolboxModelNode *parentNode ) const;
465
466 signals:
467
472
477
478 private slots:
479
480 void rebuild();
481 void repopulateRecentAlgorithms( bool resetting = false );
482 void repopulateFavoriteAlgorithms( bool resetting = false );
483
484 private:
485 QPointer<QgsProcessingRegistry> mRegistry;
486 QPointer<QgsProcessingRecentAlgorithmLog> mRecentLog;
487 QPointer<QgsProcessingFavoriteAlgorithmManager> mFavoriteManager;
488
489 std::unique_ptr<QgsProcessingToolboxModelGroupNode> mRootNode;
490 QgsProcessingToolboxModelRecentNode *mRecentNode = nullptr;
491 QgsProcessingToolboxModelFavoriteNode *mFavoriteNode = nullptr;
492
493 void addProvider( QgsProcessingProvider *provider );
494
499 static bool isTopLevelProvider( const QString &providerId );
500
504 static QString toolTipForAlgorithm( const QgsProcessingAlgorithm *algorithm );
505};
506
507
517class GUI_EXPORT QgsProcessingToolboxProxyModel : public QSortFilterProxyModel
518{
519 Q_OBJECT
520
521 public:
522 // *INDENT-OFF*
523
526 {
527 Toolbox SIP_MONKEYPATCH_COMPAT_NAME( FilterToolbox ) = 1 << 1,
528 Modeler SIP_MONKEYPATCH_COMPAT_NAME( FilterModeler ) = 1 << 2,
529 InPlace SIP_MONKEYPATCH_COMPAT_NAME( FilterInPlace ) = 1 << 3,
530 ShowKnownIssues SIP_MONKEYPATCH_COMPAT_NAME( FilterShowKnownIssues ) = 1 << 4,
531
532 SIP_SKIP // The naming could be improved, and it would be nice to be able to set them both at the same time
533 SIP_SKIP // so for now don't expose these flags to Python. see https://github.com/qgis/QGIS/pull/67117#discussion_r3826016642
534 SIP_SKIP ForSocketOutput
535 = 1 << 5,
536 SIP_SKIP ForSocketInput = 1 << 6,
537 };
538 Q_ENUM( Filter )
539 Q_DECLARE_FLAGS( Filters, Filter )
540 Q_FLAG( Filters )
541 // *INDENT-ON*
542
558 QObject *parent SIP_TRANSFERTHIS = nullptr,
559 QgsProcessingRegistry *registry = nullptr,
560 QgsProcessingRecentAlgorithmLog *recentLog = nullptr,
561 QgsProcessingFavoriteAlgorithmManager *favoriteManager = nullptr
562 );
563
568
574
580
585 Filters filters() const { return mFilters; }
586
590 void setInPlaceLayer( QgsVectorLayer *layer );
591
601 void setFilterString( const QString &filter );
602
615 void setFilterParameter( const QgsProcessingParameterDefinition *parameterDefinition ) SIP_SKIP;
616
629 void setFilterOutput( const QgsProcessingOutputDefinition *outputDefinition ) SIP_SKIP;
630
636 QString filterString() const { return mFilterString; }
637
638 bool filterAcceptsRow( int sourceRow, const QModelIndex &sourceParent ) const override;
639 bool lessThan( const QModelIndex &left, const QModelIndex &right ) const override;
640 QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const override;
641
642 private:
643 QgsProcessingToolboxModel *mModel = nullptr;
644 Filters mFilters = Filters();
645 QString mFilterString;
646 QPointer<QgsVectorLayer> mInPlaceLayer;
647
653 std::unique_ptr<QgsProcessingOutputDefinition> mFilterOutputDefinition;
654
660 std::unique_ptr<QgsProcessingParameterDefinition> mFilterParameterDefinition;
661};
663
664#endif // QGSPROCESSINGTOOLBOXMODEL_H
Abstract base class for processing algorithms.
Base class for the definition of processing outputs.
Base class for the definition of processing parameters.
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:203
#define SIP_TRANSFERTHIS
Definition qgis_sip.h:52
#define SIP_ENUM_BASETYPE(type)
Definition qgis_sip.h:277
#define SIP_SKIP
Definition qgis_sip.h:138
#define SIP_MONKEYPATCH_SCOPEENUM_UNNEST(OUTSIDE_CLASS, FORMERNAME)
Definition qgis_sip.h:270
#define SIP_TRANSFER
Definition qgis_sip.h:35
#define SIP_END
Definition qgis_sip.h:220
#define SIP_MONKEYPATCH_COMPAT_NAME(FORMERNAME)
Definition qgis_sip.h:272
Q_DECLARE_OPERATORS_FOR_FLAGS(QgsTimeZoneComboBox::StandardItems)