QGIS API Documentation 4.1.0-Master (5bf3c20f3c9)
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 { return mChildren; }
112
117 QgsProcessingToolboxModelNode *takeChild( QgsProcessingToolboxModelNode *node );
118
124 QgsProcessingToolboxModelGroupNode *getChildGroupNode( const QString &id );
125
130 void addChildNode( QgsProcessingToolboxModelNode *node SIP_TRANSFER );
131
135 void deleteChildren();
136
137 private:
138 QgsProcessingToolboxModelNode *mParent = nullptr;
139 QList<QgsProcessingToolboxModelNode *> mChildren;
140};
141
148class GUI_EXPORT QgsProcessingToolboxModelRecentNode : public QgsProcessingToolboxModelNode
149{
150 Q_OBJECT
151
152 public:
153 QgsProcessingToolboxModelRecentNode() = default;
154
155 NodeType nodeType() const override { return NodeType::Recent; }
156};
157
164class GUI_EXPORT QgsProcessingToolboxModelFavoriteNode : public QgsProcessingToolboxModelNode
165{
166 Q_OBJECT
167
168 public:
169 QgsProcessingToolboxModelFavoriteNode() = default;
170
171 NodeType nodeType() const override { return NodeType::Favorite; }
172};
173
180class GUI_EXPORT QgsProcessingToolboxModelParameterGroupNode : public QgsProcessingToolboxModelNode
181{
182 Q_OBJECT
183
184 public:
185 QgsProcessingToolboxModelParameterGroupNode() = default;
186
187 NodeType nodeType() const override { return NodeType::ParameterGroup; }
188};
189
196class GUI_EXPORT QgsProcessingToolboxModelProviderNode : public QgsProcessingToolboxModelNode
197{
198 Q_OBJECT
199
200 public:
205 QgsProcessingToolboxModelProviderNode( QgsProcessingProvider *provider );
206
207 NodeType nodeType() const override { return NodeType::Provider; }
208
212 QgsProcessingProvider *provider();
213
217 QString providerId() const { return mProviderId; }
218
219 private:
220 // NOTE: we store both the provider ID and a pointer to the provider here intentionally.
221 // We store the provider pointer to avoid having to lookup the provider from the registry
222 // every time the node is used (which kills performance in the filter proxy model), but
223 // we also store the provider id string in order to identify the provider that the node
224 // is linked to for cleanups after the provider is removed.
225 QString mProviderId;
226 QPointer<QgsProcessingProvider> mProvider;
227};
228
235class GUI_EXPORT QgsProcessingToolboxModelGroupNode : public QgsProcessingToolboxModelNode
236{
237 Q_OBJECT
238
239 public:
247 QgsProcessingToolboxModelGroupNode( const QString &id, const QString &name );
248
249 NodeType nodeType() const override { return NodeType::Group; }
250
254 QString id() const { return mId; }
255
259 QString name() const { return mName; }
260
261 private:
262 QString mId;
263 QString mName;
264};
265
272class GUI_EXPORT QgsProcessingToolboxModelAlgorithmNode : public QgsProcessingToolboxModelNode
273{
274 Q_OBJECT
275
276 public:
281 QgsProcessingToolboxModelAlgorithmNode( const QgsProcessingAlgorithm *algorithm );
282
283 NodeType nodeType() const override { return NodeType::Algorithm; }
284
288 const QgsProcessingAlgorithm *algorithm() const;
289
290 private:
291 const QgsProcessingAlgorithm *mAlgorithm = nullptr;
292};
293
294
301class GUI_EXPORT QgsProcessingToolboxModelParameterNode : public QgsProcessingToolboxModelNode
302{
303 Q_OBJECT
304
305 public:
310 QgsProcessingToolboxModelParameterNode( const QgsProcessingParameterType *paramType );
311
312 NodeType nodeType() const override { return NodeType::Parameter; }
313
317 const QgsProcessingParameterType *parameterType() const;
318
319 private:
320 const QgsProcessingParameterType *mParamType = nullptr;
321};
322
324
334class GUI_EXPORT QgsProcessingToolboxModel : public QAbstractItemModel
335{
336 Q_OBJECT
337
338 public:
339 // *INDENT-OFF*
340
348 {
349 NodeType SIP_MONKEYPATCH_COMPAT_NAME( RoleNodeType ) = Qt::UserRole,
350 AlgorithmFlags SIP_MONKEYPATCH_COMPAT_NAME( RoleAlgorithmFlags ),
351 AlgorithmId SIP_MONKEYPATCH_COMPAT_NAME( RoleAlgorithmId ),
352 AlgorithmName SIP_MONKEYPATCH_COMPAT_NAME( RoleAlgorithmName ),
353 AlgorithmShortDescription SIP_MONKEYPATCH_COMPAT_NAME( RoleAlgorithmShortDescription ),
354 AlgorithmTags SIP_MONKEYPATCH_COMPAT_NAME( RoleAlgorithmTags ),
355 ProviderFlags SIP_MONKEYPATCH_COMPAT_NAME( RoleProviderFlags ),
356 ParameterTypeId,
357 };
358 Q_ENUM( CustomRole )
359 // *INDENT-ON*
360
361
376 QObject *parent SIP_TRANSFERTHIS = nullptr,
377 QgsProcessingRegistry *registry = nullptr,
378 QgsProcessingRecentAlgorithmLog *recentLog = nullptr,
379 QgsProcessingFavoriteAlgorithmManager *favoriteManager = nullptr
380 );
381
382 Qt::ItemFlags flags( const QModelIndex &index ) const override;
383 QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const override;
384 int rowCount( const QModelIndex &parent = QModelIndex() ) const override;
385 int columnCount( const QModelIndex & = QModelIndex() ) const override;
386 QModelIndex index( int row, int column, const QModelIndex &parent = QModelIndex() ) const override;
387 QModelIndex parent( const QModelIndex &index ) const override;
388 QMimeData *mimeData( const QModelIndexList &indexes ) const override;
389
394 QgsProcessingToolboxModelNode *index2node( const QModelIndex &index ) const;
395
400 QModelIndex node2index( QgsProcessingToolboxModelNode *node ) const;
401
409 QgsProcessingProvider *providerForIndex( const QModelIndex &index ) const;
410
418 QString providerIdForIndex( const QModelIndex &index ) const;
419
427 const QgsProcessingAlgorithm *algorithmForIndex( const QModelIndex &index ) const;
428
434 bool isAlgorithm( const QModelIndex &index ) const;
435
444 const QgsProcessingParameterType *parameterTypeForIndex( const QModelIndex &index ) const;
445
452 bool isParameter( const QModelIndex &index ) const;
453
458 QModelIndex indexForProvider( const QString &providerId ) const;
459
463 QModelIndex indexOfParentTreeNode( QgsProcessingToolboxModelNode *parentNode ) const;
464
465 signals:
466
471
476
477 private slots:
478
479 void rebuild();
480 void repopulateRecentAlgorithms( bool resetting = false );
481 void repopulateFavoriteAlgorithms( bool resetting = false );
482
483 private:
484 QPointer<QgsProcessingRegistry> mRegistry;
485 QPointer<QgsProcessingRecentAlgorithmLog> mRecentLog;
486 QPointer<QgsProcessingFavoriteAlgorithmManager> mFavoriteManager;
487
488 std::unique_ptr<QgsProcessingToolboxModelGroupNode> mRootNode;
489 QgsProcessingToolboxModelRecentNode *mRecentNode = nullptr;
490 QgsProcessingToolboxModelFavoriteNode *mFavoriteNode = nullptr;
491
492 void addProvider( QgsProcessingProvider *provider );
493
498 static bool isTopLevelProvider( const QString &providerId );
499
503 static QString toolTipForAlgorithm( const QgsProcessingAlgorithm *algorithm );
504};
505
506
516class GUI_EXPORT QgsProcessingToolboxProxyModel : public QSortFilterProxyModel
517{
518 Q_OBJECT
519
520 public:
521 // *INDENT-OFF*
522
525 {
526 Toolbox SIP_MONKEYPATCH_COMPAT_NAME( FilterToolbox ) = 1 << 1,
527 Modeler SIP_MONKEYPATCH_COMPAT_NAME( FilterModeler ) = 1 << 2,
528 InPlace SIP_MONKEYPATCH_COMPAT_NAME( FilterInPlace ) = 1 << 3,
529 ShowKnownIssues SIP_MONKEYPATCH_COMPAT_NAME( FilterShowKnownIssues ) = 1 << 4,
530 };
531 Q_ENUM( Filter )
532 Q_DECLARE_FLAGS( Filters, Filter )
533 Q_FLAG( Filters )
534 // *INDENT-ON*
535
551 QObject *parent SIP_TRANSFERTHIS = nullptr,
552 QgsProcessingRegistry *registry = nullptr,
553 QgsProcessingRecentAlgorithmLog *recentLog = nullptr,
554 QgsProcessingFavoriteAlgorithmManager *favoriteManager = nullptr
555 );
556
561
567
573
578 Filters filters() const { return mFilters; }
579
583 void setInPlaceLayer( QgsVectorLayer *layer );
584
594 void setFilterString( const QString &filter );
595
601 QString filterString() const { return mFilterString; }
602
603 bool filterAcceptsRow( int sourceRow, const QModelIndex &sourceParent ) const override;
604 bool lessThan( const QModelIndex &left, const QModelIndex &right ) const override;
605 QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const override;
606
607 private:
608 QgsProcessingToolboxModel *mModel = nullptr;
609 Filters mFilters = Filters();
610 QString mFilterString;
611 QPointer<QgsVectorLayer> mInPlaceLayer;
612};
614
615#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:198
#define SIP_TRANSFERTHIS
Definition qgis_sip.h:52
#define SIP_ENUM_BASETYPE(type)
Definition qgis_sip.h:274
#define SIP_SKIP
Definition qgis_sip.h:133
#define SIP_MONKEYPATCH_SCOPEENUM_UNNEST(OUTSIDE_CLASS, FORMERNAME)
Definition qgis_sip.h:267
#define SIP_TRANSFER
Definition qgis_sip.h:35
#define SIP_END
Definition qgis_sip.h:215
#define SIP_MONKEYPATCH_COMPAT_NAME(FORMERNAME)
Definition qgis_sip.h:269
Q_DECLARE_OPERATORS_FOR_FLAGS(QgsProjectionSelectionWidget::CrsOptions)