QGIS API Documentation 3.43.0-Master (56aa1fd18d7)
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#include <QAbstractItemModel>
23#include <QSortFilterProxyModel>
24#include <QPointer>
25
26class QgsVectorLayer;
30class QgsProcessingToolboxModelGroupNode;
31class QgsProcessingRecentAlgorithmLog;
32class QgsProcessingFavoriteAlgorithmManager;
33
35
42class GUI_EXPORT QgsProcessingToolboxModelNode : public QObject
43{
44 Q_OBJECT
45
46#ifdef SIP_RUN
48 if ( sipCpp->inherits( "QgsProcessingToolboxModelNode" ) )
49 {
50 sipType = sipType_QgsProcessingToolboxModelNode;
51 QgsProcessingToolboxModelNode *node = qobject_cast<QgsProcessingToolboxModelNode *>( sipCpp );
52 if ( node->nodeType() == QgsProcessingToolboxModelNode::NodeType::Provider )
53 sipType = sipType_QgsProcessingToolboxModelProviderNode;
54 else if ( node->nodeType() == QgsProcessingToolboxModelNode::NodeType::Group )
55 sipType = sipType_QgsProcessingToolboxModelGroupNode;
56 else if ( node->nodeType() == QgsProcessingToolboxModelNode::NodeType::Algorithm )
57 sipType = sipType_QgsProcessingToolboxModelAlgorithmNode;
58 else if ( node->nodeType() == QgsProcessingToolboxModelNode::NodeType::Parameter )
59 sipType = sipType_QgsProcessingToolboxModelParameterNode;
60 else if ( node->nodeType() == QgsProcessingToolboxModelNode::NodeType::Recent )
61 sipType = sipType_QgsProcessingToolboxModelRecentNode;
62 else if ( node->nodeType() == QgsProcessingToolboxModelNode::NodeType::Favorite )
63 sipType = sipType_QgsProcessingToolboxModelFavoriteNode;
64 else if ( node->nodeType() == QgsProcessingToolboxModelNode::NodeType::ParameterGroup )
65 sipType = sipType_QgsProcessingToolboxModelParameterGroupNode;
66 }
67 else
68 sipType = 0;
70#endif
71
72 public:
73 // *INDENT-OFF*
74
76 enum class NodeType SIP_MONKEYPATCH_SCOPEENUM_UNNEST( QgsProcessingToolboxModelNode, NodeType ) : int
77 {
78 Provider SIP_MONKEYPATCH_COMPAT_NAME( NodeProvider ) = 0,
79 Group SIP_MONKEYPATCH_COMPAT_NAME( NodeGroup ),
80 Algorithm SIP_MONKEYPATCH_COMPAT_NAME( NodeAlgorithm ),
81 Recent SIP_MONKEYPATCH_COMPAT_NAME( NodeRecent ),
82 Parameter,
83 ParameterGroup,
84 Favorite,
85 };
86 Q_ENUM( NodeType )
87 // *INDENT-ON*
88
89 ~QgsProcessingToolboxModelNode() override;
90
94 virtual NodeType nodeType() const = 0;
95
99 QgsProcessingToolboxModelNode *parent() { return mParent; }
100
104 QList<QgsProcessingToolboxModelNode *> children() { return mChildren; }
105
110 QList<QgsProcessingToolboxModelNode *> children() const SIP_SKIP
111 {
112 return mChildren;
113 }
114
119 QgsProcessingToolboxModelNode *takeChild( QgsProcessingToolboxModelNode *node );
120
126 QgsProcessingToolboxModelGroupNode *getChildGroupNode( const QString &id );
127
132 void addChildNode( QgsProcessingToolboxModelNode *node SIP_TRANSFER );
133
137 void deleteChildren();
138
139 private:
140 QgsProcessingToolboxModelNode *mParent = nullptr;
141 QList<QgsProcessingToolboxModelNode *> mChildren;
142};
143
150class GUI_EXPORT QgsProcessingToolboxModelRecentNode : public QgsProcessingToolboxModelNode
151{
152 Q_OBJECT
153
154 public:
155 QgsProcessingToolboxModelRecentNode() = default;
156
157 NodeType nodeType() const override { return NodeType::Recent; }
158};
159
166class GUI_EXPORT QgsProcessingToolboxModelFavoriteNode : public QgsProcessingToolboxModelNode
167{
168 Q_OBJECT
169
170 public:
171 QgsProcessingToolboxModelFavoriteNode() = default;
172
173 NodeType nodeType() const override { return NodeType::Favorite; }
174};
175
182class GUI_EXPORT QgsProcessingToolboxModelParameterGroupNode : public QgsProcessingToolboxModelNode
183{
184 Q_OBJECT
185
186 public:
187 QgsProcessingToolboxModelParameterGroupNode() = default;
188
189 NodeType nodeType() const override { return NodeType::ParameterGroup; }
190};
191
198class GUI_EXPORT QgsProcessingToolboxModelProviderNode : public QgsProcessingToolboxModelNode
199{
200 Q_OBJECT
201
202 public:
207 QgsProcessingToolboxModelProviderNode( QgsProcessingProvider *provider );
208
209 NodeType nodeType() const override { return NodeType::Provider; }
210
214 QgsProcessingProvider *provider();
215
219 QString providerId() const { return mProviderId; }
220
221 private:
222 // NOTE: we store both the provider ID and a pointer to the provider here intentionally.
223 // We store the provider pointer to avoid having to lookup the provider from the registry
224 // every time the node is used (which kills performance in the filter proxy model), but
225 // we also store the provider id string in order to identify the provider that the node
226 // is linked to for cleanups after the provider is removed.
227 QString mProviderId;
228 QPointer<QgsProcessingProvider> mProvider;
229};
230
237class GUI_EXPORT QgsProcessingToolboxModelGroupNode : public QgsProcessingToolboxModelNode
238{
239 Q_OBJECT
240
241 public:
249 QgsProcessingToolboxModelGroupNode( const QString &id, const QString &name );
250
251 NodeType nodeType() const override { return NodeType::Group; }
252
256 QString id() const { return mId; }
257
261 QString name() const { return mName; }
262
263 private:
264 QString mId;
265 QString mName;
266};
267
274class GUI_EXPORT QgsProcessingToolboxModelAlgorithmNode : public QgsProcessingToolboxModelNode
275{
276 Q_OBJECT
277
278 public:
283 QgsProcessingToolboxModelAlgorithmNode( const QgsProcessingAlgorithm *algorithm );
284
285 NodeType nodeType() const override { return NodeType::Algorithm; }
286
290 const QgsProcessingAlgorithm *algorithm() const;
291
292 private:
293 const QgsProcessingAlgorithm *mAlgorithm = nullptr;
294};
295
296
303class GUI_EXPORT QgsProcessingToolboxModelParameterNode : public QgsProcessingToolboxModelNode
304{
305 Q_OBJECT
306
307 public:
312 QgsProcessingToolboxModelParameterNode( const QgsProcessingParameterType *paramType );
313
314 NodeType nodeType() const override { return NodeType::Parameter; }
315
319 const QgsProcessingParameterType *parameterType() const;
320
321 private:
322 const QgsProcessingParameterType *mParamType = nullptr;
323};
324
326
336class GUI_EXPORT QgsProcessingToolboxModel : public QAbstractItemModel
337{
338 Q_OBJECT
339
340 public:
341 // *INDENT-OFF*
342
350 {
351 NodeType SIP_MONKEYPATCH_COMPAT_NAME( RoleNodeType ) = Qt::UserRole,
352 AlgorithmFlags SIP_MONKEYPATCH_COMPAT_NAME( RoleAlgorithmFlags ),
353 AlgorithmId SIP_MONKEYPATCH_COMPAT_NAME( RoleAlgorithmId ),
354 AlgorithmName SIP_MONKEYPATCH_COMPAT_NAME( RoleAlgorithmName ),
355 AlgorithmShortDescription SIP_MONKEYPATCH_COMPAT_NAME( RoleAlgorithmShortDescription ),
356 AlgorithmTags SIP_MONKEYPATCH_COMPAT_NAME( RoleAlgorithmTags ),
357 ProviderFlags SIP_MONKEYPATCH_COMPAT_NAME( RoleProviderFlags ),
358 ParameterTypeId,
359 };
360 Q_ENUM( CustomRole )
361 // *INDENT-ON*
362
363
377 QgsProcessingToolboxModel( QObject *parent SIP_TRANSFERTHIS = nullptr, QgsProcessingRegistry *registry = nullptr, QgsProcessingRecentAlgorithmLog *recentLog = nullptr, QgsProcessingFavoriteAlgorithmManager *favoriteManager = nullptr );
378
379 Qt::ItemFlags flags( const QModelIndex &index ) const override;
380 QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const override;
381 int rowCount( const QModelIndex &parent = QModelIndex() ) const override;
382 int columnCount( const QModelIndex & = QModelIndex() ) const override;
383 QModelIndex index( int row, int column, const QModelIndex &parent = QModelIndex() ) const override;
384 QModelIndex parent( const QModelIndex &index ) const override;
385 QMimeData *mimeData( const QModelIndexList &indexes ) const override;
386
391 QgsProcessingToolboxModelNode *index2node( const QModelIndex &index ) const;
392
397 QModelIndex node2index( QgsProcessingToolboxModelNode *node ) const;
398
406 QgsProcessingProvider *providerForIndex( const QModelIndex &index ) const;
407
415 QString providerIdForIndex( const QModelIndex &index ) const;
416
424 const QgsProcessingAlgorithm *algorithmForIndex( const QModelIndex &index ) const;
425
431 bool isAlgorithm( const QModelIndex &index ) const;
432
441 const QgsProcessingParameterType *parameterTypeForIndex( const QModelIndex &index ) const;
442
449 bool isParameter( const QModelIndex &index ) const;
450
455 QModelIndex indexForProvider( const QString &providerId ) const;
456
460 QModelIndex indexOfParentTreeNode( QgsProcessingToolboxModelNode *parentNode ) const;
461
462 signals:
463
468
473
474 private slots:
475
476 void rebuild();
477 void repopulateRecentAlgorithms( bool resetting = false );
478 void repopulateFavoriteAlgorithms( bool resetting = false );
479
480 private:
481 QPointer<QgsProcessingRegistry> mRegistry;
482 QPointer<QgsProcessingRecentAlgorithmLog> mRecentLog;
483 QPointer<QgsProcessingFavoriteAlgorithmManager> mFavoriteManager;
484
485 std::unique_ptr<QgsProcessingToolboxModelGroupNode> mRootNode;
486 QgsProcessingToolboxModelRecentNode *mRecentNode = nullptr;
487 QgsProcessingToolboxModelFavoriteNode *mFavoriteNode = nullptr;
488
489 void addProvider( QgsProcessingProvider *provider );
490
495 static bool isTopLevelProvider( const QString &providerId );
496
500 static QString toolTipForAlgorithm( const QgsProcessingAlgorithm *algorithm );
501};
502
503
513class GUI_EXPORT QgsProcessingToolboxProxyModel : public QSortFilterProxyModel
514{
515 Q_OBJECT
516
517 public:
518 // *INDENT-OFF*
519
522 {
523 Toolbox SIP_MONKEYPATCH_COMPAT_NAME( FilterToolbox ) = 1 << 1,
524 Modeler SIP_MONKEYPATCH_COMPAT_NAME( FilterModeler ) = 1 << 2,
525 InPlace SIP_MONKEYPATCH_COMPAT_NAME( FilterInPlace ) = 1 << 3,
526 ShowKnownIssues SIP_MONKEYPATCH_COMPAT_NAME( FilterShowKnownIssues ) = 1 << 4,
527 };
528 Q_ENUM( Filter )
529 Q_DECLARE_FLAGS( Filters, Filter )
530 Q_FLAG( Filters )
531 // *INDENT-ON*
532
547 explicit QgsProcessingToolboxProxyModel( QObject *parent SIP_TRANSFERTHIS = nullptr, QgsProcessingRegistry *registry = nullptr, QgsProcessingRecentAlgorithmLog *recentLog = nullptr, QgsProcessingFavoriteAlgorithmManager *favoriteManager = nullptr );
548
552 QgsProcessingToolboxModel *toolboxModel();
553
558 const QgsProcessingToolboxModel *toolboxModel() const SIP_SKIP;
559
564 void setFilters( QgsProcessingToolboxProxyModel::Filters filters );
565
570 Filters filters() const { return mFilters; }
571
575 void setInPlaceLayer( QgsVectorLayer *layer );
576
586 void setFilterString( const QString &filter );
587
593 QString filterString() const { return mFilterString; }
594
595 bool filterAcceptsRow( int sourceRow, const QModelIndex &sourceParent ) const override;
596 bool lessThan( const QModelIndex &left, const QModelIndex &right ) const override;
597 QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const override;
598
599 private:
600 QgsProcessingToolboxModel *mModel = nullptr;
601 Filters mFilters = Filters();
602 QString mFilterString;
603 QPointer<QgsVectorLayer> mInPlaceLayer;
604};
606
607#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.
void recentAlgorithmAdded()
Emitted whenever recent algorithms are added to the model.
void favoriteAlgorithmAdded()
Emitted whenever favorite algorithms are added to the model.
A proxy model for providers and algorithms shown within the Processing toolbox.
QString filterString() const
Returns the current filter string, if set.
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:191
#define SIP_TRANSFERTHIS
Definition qgis_sip.h:53
#define SIP_ENUM_BASETYPE(type)
Definition qgis_sip.h:278
#define SIP_SKIP
Definition qgis_sip.h:126
#define SIP_MONKEYPATCH_SCOPEENUM_UNNEST(OUTSIDE_CLASS, FORMERNAME)
Definition qgis_sip.h:271
#define SIP_TRANSFER
Definition qgis_sip.h:36
#define SIP_END
Definition qgis_sip.h:208
#define SIP_MONKEYPATCH_COMPAT_NAME(FORMERNAME)
Definition qgis_sip.h:273
Q_DECLARE_OPERATORS_FOR_FLAGS(QgsTextRendererUtils::CurvedTextFlags)