QGIS API Documentation 4.3.0-Master (0cfde48c85b)
Loading...
Searching...
No Matches
qgsprocessingalgorithmwidgetbase.h
Go to the documentation of this file.
1/***************************************************************************
2 qgsprocessingalgorithmwidgetbase.h
3 ----------------------------------
4 Date : November 2017
5 Copyright : (C) 2017 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 QGSPROCESSINGALGORITHMWIDGETBASE_H
17#define QGSPROCESSINGALGORITHMWIDGETBASE_H
18
19#include "ui_qgsprocessingalgorithmdialogbase.h"
20#include "ui_qgsprocessingalgorithmprogressdialogbase.h"
21#include "ui_qgsprocessingcontextoptionsbase.h"
22
23#include "qgis.h"
24#include "qgis_gui.h"
28
29#include <QThread>
30
32
34class QToolButton;
35class QgsProcessingContextOptionsWidget;
36class QgsMessageBar;
38class QgsTask;
39class QgsDockableWidgetHelper;
40class QMainWindow;
41class QgsProcessingParametersWidget;
42
49class GUI_EXPORT QgsProcessingFeedbackGenerator
50{
51 public:
52 virtual ~QgsProcessingFeedbackGenerator();
53
57 virtual QgsProcessingFeedback *createFeedback() = 0 SIP_FACTORY;
58};
59
60
66class GUI_EXPORT QgsProcessingAlgorithmWidgetBase : public QWidget, public QgsProcessingParametersGenerator, public QgsProcessingContextGenerator, private Ui::QgsProcessingDialogBase
67{
68 Q_OBJECT
69
70 public:
75 enum class LogFormat : int
76 {
77 FormatPlainText,
78 FormatHtml,
79 };
80 Q_ENUM( QgsProcessingAlgorithmWidgetBase::LogFormat )
81
82
87 enum class WidgetMode : int
88 {
89 Single,
90 Batch,
91 };
92 Q_ENUM( QgsProcessingAlgorithmWidgetBase::WidgetMode )
93
94
99 enum class WidgetFlag : int SIP_ENUM_BASETYPE( IntFlag )
100 {
101 NoDocking = 1 << 0
102 };
103 Q_ENUM( WidgetFlag )
104
105
110 Q_DECLARE_FLAGS( WidgetFlags, WidgetFlag )
111 Q_FLAG( WidgetFlags )
112
113
116 QgsProcessingAlgorithmWidgetBase(
117 QMainWindow *parentWindow SIP_TRANSFERTHIS,
118 QgsProcessingAlgorithmWidgetBase::WidgetMode mode = QgsProcessingAlgorithmWidgetBase::WidgetMode::Single,
119 QgsProcessingAlgorithmWidgetBase::WidgetFlags flags = QgsProcessingAlgorithmWidgetBase::WidgetFlags(),
121 );
122 ~QgsProcessingAlgorithmWidgetBase() override;
123
131 void setAlgorithm( QgsProcessingAlgorithm *algorithm SIP_TRANSFER );
132
137 QgsProcessingAlgorithm *algorithm();
138
143 void setMainWidget( QgsPanelWidget *widget SIP_TRANSFER );
144
149 QgsPanelWidget *mainWidget();
150
156 void showWidget();
157
161 void showLog();
162
168 bool wasExecuted() const { return mExecuted; }
169
175 QVariantMap results() const { return mResults; }
176
190 void registerProcessingFeedbackGenerator( QgsProcessingFeedbackGenerator *generator );
191
198 QgsProcessingFeedback *createFeedback() SIP_FACTORY;
199
206 void saveLogToFile( const QString &path, QgsProcessingAlgorithmWidgetBase::LogFormat format = QgsProcessingAlgorithmWidgetBase::LogFormat::FormatPlainText );
207
214 Qgis::ProcessingLogLevel logLevel() const;
215
222 void setLogLevel( Qgis::ProcessingLogLevel level );
223
229 virtual void setParameters( const QVariantMap &values );
230
236 void setTitle( const QString &title );
237
238 public slots:
239
247 void exec();
248
254 void reportError( const QString &error, bool fatalError );
255
259 void pushWarning( const QString &warning );
260
264 void pushInfo( const QString &info );
265
273 void pushFormattedMessage( const QString &html );
274
278 void pushDebugInfo( const QString &message );
279
283 void pushCommandInfo( const QString &info );
284
288 void setPercentage( double percent );
289
293 void setProgressText( const QString &text );
294
298 void pushConsoleInfo( const QString &info );
299
304 QDialog *createProgressDialog();
305
310 void clearLog();
311
317 void saveLog();
318
323 void copyLogToClipboard();
324
328 void showParameters();
329
343 virtual bool isRunning();
344
354 void cancel();
355
361 void forceClose();
362
363 void reject();
364
368 void hideShortHelp();
369
373 QgsMessageBar *messageBar();
374
378 QPushButton *runButton();
379
380 protected:
381 void closeEvent( QCloseEvent *e ) override;
382
386 QPushButton *cancelButton();
387
391 QPushButton *changeParametersButton();
392
396 QDialogButtonBox *buttonBox();
397
401 QTabWidget *tabWidget();
402
406 void clearProgress();
407
413 void setExecuted( bool executed );
414
418 void setExecutedAnyResult( bool executedAnyResult );
419
425 void setResults( const QVariantMap &results );
426
430 void setInfo( const QString &message, bool isError = false, bool escapeHtml = true, bool isWarning = false );
431
435 void resetGui();
436
441 virtual void resetAdditionalGui();
442
446 void updateRunButtonVisibility();
447
452 void blockControlsWhileRunning();
453
458 virtual void blockAdditionalControlsWhileRunning();
459
464 void setCurrentTask( QgsProcessingAlgRunnerTask *task SIP_TRANSFER );
465
470 static QString formatStringForLog( const QString &string );
471
477 virtual bool isFinalized();
478
486 void applyContextOverrides( QgsProcessingContext *context );
487
488 signals:
489
497 void algorithmAboutToRun( QgsProcessingContext *context );
498
504 void algorithmFinished( bool successful, const QVariantMap &result );
505
512 SIP_SKIP void cancelRequested();
513
514 protected slots:
515
519 virtual void finished( bool successful, const QVariantMap &result, QgsProcessingContext &context, QgsProcessingFeedback *feedback );
520
524 virtual void runAlgorithm();
525
531 virtual void algExecuted( bool successful, const QVariantMap &results );
532
533 private slots:
534
535 void openHelp();
536 void toggleCollapsed();
537
538 void splitterChanged( int pos, int index );
539 void mTabWidget_currentChanged( int index );
540 void linkClicked( const QUrl &url );
541 void taskTriggered( QgsTask *task );
542 void closeClicked();
543 void urlClicked( const QUrl &url );
544
545 private:
552 void disconnectCurrentTask();
553
554 QgsDockableWidgetHelper *mDockableWidgetHelper = nullptr;
555
556 WidgetMode mMode = WidgetMode::Single;
557
558 QPushButton *mButtonRun = nullptr;
559 QPushButton *mButtonClose = nullptr;
560 QPushButton *mButtonChangeParameters = nullptr;
561 QByteArray mSplitterState;
562 QToolButton *mButtonCollapse = nullptr;
563 QgsMessageBar *mMessageBar = nullptr;
564 QPushButton *mAdvancedButton = nullptr;
565 QMenu *mAdvancedMenu = nullptr;
566 QAction *mCopyAsQgisProcessCommand = nullptr;
567 QAction *mPasteJsonAction = nullptr;
568 QAction *mContextSettingsAction = nullptr;
569
570 bool mExecuted = false;
571 bool mExecutedAnyResult = false;
572 QVariantMap mResults;
573 QgsPanelWidget *mMainWidget = nullptr;
574 QgsProcessingFeedbackGenerator *mFeedbackFactory = nullptr;
575 std::unique_ptr<QgsProcessingAlgorithm> mAlgorithm;
576 QgsProcessingAlgRunnerTask *mAlgorithmTask = nullptr;
577
578 bool mHelpCollapsed = false;
579
580 int mMessageLoggedCount = 0;
581
582 Qgis::ProcessingLogLevel mLogLevel = Qgis::ProcessingLogLevel::DefaultLevel;
583
584 QPointer<QgsProcessingContextOptionsWidget> mContextOptionsWidget;
585 bool mOverrideDefaultContextSettings = false;
586 Qgis::InvalidGeometryCheck mGeometryCheck = Qgis::InvalidGeometryCheck::AbortOnInvalid;
587 Qgis::DistanceUnit mDistanceUnits = Qgis::DistanceUnit::Unknown;
588 Qgis::AreaUnit mAreaUnits = Qgis::AreaUnit::Unknown;
589 QString mTemporaryFolderOverride;
590 int mMaximumThreads = QThread::idealThreadCount();
591
592 QString formatHelp( QgsProcessingAlgorithm *algorithm );
593 void scrollToBottomOfLog();
594 void processEvents();
595};
596
605class GUI_EXPORT QgsProcessingAlgorithmWidget : public QgsProcessingAlgorithmWidgetBase
606{
607 Q_OBJECT
608
609 public:
613 QgsProcessingAlgorithmWidget(
614 QgsProcessingAlgorithm *algorithm SIP_TRANSFER,
615 bool inPlace = false,
616 QMainWindow *parentWindow SIP_TRANSFERTHIS = nullptr,
617 QgsProcessingAlgorithmWidgetBase::WidgetFlags flags = QgsProcessingAlgorithmWidgetBase::WidgetFlags(),
619 );
620
624 bool inPlace() const;
625
626 void setParameters( const QVariantMap &values ) override;
627 QVariantMap createProcessingParameters( QgsProcessingParametersGenerator::Flags flags = QgsProcessingParametersGenerator::Flags() ) override;
628 QgsProcessingContext *processingContext() const override;
629
630 protected:
634 virtual QgsProcessingParametersWidget *createParametersPanel( bool inPlaceMode, QgsVectorLayer *activeLayer, QgsMessageBar *messageBar );
635
639 QgsProcessingParametersWidget *parametersWidget();
640
646 bool handleValidationResults( const QList< QgsProcessingParametersGenerator::ParameterValidationResult > &results );
647
648 private:
652 void flagInvalidParameterValue( const QString &message, QWidget *widget );
653
657 void flagInvalidOutputExtension( const QString &message, QWidget *widget );
658
659 mutable std::unique_ptr< QgsProcessingContext > mContext;
660 mutable std::unique_ptr< QgsProcessingFeedback > mFeedback;
661
662 bool mInPlace = false;
663 QList< QWidget * > mWidgetsToResetPalette;
664};
665
666#ifndef SIP_RUN
667
673class QgsProcessingAlgorithmProgressDialog : public QDialog, private Ui::QgsProcessingProgressDialogBase
674{
675 Q_OBJECT
676
677 public:
681 QgsProcessingAlgorithmProgressDialog( QWidget *parent = nullptr );
682
686 QProgressBar *progressBar();
687
691 QPushButton *cancelButton();
692
696 QTextEdit *logTextEdit();
697
698 public slots:
699
700 void reject() override;
701};
702
709class GUI_EXPORT QgsProcessingContextOptionsWidget : public QgsPanelWidget, private Ui::QgsProcessingContextOptionsBase
710{
711 Q_OBJECT
712
713 public:
717 QgsProcessingContextOptionsWidget( QWidget *parent SIP_TRANSFERTHIS = nullptr );
718
722 void setFromContext( const QgsProcessingContext *context );
723
727 Qgis::InvalidGeometryCheck invalidGeometryCheck() const;
728
732 Qgis::DistanceUnit distanceUnit() const;
733
737 Qgis::AreaUnit areaUnit() const;
738
742 QString temporaryFolder();
743
747 int maximumThreads() const;
748
754 void setLogLevel( Qgis::ProcessingLogLevel level );
755
761 Qgis::ProcessingLogLevel logLevel() const;
762};
763
764Q_DECLARE_OPERATORS_FOR_FLAGS( QgsProcessingAlgorithmWidgetBase::WidgetFlags )
765
766#endif
767
769
770#endif // QGSPROCESSINGALGORITHMWIDGETBASE_H
DistanceUnit
Units of distance.
Definition qgis.h:5568
AreaUnit
Units of area.
Definition qgis.h:5645
InvalidGeometryCheck
Methods for handling of features with invalid geometries.
Definition qgis.h:2423
DockableWidgetInitialState
Dockable widget initial states.
Definition qgis.h:7103
@ RestorePreviousState
Restore the previous state of this dock.
Definition qgis.h:7104
ProcessingLogLevel
Logging level for algorithms to use when pushing feedback messages.
Definition qgis.h:3895
A bar for displaying non-blocking messages to the user.
QgsTask task which runs a QgsProcessingAlgorithm in a background task.
Abstract base class for processing algorithms.
An interface for objects which can create Processing contexts.
An interface for objects which can create sets of parameter values for processing algorithms.
Abstract base class for long running background tasks.
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_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_TRANSFER
Definition qgis_sip.h:35
#define SIP_FACTORY
Definition qgis_sip.h:83
Q_DECLARE_OPERATORS_FOR_FLAGS(QgsProjectionSelectionWidget::CrsOptions)